5

我的 SQL Server 数据库中有一个地址数据表。该表未标准化,因此它包含许多重复的地址。每个唯一地址都可以通过一个 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

4 回答 4

1

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

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

取自 MSDN

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

于 2010-08-17T11:28:30.077 回答
1

SQL ServerGROUP 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
)
于 2010-08-17T11:30:44.633 回答
0

问题是分组依据中的列数。

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

于 2010-08-17T14:32:38.077 回答
0

可以将它放在 2 列上:

CREATE UNIQUE CLUSTERED INDEX [ix_clustered] ON [dbo].[AV] 
(
    [AddressId] ASC, 
    [CityId] ASC, 
)
于 2012-01-05T03:02:56.880 回答