11

SQL Fiddle: http://sqlfiddle.com/#!6/d4496/1 (データは実験用に事前に生成されています)

明らかな表があります:

CREATE TABLE Entity 
(
  ID int,
  Classificator1ID int,
  Classificator2ID int,
  Classificator3ID int,
  Classificator4ID int,
  Classificator5ID int
);

とビュー:

CREATE VIEW dbo.EntityView (ID, Code1, Code2, Code3, Code4, Code5) 
WITH SCHEMABINDING

ここで、エンティティ フィールド Classificator1ID..Classificator5ID は分類値 Code1..Code5 に解決されます

このビューには多くのインデックスがあります。

CREATE UNIQUE CLUSTERED INDEX [IXUC_EntityView$ID] ON EntityView
  ([ID]);
CREATE UNIQUE NONCLUSTERED  INDEX [IXU_EntityView$ID$include$ALL] ON EntityView
  ([ID]) INCLUDE (Code1, Code2, Code3, Code4,  Code5);
CREATE UNIQUE NONCLUSTERED  INDEX [IXU_EntityView$ALL] ON EntityView
  ([ID],Code1, Code2, Code3, Code4,  Code5);  
CREATE UNIQUE NONCLUSTERED  INDEX [IXU_EntityView$ID$Code1] ON EntityView
  ([ID],Code1);
CREATE UNIQUE NONCLUSTERED  INDEX [IXU_EntityView$ID$include$Code1] ON EntityView
  ([ID])INCLUDE (Code1);
CREATE NONCLUSTERED  INDEX [IX_EntityView$Code1] ON EntityView
  (Code1);
CREATE NONCLUSTERED  INDEX [IX_EntityView$Code1$include$ID] ON EntityView
  (Code1) INCLUDE (ID);

しかし、QO はそれらを使用しないでください。これを試して:

SELECT * FROM EntityView;

SELECT ID, Code1 FROM EntityView;

SELECT ID, Code1, Code2, Code3, Code4, Code5 FROM EntityView;

SELECT ID, Code1, Code2, Code3, Code4, Code5 FROM EntityView WHERE ID=1;

SELECT ID, Code1 FROM EntityView Where Code1 like 'NR%';

なんで?特に「インクルード」インデックスの何が問題なのですか? インデックスが作成され、すべてのフィールドがあり、まだ使用されていません...

追加: これはただのテストです! あまり怒らないでください。インデックスのメンテナンスの問題を分析するよう私に強要しないでください。

私の実際のプロジェクトでは、QO がインデックス付きビュー (非常に便利なインデックス付きビュー) を無視する理由を説明できません。しかし、時々私はそれが他の場所でそれらを利用しているのを見ます. インデックス式を試すためにこの db スニペットを作成しましたが、もっと何かを行う必要があるかもしれません。

4

3 に答える 3

4

2012 Developer Edition で実行すると、ヒントなしのクエリはヒント付きのクエリの約 8 倍のコストがかかります

ここに画像の説明を入力

係数 8 は多くのように聞こえるかもしれませんが、サンプル データは非常に小さく、ベース テーブルから直接選択するコストは、0.0267122ビュー0.003293からの推定コストと比較して高くなります。

Paul White は、こちらの回答で、十分に低い計画が最初に見つかった場合、自動インデックス付きビュー マッチングは考慮されないと説明しています。

関連するすべてのテーブルのコストを人為的に引き上げる

UPDATE STATISTICS Classificator1 WITH ROWCOUNT = 60000000, PAGECOUNT = 10000000 
UPDATE STATISTICS Classificator2 WITH ROWCOUNT = 60000000, PAGECOUNT = 10000000 
UPDATE STATISTICS Classificator3 WITH ROWCOUNT = 60000000, PAGECOUNT = 10000000 
UPDATE STATISTICS Classificator4 WITH ROWCOUNT = 60000000, PAGECOUNT = 10000000 
UPDATE STATISTICS Classificator5 WITH ROWCOUNT = 60000000, PAGECOUNT = 10000000 
UPDATE STATISTICS Entity         WITH ROWCOUNT = 60000000, PAGECOUNT = 10000000 

ベース テーブル プランのコストを 29122.6 に引き上げます

明示的に別のヒントを示さない限り、(Enterprise/Developer/Evaluation エディションで) 一致するビューが表示されるはずです。

SELECT * FROM EntityView;

SELECT * FROM EntityView OPTION (EXPAND VIEWS) 

ここに画像の説明を入力

于 2014-02-27T16:47:26.540 に答える
2

SQL Server Enterprise を使用している場合は、WITH (NOExpand) ヒントを使用します

あなたのクエリはSELECT * FROM EntityView with (noexpand)

于 2014-02-27T15:08:49.517 に答える