クラスタヌ化むンデックスのストヌリヌ

Oracleを䜿甚しおSQL Serverにアップグレヌドした埌は、驚くべきこずがたくさんありたす。 自動トランザクションに慣れるのは困難です-曎新埌、commitを入力する必芁はありたせんこれは玠晎らしいこずですがが、゚ラヌが発生した堎合はrollback単なる悪倢を入力するこずはできたせん。 ゞャヌナルがロヌルバックずロヌリングトランザクションの䞡方に䜿甚されるアヌキテクチャに慣れるのは困難です。 「䜜家は読者をブロックし、読者は䜜家をブロックしたす」ずいう状況に慣れるこずは難しく、慣れるず習慣を砎るこずはさらに難しくなりたす。 そしお、難易床のランキングの最埌の堎所は、クラスタヌ化されたむンデックスの優䜍性によっお挔じられるわけではありたせん。 既定では、テヌブルの䞻キヌはクラスタヌ化むンデックスであるため、ほずんどすべおのテヌブルにクラスタヌ化むンデックスがありたす。



実際、この獣は完党に倧胆䞍敵であり、非垞に䟿利です。 それがなぜ必芁なのか、どうやっお䜿うのかを考えおみたしょう。



ファむル、ペヌゞ、RID



テヌブルのデヌタは物理的にデヌタベヌスファむルに保存されたす。 デヌタベヌスファむルは、ペヌゞペヌゞ-サヌバヌの論理ストレヌゞナニットに分割されたす。 MS SQL Serverのペヌゞのサむズは8キロバむト8192バむトである必芁があり、そのうち8060バむトはデヌタ甚です。 各行に察しお、その物理アドレス、いわゆる行IDRIDを指定できたす。これは、ファむルが配眮されおいるファむル、このファむルのペヌゞの順序、ペヌゞの堎所です。 テヌブル党䜓でペヌゞが割り圓おられたす。1぀のペヌゞには、1぀のテヌブルのデヌタしか存圚できたせん。 さらに、行の読み取り/曞き蟌みが必芁な堎合、サヌバヌはペヌゞ党䜓の読み取り/曞き蟌みを行いたす。これははるかに高速だからです。



Bツリヌむンデックスはどのように配眮されたすか



Bツリヌずは、バランスツリヌ、぀たり「バランスツリヌ」を意味したす。 むンデックスには、怜玢の゚ントリポむントであるルヌトペヌゞが1぀だけ含たれおいたす。 ルヌトペヌゞには、キヌ倀ず、これらのむンデックス倀の次のレベルのペヌゞぞのリンクが含たれおいたす。 むンデックスで怜玢するず、目的の倀を超えない最埌の倀が芋぀かり、察応するペヌゞぞの遷移が発生したす。 ツリヌの最埌のリヌフレベルには、すべおのキヌが䞀芧衚瀺され、各キヌにはテヌブルデヌタぞのリンクブックマヌクが瀺されたす。 リンクロヌルの自然な候補はRIDであり、実際にはヒヌプケヌスに䜿甚されたす。 次の図では、文字Bはテヌブル行ぞのリンクを瀺しおいたす。



画像



テヌブルに゚ントリを远加するずきは、むンデックスにも远加する必芁がありたす。 テヌブル゚ントリを参照する新しいむンデックス゚ントリがリヌフレベルペヌゞに挿入されたす。 このペヌゞに空き領域がないこずが刀明する堎合がありたす。 次に



  1. むンデックスには、リヌフレベルでも新しいペヌゞが割り圓おられたす。
  2. 前のペヌゞのレコヌドの半分は新しいものに転送されたすしたがっお、それらを順番に远加するずきに、次の行のペヌゞを再床遞択しなければならない状況に陥るこずはありたせん。 新しいペヌゞが氎平リンクに埋め蟌たれたす。前の次の代わりに、前の新しい次のリンクが蚭定されたす。
  3. 新しいペヌゞぞのリンクが、察応するキヌずずもに芪ペヌゞに提䟛されたす。 同時に、芪ペヌゞがオヌバヌフロヌする可胜性がありたす-その埌、デヌタ分離のプロセスがより高いレベルで繰り返されたす。 オヌバヌフロヌが最䞊郚に達するず、ルヌトペヌゞが2぀に分割され、新しいルヌトが衚瀺され、ツリヌの高さが1増加したす。




むンデックスの存圚䞋でテヌブルにレコヌドを远加するこずは明らかに費甚のかかるプロセスになるこずは明らかです。各ペヌゞ分割では、少なくずも4ペヌゞ共有、共有、新しい、芪を曎新する必芁がありたす。

同時に、むンデックスの存圚はデヌタ怜玢を劇的に加速したす。連続スキャンの代わりに、ツリヌ内を䞋るバむナリ怜玢を実行できたす。 たた、1レベルのペヌゞぞの氎平リンクが存圚するため、むンデックスキヌの範囲を非垞に迅速に通過するこずができたす。 たた、遞択の䞻なタスクである単䞀倀の怜玢ず範囲のスキャンにスムヌズにアプロヌチしたす。



ヒヌプが小さい



ヒヌプの圢匏で線成されたモデルテヌブルを考えおみたしょう。レコヌドには特定の順序がありたせん。

レコヌドが最初に受信するRIDは、ほずんど垞にそれず共に残りたす。 たれに、ヒヌプ内の゚ントリが別のペヌゞに移動されるこずがありたす。これは、曎新埌、行が占有した堎所に収たらなくなったずきに発生したす。 ただし、この堎合、新しい堎所ぞのリンクは同じ堎所に残りたす。぀たり、远加するずきに文字列が受信したRIDを知っおいれば、文字列は垞に芋぀かりたす。 したがっお、ヒヌプ䞊のむンデックスの堎合、デヌタを参照するための最適な遞択肢はRIDです。



テヌブルに20䞇の゚ントリがあり、各ペヌゞに48〜52の゚ントリが配眮されおいるずしたす。 テヌブルは4000ペヌゞを占有するず仮定したす。 [City]フィヌルドの倀が「Perm」であるすべおのレコヌドを怜玢する必芁があるずしたす。 たた、そのうちの3぀しかないこずも想定しおいたすが、ただわかりたせん。



サヌバヌは、4,000ペヌゞすべおをスキャンする必芁がありたす。 サヌバヌが3぀すべおの゚ントリを怜出した堎合でも、最埌たで行かなければなりたせん。必芁な゚ントリがもうないずいう保蚌はありたせん。 したがっお、芁求を完了するには、4,000の論理ペヌゞ読み取りが必芁です。

そしお、バむナリ怜玢で怜玢できるむンデックス、たずえば高さ3のツリヌがあるずしたすか サヌバヌは、最初のレコヌドのアドレスを芋぀けるために、むンデックスペヌゞを3回読み取る必芁がありたす。 2番目ず3番目のレコヌドのアドレスは、同じペヌゞたたは次のいずれかで暪に䞊んでいたす。むンデックスペヌゞはリンクによっお氎平方向にリンクされおいたす。 ぀たり、最倧4回の読み取り埌、サヌバヌはおそらく3぀すべおのレコヌドのRIDを知っおいたす。 非垞に運が悪い堎合、3぀の゚ントリはすべお異なるペヌゞにありたす。 したがっお、ペヌゞの7回の論理読み取りの埌にむンデックスが存圚する堎合、3぀のレコヌドがすべお芋぀かる可胜性がありたす。 7察4000-印象的。



しかし、レコヌドが少ない堎合はずおも良いでしょう。 そしお、これが「パヌマ」ではなく「モスクワ」であり、必芁な蚘録が3ではなく、2䞇である堎合はどうでしょうか。 これはそれほど倚くはなく、レコヌドの総数の10パヌセントにすぎたせん。 しかし、写真はすぐにそれほどバラ色ではなくなりたした。



3回の読み取りの堎合、サヌバヌは最初のレコヌドを芋぀けたす。 そしお、圌は2侇RIDを読み取り、ペヌゞを2䞇回読み取っお行を取埗する必芁がありたす。サヌバヌは、ペヌゞ党䜓のデヌタのみを読み取るこずを芚えおいたす。 必芁なレコヌドがテヌブル党䜓に散らばっおいるこずが刀明する可胜性がありたす。たた、2䞇件の論理読み取りを確保するには、ディスクからほずんどのペヌゞを読み取る必芁がありたす。 すべおではないにしおも、ただ良い。 4000の論理読み取り倀の代わりに、20,000を取埗したす。



むンデックスは、少数の倀を芋぀けるのに非垞にうたく機胜したすが、倧きな範囲を超えるずうたく機胜したせん。



ク゚リオプティマむザヌはこれをよく認識しおいたす。 したがっお、むンデックス怜玢ではむンデックス怜玢の代わりに十分に倧きな範囲が埗られるず予想する堎合、テヌブル党䜓のスキャンを遞択したす。 ちなみに、これはオプティマむザが正しい統蚈を䜿甚しおいおも間違える可胜性のあるたれな堎所の1぀です。 実際に必芁なデヌタが非垞にコンパクトな堎合たずえば、2䞇回の論理読み取り-ディスクからブロックを60回読み取り、キャッシュ内のブロックを19940回読み取りたす、むンデックスを匷制的に䜿甚するず、メモリず速床が向䞊したす。



しかし、範囲はどうですか



問題は、むンデックス怜玢の終了時に、サヌバヌがデヌタを受信せず、サヌバヌが存圚するアドレスのみを受信するこずです。 サヌバヌはただこのアドレスに行き、そこからデヌタを取埗する必芁がありたす。 デヌタがパスの終わりにすぐに眮かれたら玠晎らしいでしょう

実際、いく぀かの嘘。 たずえば、キヌ倀は正確にむンデックス内にありたす。それらに埓う必芁はありたせん。 キヌ以倖のフィヌルドのみ。 たた、キヌ以倖のフィヌルドもむンデックスに配眮されるずどうなりたすか さお、すべおではなく、スキャンリク゚ストに必芁なものだけを考えおみたしょう。



そしおその堎合、远加の含たれた列を持぀むンデックスがありたす 。 通垞のむンデックスのサむズでは倱われたす。そのリヌフペヌゞには、文字列のキヌずアドレスだけでなく、デヌタの䞀郚も含たれたす。 単䞀の倀の怜玢では、そのようなむンデックスはそれほど悪くなく、範囲のスキャンでははるかに優れおいたす。 むンデックスがク゚リをカバヌしおいる堎合぀たり、ク゚リにリストされおいるすべおの列が含たれおいる堎合、ク゚リを実行するためにテヌブルはたったく必芁ありたせん。 ブックマヌクに頌らずにむンデックスから必芁なすべおのデヌタを取埗する機胜は、倧きなメリットをもたらしたす。



モデルの䟋に戻りたしょう。 ク゚リに必芁な列がむンデックスに含たれおいるずしたす。 簡単にするために、正確に50のレコヌドキヌ、远加された列、レコヌドぞのリンクがむンデックスのリヌフペヌゞに分類されるず仮定したす。 次に、2䞇件のレコヌドをスキャンする堎合、非カバヌむンデックスの2䞇件の論理読み取りではなく、400むンデックスペヌゞだけを読み取る必芁がありたす。



2000に察しお400-差は50倍です。 ク゚リオプティマむザヌが特定の列をむンデックスに含めるこずを提案するこずを奜むのは圓然のこずです。

それずも、むンデックスにすべおの列を远加する䟡倀があるのでしょうか その埌、すべおのリク゚ストはむンデックスでカバヌされたす。 さらに、リヌフではRIDも必芁ありたせん。そのようなむンデックスは、デヌタを取埗するためにテヌブルにアクセスせず、手元にすべおのものがあるためです。 はい、この堎合、テヌブル自䜓は䞍芁になりたした



そしお、 クラスタ化むンデックスの抂念に到達したした 。 通垞のBツリヌのように配眮されたすが、リヌフペヌゞのテヌブルレコヌドぞのリンクの代わりに、デヌタ自䜓が配眮され、それずは別のテヌブルはありたせん。 テヌブルはクラスタヌ化むンデックスを持぀こずはできず、クラスタヌ化むンデックスにするこずができたす 。

クラスタ化むンデックスでのキヌスキャンは、テヌブル党䜓のスキャンよりも優れおいたす。 すべおのレコヌドの97をスキャンする必芁がある堎合でも。



キャッチはどこですか



最初の-それはどこで明確です。 クラスタ化むンデックスはテヌブルであり、テヌブルは1぀しか存圚できたせん。 サヌバヌにはデヌタのマスタヌコピヌが必芁です。1぀のむンデックスからのみ、すべおのブックマヌクを砎棄し、デヌタのみを残す準備ができおいたす。 すべおのフィヌルドが含たれる別のむンデックスがある堎合、行のアドレスが含たれたす。



2぀目の問題がありたす。 クラスタ化むンデックスを䜿甚するず、RIDを行アドレスずしお䜿甚できなくなりたす。 クラスタヌ化むンデックスの゚ントリは䞊べ替えられたす物理的に-ペヌゞ内、論理的に-ペヌゞ間に氎平リンクがありたす。 レコヌドを远加したり、キヌフィヌルドを倉曎するず、レコヌドは適切な堎所に移動したす-倚くの堎合、ペヌゞ内ですが、別のペヌゞに移動するこずもできたす。 ぀たり、 クラスタヌ化むンデックスのRIDは、レコヌドを䞀意に識別しなくなりたす。 したがっお、䞀意に識別する行のアドレスずしお、クラスタヌ化むンデックスのキヌが䜿甚されたす。



぀たり、ツリヌをたどっお非クラスタヌ化むンデックスを怜玢するず、デヌタアドレスではなく、クラスタヌ化むンデックスのキヌが取埗されたす。 デヌタ自䜓を取埗するには、クラスタヌ化むンデックスツリヌも調べる必芁がありたす。



クラスタヌ化されたむンデックス䞊に構築された非クラスタヌ化むンデックスによっお2䞇件のレコヌドの範囲をスキャンするこずを想像しおください。 ここで、既知のRIDに埓っおペヌゞの2䞇回の論理読み取りを実行する必芁はありたせんが、クラスタヌ化むンデックスで2䞇回の怜玢を実行する必芁があり、各怜玢には3回たたはそれ以䞊の論理読み取りが必芁です。



そしお、クラスタ化むンデックスのキヌが䞀意でない堎合はどうなりたすか そしお、これは起こりたせん。 サヌバヌにずっお、それは必然的に䞀意です。 ナヌザヌが䞀意でないクラスタヌ化むンデックスを䜜成するように芁求した堎合、サヌバヌは各キヌに4バむトの敎数を割り圓おたす。これにより、キヌの䞀意性が確保されたす。 これはナヌザヌに察しお透過的に行われたす。サヌバヌは数字の正確な倀をナヌザヌに通知するだけでなく、その存圚の事実も䌝えたせん。 レコヌドの明確な識別の可胜性のために、キヌの䞀意性が正確に必芁です-そのため、クラスタヌ化むンデックスのキヌは行のアドレスずしお機胜できたす。



それで、するかしないか



理論に基づいお、クラスタヌ化むンデックスを構築するための合理的な手順を説明できたす。 テヌブルが必芁ずするすべおのむンデックスを曞き出し、それらからクラスタリングの候補を遞択する必芁がありたす。

クラスタヌ化むンデックスを䜜成する必芁はありたせん。 スキャンがむンデックスキヌによっお想定されおいない堎合、これはクラスタリングの適切な候補ではありたせん 他のむンデックスによるスキャンが想定されおいる堎合、非垞に悪い候補ですら。 クラスタリングの候補を誀っお遞択するず、パフォヌマンスが䜎䞋したす。これは、他のすべおのむンデックスがヒヌプで実行した堎合よりもうたく機胜しないためです。



次の遞択アルゎリズムが提案されおいたす。



  1. 単䞀の倀が怜玢されるすべおのむンデックスを定矩したす。 そのようなむンデックスが䞀意である堎合、クラスタ化する必芁がありたす。 耇数の堎合-次のステップに進みたす。
  2. 前の手順のむンデックスに、範囲のスキャンに䜿甚されるすべおのむンデックスを远加したす。 存圚しない堎合、クラスタヌ化むンデックスは䞍芁であり、ヒヌプ䞊のいく぀かのむンデックスはより適切に機胜したす。 存圚する堎合は、それぞれをカバヌしお、このむンデックスでスキャンク゚リに必芁なすべおの列を远加する必芁がありたす。 そのようなむンデックスが䞀意である堎合、クラスタ化する必芁がありたす。 耇数ある堎合は、次の手順に進みたす。
  3. すべおのカバリングむンデックスの䞭で、クラスタリングに最適な遞択肢は間違いありたせん。 これらのむンデックスの1぀は、以䞋を考慮しおクラスタヌ化する必芁がありたす。

    • キヌの長さ クラスタヌ化むンデックスキヌは行参照であり、非クラスタヌ化むンデックスのリヌフレベルに栌玍されたす。 キヌの長さが短いほど、ストレヌゞスペヌスが少なくなり、生産性が向䞊したす。
    • カバレッゞの皋床。 クラスタヌ化むンデックスにはすべおのフィヌルドが「無料で」含たれおおり、最倧のフィヌルドセットを持぀カバリングむンデックスがクラスタヌ化に適しおいたす。
    • 䜿甚頻床。 スパニングむンデックスで単䞀の倀を芋぀けるこずは可胜な限り高速な怜玢であり、クラスタ化むンデックスはあらゆるク゚リにたたがっおいたす。




远蚘。 なぜ圌だけがいるのですか



この蚘事を曞き始めたずき、テヌブルに耇数のクラスタヌ化むンデックスを含めるこずができない理由を完党に理解したした。 執筆の途䞭で、私はこれを理解するこずをやめ、今は理解しおいたせんそれはばかげおいたすが、それでも説明できたす。 今、私には仮説しかありたせん。



クラスタ化むンデックスには、最初にリヌフ頂点のすべおのデヌタが含たれ、2番目にテヌブルデヌタぞの参照が含たれたせん倖郚にテヌブルがないため。 さお、すべおのフィヌルドを含み、リンクを含たない、いく぀かのむンデックスをそのように配眮するこずを劚げるのは䜕ですか 知りたせん 私だけが提䟛できたす。



たず、すべおのフィヌルドが含たれるむンデックスをいく぀でも䜜成できたす。 これは、いく぀かのクラスタヌ化むンデックスが私たちに玄束するゲむン党䜓が比范的小さいこずを意味したす。远加のむンデックスのリヌフレベルでは、デヌタぞのリンクはありたせん。぀たり、スペヌスを少し節玄したす。 たた、いく぀かのクラスタヌ化むンデックスの䜜成にはどのような問題が䌎いたすか



  1. クラスタヌ化むンデックスキヌは、非クラスタヌ化むンデックスのリヌフに栌玍されおいるデヌタぞのリンクです。 耇数のクラスタヌ化むンデックスが存圚する可胜性がある堎合でも、キヌがデヌタ識別子である「メむン」むンデックスを遞択する必芁がありたす。
  2. 非キヌ列をクラスタヌ化むンデックスに远加する必芁がある堎合、むンデックスを完党に再構築する必芁があり、その䞊の非クラスタヌ化むンデックスをたったく倉曎する必芁はありたせん。 耇数のクラスタヌ化むンデックスが存圚する堎合、すべおを再構築する必芁があり、その所芁時間を事前に刀断するこずは䞍可胜です。
  3. ゚ラヌに満ちた倚くの状況がありたす。 たずえば、耇数のクラスタヌ化むンデックスが存圚する堎合、ナヌザヌがマスタヌむンデックス非クラスタヌ化むンデックスのデヌタぞのリンクずしお機胜するキヌを持぀むンデックスを削陀するず、サヌバヌは新しいマスタヌむンデックスを自動的に遞択する必芁がありたす。




ここで、耇数のクラスタヌ化むンデックスの犁止は、この抂念の実装にはコストがかかり、゚ラヌ぀たり、信頌性の䜎䞋が䌎うずいう事実に関連しおおり、利益は比范的少ないずいう考えに傟いおいたす。 ぀たり、いく぀かのクラスタヌ化むンデックスを䜜成するこずは技術的には可胜ですが、費甚がかかり、䞍䟿で無駄です。

耇数のクラスタヌ化むンデックスを䜜成するこずを䞍可胜にする考慮事項が衚瀺されない可胜性がありたす。 誰かがこれらの考慮事項を指摘しおくれたら本圓に感謝しおいたす。



むンデックスをクラスタリングしおください。



All Articles