2016-05-26 6 views
1

id、fieldName、fieldValueの3つのカラムを持つテーブルがあります。この表には多くのレコードがあります。我々はすぐに別個のフィールド名のリストにアクセスしたいと思う。
クラスタ化されたインデックスを持つビューを作成すると、これが発生しますが、別の問題があります。つまり、idカラムでテーブルから削除するプロセスが多数あります。インデックスの更新を試みているため、複数の削除が同時に実行された場合、デッドロックが発生します。
インデックスを持たないビューを作成した場合、デッドロックは発生しませんが、ビューの使用は非常に遅くなります。 すばやく動作し、削除時にロックされないビューを作成する方法はありますか(または別のフィールド名を取得する方法)はありますか?ロックされていないSQLビュー

質問にデータを追加して、提供された提案の一部に答えてください:
新しいfieldNamesを追加することはめったにありません。既存のfieldNamesを削除することはまれです。ほとんどすべての新しいレコードは、既存のfieldNamesを使用します。
フィールド名はほとんど異なりませんが(約30)、テーブルには何億ものレコードがあります。
テーブルのfieldNameにインデックスがありますが、インデックスが作成されていない場合は、個別のfieldNamesのリストを取得するのが非常に遅いです。

+0

は、なぜあなたは、ビューが必要なのですか?選択したプロシージャやストアドプロシージャを実行できませんか? –

+0

インデックス付きビューを設計する際のガイドラインの[インデックス付きビューは、基になるデータが頻繁に更新されない場合に最適です](https://technet.microsoft.com/en-us/library/ms187864%28v=sql.105%29.aspx) 。ですから、私はそれを簡単なビューに切り替えることを検討しなければならないかもしれません。 – shadow

答えて

2

ビューは必要ありません。 Paul Whiteは、Performance Tuning the Whole Query Planですぐに明確な値を見つける方法についてブログを書いています。

彼は再帰的なCTEを使用して、次の別の値を探します。基本的に、1つのイテレーション/値ごとに1つのシークを行い、インデックスをジャンプします。これはいくつかの異なる値ではより高速になりますが、テーブル内の行数と比較して異なる値の数があるほど、スキャンが高速になるような転倒点があります。

あなたの場合は、このようになります。

セットアップ:

create table dbo.YourTable 
(
    id int identity primary key, 
    fieldName varchar(20) not null, 
    fieldValue varchar(20) null 
); 

go 

create index IX_YourTable_fieldName on dbo.YourTable(fieldName); 

go 

insert into dbo.YourTable(fieldName) values 
('F1'), 
('F1'), 
('F1'), 
('F2'), 
('F2'), 
('F2'), 
('F3'); 

問合せ:

with C as 
(
    select top (1) T.fieldName 
    from dbo.YourTable as T 
    order by T.fieldName 
    union all 
    select R.fieldName 
    from (
     select T.fieldName, 
       row_number() over (order by T.fieldName) as rn 
     from dbo.YourTable as T 
     inner join C 
      on C.fieldName < T.fieldName 
     ) as R 
    where R.rn = 1 
) 
select C.fieldName 
from C 
option (maxrecursion 0); 

クエリ実行計画:

enter image description here

+0

本当にうまく動作します。これをビューに組み込む方法はありますか?これにより、アプリケーションコードを変更せずにこの変更を行うことができます。 –

+0

自分自身で答えを見つけました。私は、このコードをテーブル関数に入れて、そこからビューを選択します。 –

0

fieldNames列に余分なインデックスを作成しないのはなぜですか?ビューは必要ありません。

関連する問題