私は初心者です。私はインデックスがパフォーマンスの向上に必要であることを知っていますが、私は彼らが実際に舞台裏でどのように働いているか知りたいです。事前に、私たちはインデックスはどのように背後で動作します
SELECT * from MARKS where marks_obtained > 50
はこのの主キーにクラスタ化インデックスがあることを考慮して、句たとえば
(私が実現間違っている)ここに含まれているこれらの列に索引を作成する必要があることだと思うために使用しましたテーブルと私はにnon-clusteredインデックスを作成しました。カラムが私のwhere句にあります。
私の認識:だからリーフノードは、クラスタ化インデックスへのポインタを含み、実際の行に、クラスタ化インデックスポイントとしてされますが、それは(原因私のクエリでastericに)
シナリオ
を行全体を選択します
クエリ
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は索引に追加されるまでの犯人に見えました。 しかし、どのように???
一時テーブルに挿入していますので、実際に**書き込み**操作に時間がかかります。私は、すべての操作が「空気中で」実行されず、それぞれが結果をもたらすと言いたいと思います。最近の関連キャッシュの内容(DBCC DROPCLEANBUFFERS後にどれくらいの時間がかかるでしょうか)のために、以前の操作では数時間かかることがありました。以前の操作で3.2M行がtempdbに書き込まれました。 17dbがtempdbのファイルを拡大する可能性があります。列の挿入後に何ページ分割が起こったのですか?その後、クラスタード・インデックスを再作成(デフラグ)しましたか? –
これは、 "どのようにインデックスがselect"で動作するかだけではありません。実行したすべてのアクションは効果がありました。選択効果、挿入、列作成、および別の選択入力があります。そして、なぜあなたが 'MARKS'テーブルについて話を始めたのか、私はかなり理解していませんが、他の2つのテーブルでテストを実行しました。 –
上記のクエリを実行する前にDBCCDROPCLEANBUFFERSを実行しました。はい。新しい挿入列の後にCluseredインデックスが再作成されました(CustomerId列を含む)。 – Sadiq