Gif*_*guy 5 sql t-sql sql-server indexing aggregate-functions
我正在使用Microsoft SQL Azure v12.0中托管的数据库
我正在使用索引顾问来帮助确定索引真正有用的地方,而不会过度索引我的数据库.
我GROUP BY遇到的情况是索引视图确实有助于在每次有人运行查询时消除对大量数据的需求.
在尝试为我的一个表格制作索引视图时,我遇到了一个令人费解的错误.
这是我的数据库中非常常见的情况,所以我想知道是否有一个全面的通用解决方案,我可以在任何需要的地方重新使用.
我收到的错误如下:
消息10126,级别16,状态1,行12
无法在视图"Database.dbo.vwCountDistinctExampleIX"上创建索引,因为它使用COUNT_BIG带有DISTINCT关键字的聚合" " .
...
考虑使用aGROUP BY或COUNT_BIG(*)视图来模拟DISTINCT分组列.
当我需要COUNT_BIG ( DISTINCT {expression} )在索引视图中显然不允许时出现问题.
错误消息似乎暗示您可以模拟COUNT DISTINCT行为并在不使用的情况下获得相同的结果DISTINCT,这将非常好,因为它将允许我索引该列并再次帮助消除GROUP BY常见查询中的另一种类型的昂贵子句(因为执行计划可以只引用索引而不是反复重组表数据.
我真的不明白COUNT_BIG ( * )在这种情况下是如何工作的,所以我不明白错误信息试图建议的内容.
有没有一种方法可以在不使用的情况下获得此聚合值,DISTINCT同时仍然可以索引聚合列?
CREATE VIEW [vwCountDistinctExampleIX] WITH SCHEMABINDING AS SELECT
[T1].[ID] ,
COUNT_BIG ( DISTINCT [T2].[Field2] ) AS [DistinctTotal] ,
COUNT_BIG ( * ) AS [CountStar]
FROM [dbo].[Table1] [T1]
JOIN [dbo].[Table2] [T2] ON [T2].[Field1] = [T1].[ID]
GROUP BY [T1].[ID]
GO
CREATE UNIQUE CLUSTERED INDEX [PK vwCountDistinctExampleIX ID] -- Error here
ON [vwCountDistinctExampleIX] ( [ID] )
CREATE INDEX [IX vwCountDistinctExampleIX DistinctTotal]
ON [vwCountDistinctExampleIX] ( [DistinctTotal] )
GO
Run Code Online (Sandbox Code Playgroud)
我认为您无法直接在索引视图中实现您想要的目标。但是,如果 Table2 中的行数很大,但 Field2 中的不同值的数量不是很大,则以下方法可能会有所帮助:
CREATE TABLE Table1 (ID INT PRIMARY KEY)
CREATE TABLE Table2 (Field1 INT NOT NULL REFERENCES Table1, Field2 INT NOT NULL)
INSERT INTO Table1 VALUES (1),(2),(3)
INSERT INTO Table2 VALUES (1,10),(1,20),(1,20),(2,30)
GO
CREATE VIEW dbo.IndexedView1
WITH SCHEMABINDING AS
SELECT ID, Field2, COUNT_BIG(*) AS Cnt
FROM dbo.Table1 T1
INNER JOIN dbo.Table2 T2 ON T1.ID = T2.Field1
GROUP BY ID, Field2
GO
CREATE UNIQUE CLUSTERED INDEX PK_IndexedView1 ON IndexedView1 (ID, Field2)
GO
CREATE VIEW SimpleView2
AS
SELECT ID, COUNT_BIG(*) AS DistinctTotal, SUM(Cnt) AS CountStar
FROM dbo.IndexedView1 X
GROUP BY ID
Run Code Online (Sandbox Code Playgroud)