我们有一个数据仓库,它的记录数很大(10-20百万行),并且经常运行查询来对某些日期之间的记录进行计数,或者对带有某些标志的记录进行计数,例如
SELECT
f.IsFoo,
COUNT(*) AS WidgetCount
FROM Widgets AS w
JOIN Flags AS f
ON f.FlagId = w.FlagId
WHERE w.Date >= @startDate
GROUP BY f.IsFoo
性能并不是很糟糕,但可能会相对缓慢(在冷缓存中可能为10秒)。
最近,我发现我可以GROUP BY
在索引视图中使用,因此尝试了类似于以下内容的操作
CREATE VIEW TestView
WITH SCHEMABINDING
AS
SELECT
Date,
FlagId,
COUNT_BIG(*) AS WidgetCount
FROM Widgets
GROUP BY Date, FlagId;
GO
CREATE UNIQUE CLUSTERED INDEX PK_TestView ON TestView
(
Date,
FlagId
);
结果,我的第一个查询的性能现在为<100ms,结果视图和索引为<100k(尽管我们的行数很大,但日期和标志ID的范围意味着该视图仅包含1000-2000行)。
我以为这可能会削弱对Widget表的写入性能,但是不会-就我所知,对该表的插入和更新性能几乎不受影响(此外,作为数据仓库,该表很少更新无论如何)
对我来说,这似乎太不可思议了-是吗?以这种方式使用索引视图时,我需要注意什么?
SELECT
和CREATE VIEW
脚本是错误的,因为我认为您的脚本是错误的CREATE INDEX
。