2010-08-17 71 views
5

我有我的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

回答

1

您可以使用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

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 
) 
+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

0

問題是組中的列數。

我實際上有11列im試圖組合,如果我拿走這些列之一,然後一切工作正常。

0

它可能有它的2列:

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