SQL Server创建视图索引包含不同或组

问题描述:

我有我的SQL服务器数据库中的地址数据表。这个表格没有被标准化,因此它包含许多重复的地址。每个唯一的地址可以通过Id字段来识别(这些ID在表格中经常重复)。SQL Server创建视图索引包含不同或组

所以我创建了一个视图在表中提取所有的唯一地址,使用从原始表中选择独特(AddressId)。

现在我想在这个视图上创建一个索引来增加搜索的速度,但SQL服务器不允许我在视图上创建一个索引,因为它包含一个独特的或分组的(我已经尝试过看看它是否会允许我创建索引)

有没有人有任何解决方案?或任何意见,以另一种方式来做到这一点。

我需要根据地址关键字查询这个视图,并返回基于匹配计数的视图,我有这个查询到位,我试图通过索引视图中的字段来加速它。

SQL Server 2008中

SELECT  
    AddressId, 
    AddressNumber, 
    AddressName, 
    Town, 
     City, 
     Country, 
    COUNT_BIG(*) As AddCount--, 
    --TRIM(AddressNumber + ' ') + LTRIM(AddressName + ' ') + LTRIM(Town + ' ') + RTRIM(City + ' ') AS AddressLookup 
FROM 
    [Address] A 
GROUP BY 
    AddressId, 
    AddressNumber, 
    AddressName, 
    Town, 
    City, 
    Country 

是我的查询....

,如果我拿出柱AddressLookup我可以添加索引

干杯

+2

SQL Server不会允许'GROUP BY”索引视图。你在什么版本上? – 2010-08-17 11:25:31

您可以使用GROUP BY在索引视图中只要:

如果指定了GROUP BY,则视图选择列表必须包含COUNT_BIG(*)表达式,并且视图定义不能指定HAVING,ROLLUP,CUBE或GROUPING SETS。

Taken from MSDN

包括但恰恰忽略了必要的COUNT_BIG(*)列。

+0

当我使用group by和count_big(*) 如果在试图在视图上创建索引时出现以下错误: 无法在视图'AddressLookup'上创建聚簇索引'Idx_AddressId',因为视图的选择列表包含聚合函数或分组列的结果上的表达式。考虑从选择列表中删除聚合函数或分组列的结果上的表达式。 – BBurke 2010-08-17 11:58:38

+0

您必须使用'COUNT_BIG'之外的其他聚合函数。您将无法使用AVG,MAX,MIN,STDEV,STDEVP,VAR或VARP聚合函数。请参阅我链接到的文档以获取完整详细信息。 – 2010-08-17 12:13:42

+0

嗨丹尼尔我没有其他聚合在视图中...正如你可以在帖子中看到它,当我连接列到一个导致我的问题 – BBurke 2010-08-17 13:28:42

SQL Server的确在索引视图中允许GROUP BY甚至可以追溯到[SQL2000] [1]您确定没有查看可更新视图的限制吗?

继您的编辑。作为一个计算列推送连接到表中

CREATE TABLE [Address] 
(
    AddressId INT , 
    AddressNumber INT, 
    AddressName VARCHAR(50), 
    Town VARCHAR(50), 
    City VARCHAR(50), 
    Country VARCHAR(50), 
    AddressLookup AS LTRIM(AddressNumber + ' ') + LTRIM(AddressName + ' ') + LTRIM(Town + ' ') + RTRIM(City + ' ') 
) 
GO 

CREATE VIEW AV WITH SCHEMABINDING 
AS 
SELECT  
    AddressId, 
    AddressNumber, 
    AddressName, 
    Town, 
     City, 
     Country, 
    COUNT_BIG(*) As AddCount, 
    AddressLookup 
FROM 
    dbo.[Address] 
GROUP BY 
    AddressId, 
    AddressNumber, 
    AddressName, 
    Town, 
    City, 
    Country, 
    AddressLookup 

    go 

CREATE UNIQUE CLUSTERED INDEX [ix_clustered] ON [dbo].[AV] 
(
    [AddressId] ASC 
) 
+0

我试图创建索引时,我得到错误我的意见有一个独特的或分组。 无法在视图'AddressLookup'上创建聚簇索引'Idx_AddressId',因为视图的选择列表包含聚合函数或分组列的结果上的表达式。考虑从选择列表中删除聚合函数或分组列的结果上的表达式。 – BBurke 2010-08-17 11:59:49

+0

@Cypher - 你能发布你的视图定义吗?我认为它可能只是需要稍微调整。 – 2010-08-17 12:09:07

+0

查询如上,其中我将地址列附加在一起,防止索引被添加 – BBurke 2010-08-17 12:24:58

问题是组中的列数。

我实际上有11列im试图组合,如果我拿走这些列之一,然后一切工作正常。

它可能有它的2列:

CREATE UNIQUE CLUSTERED INDEX [ix_clustered] ON [dbo].[AV] 
(
    [AddressId] ASC, 
    [CityId] ASC, 
)