2017-08-11 157 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一个聚集索引和覆盖索引如果没有唯一字段或字段组合,您可以将标识列添加到类型。