【发布时间】:2013-11-27 11:33:18
【问题描述】:
我有一个需要容纳超过 400 万行的电子邮件调度表。一个特定的报告也需要参考这个表格来产生一些统计数据,而且它需要的时间比我想运行的要长(目前大约 30 秒)。
我检查了估计的执行计划,这表明 94% 的成本是由单个谓词产生的(如果我解释正确的话)。
请注意,以下示例显示了小 sn-ps 以保持简短。针对其他查询的其他索引已经到位。
谓词:
[EmsDb].[dbo].[MailDispatchPending].[MailCampaignId]=[@MailCampaignId] OR [@MailCampaignId] IS NULL
我相信这指向以下 SQL:
WHERE @MailCampaignId IS NULL OR MailCampaignId = @MailCampaignId -- Restrict to mail campaign where parameter passed
我试图通过测试以下索引来提高性能。既不影响执行计划输出,也不提高查询速度。
/****** Object: Index [IX_MailCampaignId] Script Date: 11/27/2013 11:21:00 ******/
CREATE NONCLUSTERED INDEX [IX_MailCampaignId] ON [dbo].[MailDispatchPending]
(
[MailCampaignId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO
/****** Object: Index [IX_MailCampaignId] Script Date: 11/27/2013 11:21:00 ******/
CREATE NONCLUSTERED INDEX [IX_MailCampaignId] ON [dbo].[MailDispatchPending]
(
[Id] ASC,
[MailCampaignId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO
谁能建议一种更好的索引类型或不同的策略来帮助我提高性能?
【问题讨论】:
标签: sql sql-server indexing