我的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取出列,我可以添加索引
干杯
答案 0 :(得分:1)
您可以在索引视图中使用GROUP BY
,只要:
如果指定了GROUP BY,则视图选择列表必须包含COUNT_BIG(*)表达式,并且视图定义不能指定HAVING,ROLLUP,CUBE或GROUPING SETS。
包含但只是忽略必要的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,
)