2017-08-11 211 views
1

我從數據庫 什麼是提高性能的最佳方式約500萬記錄的存儲過程返回,」提高性能

Create PROCEDURE [dbo].[GetPhoneNumbers] 
     @SendersList SendersIdList ReadOnly , 
     @MessageList MessageIdList ReadOnly, 
     @ClientList ClientsIdList ReadOnly AS   
    select distinct PH.PhoneNumber from XMLImported xmi 
    inner join @MessageList MessageIdList on xmi.MessageId = MessageIdList.ID 
      inner join @SendersList SendersIdList on xmi.SenderId = SendersIdList.ID 
      inner join @ClientList ClientsIdList on xmi.ClientId = ClientsIdList.ID 
inner join Phones PH on PH.Id = xmi.PhoneId 

我使用用戶定義的數據類型爲每變量,並使用內部聯接的條款insted的,以提高性能,性能略有增加,但仍不能按要求,

我加入指數也爲場

PS。

SendersIdList,MessageIdList,ClientsIdList所有這些是用戶定義的 表類型有一個字段ID,

XMLImported包含約50萬人次的紀錄

任何建議爲解決我的問題?

編輯附加執行計劃 enter image description here

+0

你看過執行計劃嗎?有沒有可執行的掃描? – Dom84

+0

請添加一個執行計劃,並可能描述您使用的類型。沒有額外的信息,我們不可能提出有用的建議,完全基於您提供的內容。 – SchmitzIT

+3

我的第一個直覺是「不要返回500萬條記錄」 - 如果某個自動化流程正在使用這些記錄,請找到某種方式爲其提供增量更新而不是整個列表。如果這是由人類消耗的,那麼這是錯誤的設計,因爲沒有人會查看500萬條記錄的清單。 –

回答

0

你應該確保您要加入的字段進行索引,(例如主鍵或唯一約束)。在你的情況是Phones.ID,和XMLImportedClientID,MessageId,SenderID,PhoneID。在感興趣的領域上的覆蓋索引應該這樣做:

ALTER TABLE XMLImported 
ADD CONSTRAINT UQ_XmlImported_MSCP UNIQUE (MessageID, SenderID, ClientID, PhoneID) 

如果該組合不是唯一的,則將主鍵添加到列表中。

您可以通過添加主鍵或唯一約束將索引添加到用戶定義的表類型。

如果您已經有一個獨特的字段或字段組合,您可以使用它。

例如:

Create type SendersIDList as Table(
    ID bigint PRIMARY KEY 
) 

又如:

Create Type TableType as Table(
    keyField1 varchar(10), 
    keyField2 varchar(20), 
    nonKeyField varchar(20), 
    Primary Key (keyField1, KeyField2), 
    Unique (nonKeyField, KeyField1, keyField2) 
) 

這將創建nonKeyField, keyfield1, keyField2

keyField1, keyField2一個聚集索引和覆蓋索引如果沒有唯一字段或字段組合,您可以將標識列添加到類型。