5

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

4 に答える 4

1

GROUP BY次の場合に限り、インデックス付きビューで使用できます。

GROUP BYを指定する場合、ビュー選択リストにはCOUNT_BIG(*)式が含まれている必要があり、ビュー定義でHAVING、ROLLUP、CUBE、またはGROUPINGSETSを指定することはできません。

MSDNから取得

必要なCOUNT_BIG(*)列を含めますが、無視してください。

于 2010-08-17T11:28:30.077 に答える
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
)
于 2010-08-17T11:30:44.633 に答える
0

2列に配置することは可能です:

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

問題は、group by の列数です。

私は実際にグループ化しようとしている 11 の列を持っています。これらの列の 1 つを取り除くと、すべて正常に動作します。

于 2010-08-17T14:32:38.077 に答える