2016-03-19 7 views
2

私は初心者です。私はインデックスがパフォーマンスの向上に必要であることを知っていますが、私は彼らが実際に舞台裏でどのように働いているか知りたいです。事前に、私たちはインデックスはどのように背後で動作します

SELECT * from MARKS where marks_obtained > 50はこのの主キーにクラスタ化インデックスがあることを考慮して、句たとえば

(私が実現間違っている)ここに含まれているこれらの列に索引を作成する必要があることだと思うために使用しましたテーブルと私はにnon-clusteredインデックスを作成しました。カラムが私のwhere句にあります。

私の認識:だからリーフノードは、クラスタ化インデックスへのポインタを含み、実際の行に、クラスタ化インデックスポイントとしてされますが、それは(原因私のクエリでastericに)

シナリオ
を行全体を選択します

:私は正常に動作し、新しい列がそれに挿入されるまで 3200000行を実行するために以下 を取った(非クラスタ化インデックスが作成されたのAdventureWorks DBから)次のクエリに出くわした

クエリ

SELECT x.* 
INTO#X 
FROM dbo.bigProduct AS p 
CROSS APPLY 
(
SELECT TOP 1000 * 
FROM dbo.bigTransactionHistory AS bth 
WHERE 
    bth.ProductId = p.bth.ProductId 
ORDER BY 
    TransactionDate DESC 
) AS x 
WHERE 
    p.ProductId BETWEEN 1000 AND 7500 
GO 

NEW INSERTEDのCOLUMNそれは17秒を取った上で、列を挿入した後

ALTER TABLE dbo.bigTransactionHistory 
ADD CustomerId INT NULL 

! 17倍遅いことを意味します。非クラスタリングされた索引では、索引のCustomerId列が欠落していました。 CustomerIdを含めた直後に、問題はなくなりました。

質問カスタマーIDは索引に追加されるまでの犯人に見えました。 しかし、どのように???

+0

一時テーブルに挿入していますので、実際に**書き込み**操作に時間がかかります。私は、すべての操作が「空気中で」実行されず、それぞれが結果をもたらすと言いたいと思います。最近の関連キャッシュの内容(DBCC DROPCLEANBUFFERS後にどれくらいの時間がかかるでしょうか)のために、以前の操作では数時間かかることがありました。以前の操作で3.2M行がtempdbに書き込まれました。 17dbがtempdbのファイルを拡大する可能性があります。列の挿入後に何ページ分割が起こったのですか?その後、クラスタード・インデックスを再作成(デフラグ)しましたか? –

+0

これは、 "どのようにインデックスがselect"で動作するかだけではありません。実行したすべてのアクションは効果がありました。選択効果、挿入、列作成、および別の選択入力があります。そして、なぜあなたが 'MARKS'テーブルについて話を始めたのか、私はかなり理解していませんが、他の2つのテーブルでテストを実行しました。 –

+0

上記のクエリを実行する前にDBCCDROPCLEANBUFFERSを実行しました。はい。新しい挿入列の後にCluseredインデックスが再作成されました(CustomerId列を含む)。 – Sadiq

答えて

0

実行計画はこれに答えますが、私は推測します:非クラスタ化インデックスは、追加の列が追加された後もクエリを満たすのに十分ではありませんでした。これにより、索引がもう使用されなくなる可能性があります。また、1つの行ごとに1つのクラスタード・インデックスをシークさせることもできます。

実行計画を読むことを学びます。テストする各クエリに対して、「実際の実行計画」機能を定期的にオンにします。

関連する問題