SQL Server创建视图索引,其中包含distinct或group by

时间:2010-08-17 11:23:04

标签: sql-server sql-server-2008 indexed-view

我的SQL服务器数据库中有一个地址数据表。此表未规范化,因此它包含许多重复的地址。每个唯一的地址都可以通过Id字段识别(这些ID经常在表格中重复)。

所以我在表上创建了一个视图,使用原始表中的Select Distinct(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取出列,我可以添加索引

干杯

4 个答案:

答案 0 :(得分:1)

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

  

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

Taken from MSDN

包含但只是忽略必要的COUNT_BIG(*)列。

答案 1 :(得分:1)

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
)

答案 2 :(得分:0)

问题是组中的列数。

我实际上有11列试图分组,如果我拿走其中一列,那么一切正常。

答案 3 :(得分:0)

可以将它放在2列上:

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