Tsql 优化选择,区别于大表

Tsql 优化选择,区别于大表,tsql,query-optimization,Tsql,Query Optimization,我有一个表,其中包含3200712条记录,我目前正在编写的报告可以按日期筛选记录,之后记录数下降到145878852条。不同记录的数量为107311357 select count(*) from [BroadcastOpens] with (nolock) where [OpenTimeUtc] >= @StartDate and [OpenTimeUtc] <@EndDate 正如Martin Smith所建议的,我还创建了一个表BroadcastOpen的索引视图,该

我有一个表,其中包含3200712条记录,我目前正在编写的报告可以按日期筛选记录,之后记录数下降到145878852条。不同记录的数量为107311357

select count(*) 
from [BroadcastOpens] with (nolock) 
where [OpenTimeUtc] >= @StartDate 
and  [OpenTimeUtc] <@EndDate
正如Martin Smith所建议的,我还创建了一个表BroadcastOpen的索引视图,该表按[SubscriberId]、[OpenTimeUtc]、[BroadcastId]分组

CREATE VIEW dbo.vwBroadcastOpensRecords
WITH SCHEMABINDING
AS

SELECT [SubscriberId],[OpenTimeUtc],[BroadcastId], COUNT_BIG(*) as tmp    
from [dbo].[BroadcastOpens] group by [SubscriberId],[OpenTimeUtc],   [BroadcastId]  


CREATE UNIQUE CLUSTERED INDEX CIX_vwBroadcastOpensRecords_Temp ON    
vwBroadcastOpensRecords(SubscriberId, OpenTimeUtc,BroadcastId);
这是查询中导致问题的步骤

我现在正在测试这两种方法,看看哪一种能产生更好的性能

1未更改现有tsql查询,未创建非聚集索引。在生产服务器上运行

2不更改现有tsql查询,在表上创建了两个非聚集索引。在临时服务器上运行

3创建索引视图,并修改现有tsql查询以使用此新索引视图替换表

4将以上两个表索引合并为一个,重新运行脚本

只是想知道。表BroadcastOpens表不断更新,这是否会引起我创建的索引视图的问题

关于如何改进此查询的任何建议都是适当的

谢谢哈波和马丁·史密斯的无价帮助


注意:当涉及索引视图时,不要忘记与NOEXPAND一起使用

有两个单独的索引对这个查询没有多大帮助。拥有一个覆盖索引应该可以解决您的问题:

CREATE NONCLUSTERED INDEX [IX_BroadcastOpens_OpenTimeUtc_BroadcastId_Temp] 
ON [dbo].[BroadcastOpens]([OpenTimeUtc], [BroadcastId]);

1删除了所有不同的关键字 2在表上创建非聚集索引以加快搜索速度 3可以创建索引视图,也可以不创建索引视图


结果:时间从42:32分钟减少到38:15分钟。

包含SubscriberId的OpenTimeUtc索引?看,这个表有3200712行。日期过滤器降到145878852。在DISTINCT之后还剩下多少?107161812在DISTINCT之后还剩下一些可能是OpenTimeUtc、SubscriberId上的索引视图。。。按OpenTimeUtc分组,SubscriberId是OpenTimeUtc上的直接选择或索引,SubscriberId可以直接输入流聚合并避免OpenTimeUtc上的排序或索引包括SubscriberId。但是,您需要考虑整个工作负载,而不仅仅是查询。我已经在BultuCtudioTab[2]表上实现了非聚集索引,[BulkCasTID]和[optMeUTc]列。你认为这个新的索引视图会进一步加快进程吗?谢谢MWilemse,非常感谢您的评论。我也尝试过,不幸的是它没有提供更好的性能。但是,是的,我应该将这两个索引合并为一个。您有包含所有[BroadcastId]和/或[OpenTimeUtc]的表吗。[OpenTimeUtc]是什么样子的,它是一个日期、时间还是日期时间,是否可以填充时间的分钟和秒部分?您好,MWilemse,非常感谢您的评论,该表称为BroadcastOpens。OpenTimeUtc同时具有日期和时间值。表中已填充了3200712条记录。
CREATE VIEW dbo.vwBroadcastOpensRecords
WITH SCHEMABINDING
AS

SELECT [SubscriberId],[OpenTimeUtc],[BroadcastId], COUNT_BIG(*) as tmp    
from [dbo].[BroadcastOpens] group by [SubscriberId],[OpenTimeUtc],   [BroadcastId]  


CREATE UNIQUE CLUSTERED INDEX CIX_vwBroadcastOpensRecords_Temp ON    
vwBroadcastOpensRecords(SubscriberId, OpenTimeUtc,BroadcastId);
CREATE NONCLUSTERED INDEX [IX_BroadcastOpens_BroadcastId_Temp] ON [smpro5].[dbo].[BroadcastOpens]([BroadcastId])
GO

CREATE NONCLUSTERED INDEX [IX_BroadcastOpens_OpenTimeUtc_Temp] ON [smpro5].[dbo].[BroadcastOpens]([OpenTimeUtc])
GO

DROP INDEX IX_BroadcastOpens_BroadcastId_Temp ON [smpro5].[dbo].[BroadcastOpens]
GO

DROP INDEX IX_BroadcastOpens_OpenTimeUtc_Temp ON [smpro5].[dbo].[BroadcastOpens]
GO

CREATE NONCLUSTERED INDEX [IX_BroadcastOpens_OpenTimeUtc_BroadcastId_Temp] ON [dbo].[BroadcastOpens]([OpenTimeUtc], [BroadcastId]);
GO
CREATE NONCLUSTERED INDEX [IX_BroadcastOpens_OpenTimeUtc_BroadcastId_Temp] 
ON [dbo].[BroadcastOpens]([OpenTimeUtc], [BroadcastId]);