CREATE TABLE test2 (
id INTEGER,
name VARCHAR(10),
family VARCHAR(10),
amount INTEGER)
CREATE VIEW dbo.test2_v WITH SCHEMABINDING
AS
SELECT id, SUM(amount) as amount
-- , COUNT_BIG(*) as tmp
FROM dbo.test2
GROUP BY id
CREATE UNIQUE CLUSTERED INDEX vIdx ON test2_v(id)
Run Code Online (Sandbox Code Playgroud)
我有这个代码的错误:
无法在视图'test.dbo.test2_v'上创建索引,因为其选择列表未正确使用COUNT_BIG.考虑添加COUNT_BIG(*)以选择列表.
我可以创建这样的视图:
CREATE VIEW dbo.test2_v WITH SCHEMABINDING
AS
SELECT id, SUM(amount) as amount, COUNT_BIG(*) as tmp
FROM dbo.test2
GROUP BY id
Run Code Online (Sandbox Code Playgroud)
但我只是想知道这个专栏的目的是什么?
San*_*ddy 15
在这种情况下,您需要COUNT_BIG,因为您正在使用GROUP BY.
这是索引视图的许多限制之一,并且由于这些限制,索引视图不能在许多地方使用,或者它的使用不如它本来有效.不幸的是,它是如何运作的.糟透了,它缩小了使用范围.
http://technet.microsoft.com/en-us/library/cc917715.aspx
看起来它只是一个硬编码的性能相关限制,SQL Server团队在SQL Server 2000中首次设计聚合索引视图时必须实施这些限制.
直到最近,你可以在http://msdn.microsoft.com/en-us/library/aa902643(SQL.80).aspx上的SQL 2000 technet文档中看到这一点,但是SQL Server 2000文档肯定已经退役了.您仍然可以下载92MB的PDF文件,并在第1146页和第2190页上找到相关说明:https://www.microsoft.com/en-us/download/details.aspx? id = 51958
可以在SQLAuthority网站上找到对此限制的解释 - 实际上是Itzik Ben-Gan的"Inside SQL"一书的摘录:http://blog.sqlauthority.com/2010/09/21/sql-server-count-not -allowed -丁COUNT_BIG-允许-限制的最-视图- 5 /
值得注意的是,Oracle具有相同的限制/要求,原因相同(对于等效的快速可刷新的物化视图); 有关此主题的讨论,请参见http://rwijk.blogspot.com.es/2009/06/fast-refreshable-materialized-view.html.
解释摘要:
COUNT_BIG(*)
?
可视化计算为什么计数对于高效的聚合视图维护至关重要相对容易 - 想象以下情况:
基础表中有4行:
ID | name | family | amount
--- | ---- | ------ | ------
1 | a | | 10
2 | b | | 11
2 | c | | 12
3 | d | | 13
Run Code Online (Sandbox Code Playgroud)聚合视图具体化为:
ID | amount | tmp
--- | ------ | ---
1 | 10 | 1
2 | 23 | 2
3 | 13 | 1
Run Code Online (Sandbox Code Playgroud)由于这些原因,count(*)列的存在是聚合物化视图实现的基本要求.如果没有count(*)列,面对基础数据更改时聚合物化视图的实时维护将带来无法接受的高性能损失!
您仍然可以问:"当我创建聚合物化视图时,为什么SQL Server不会自动为我创建/维护这样的计数列?" - 我没有特别好的答案.最后,我想更多的问题和混淆"如果我没有添加它,为什么我的聚合物化视图有一个BIGCOUNT列?" 如果他们这样做,那么将它作为创建对象的基本要求就更简单了,但这是一种纯粹的主观意见.
归档时间: |
|
查看次数: |
15824 次 |
最近记录: |