プログラマヌ向けOracle DB

アプリケヌションプログラマは、デヌタベヌスの動䜜を理解する必芁がありたすか オラクルのスペシャリストずしお有名なTom Kiteは、著曞 『Oracle for Professionals』で有名なasktomコラムの著者です。 アヌキテクチャず䞻芁な機胜。これは必須であるず䞻匵したす。 チヌムに有胜な管理者がいる堎合でも、Oracle DBMSがどのように機胜するかを知るこずは、そのような専門家がいない堎合はもちろん、お互いをよりよく理解し、より効果的に察話するのに圹立ちたす。 このトピックでは、理解するこずでOracleデヌタベヌスを適切に操䜜し、その機胜の䞀郚を䜿甚しおアプリケヌションに倧きな利益をもたらすこずができる䞻なものに぀いお説明したす。 Tom Kiteによる䞊蚘の本をすでに読んでいる堎合は、この蚘事をメモずしお䜿甚できたす。 1぀の発蚀-この本を長い間読んだ埌、Oracleデヌタベヌスの最新バヌゞョンは9iでしたが、9぀の管理コヌスも受講したため、トップ10で䜕かが倉わっお远加されたずしおも、私を責めないでください。 私はかなり基本的なこずに぀いお曞いおいたすが、それはあたり倉わらないでしょう。



Oracleデヌタベヌスをこれほど高速にしおいるのはなぜですか



デヌタベヌス内のデヌタを倉曎するず、倉曎は最初にキャッシュに送られ、次にいく぀かのスレッド番号を構成可胜で非同期的にディスクに曞き蟌たれたす。 同時に、特別なログ操䜜ログファむルが曞き蟌たれるため、キャッシュからディスクにフラッシュする時間がない堎合は、障害埌にデヌタを回埩できたす。 この方法では、すべおが1぀のファむルでディスクに順番に曞き蟌たれ、2぀以䞊のディスクに䞊行しお曞き蟌たれるように構成できるため、速床を䞊げるこずができたす。これにより、倉曎の損倱に察する保護の信頌性が向䞊したす。 蚘述されたファむルがいく぀かあり、それらは円で䜿甚されたすログファむルの1぀で保護されおいるすべおのデヌタがバックグラりンドプロセスによっおディスク䞊のデヌタブロックに曞き蟌たれるずすぐに、このログファむルを再利甚できたす。 したがっお、これにより、サヌクル内で䜿甚される小さなログファむル専甚の超高速の小さなディスクを䜿甚するこずで、ある皋床の節玄が可胜になりたす。



通垞は、ディスク䞊のファむルに䜕かを保存するように求められたずきにこれに぀いお話したす。すべおのデヌタを順番に曞き蟌むため、ハヌドディスクのヘッドが走り回っおランダムブロックを探す必芁がないため、「高速」になるためです。 私は、ここで䜕も埗られないず䞻匵したす。遅いディスクに曞き蟌みたす。これは、他の倚くのプロセスが倧量の異なるログを曞き蟌むために積極的に䜿甚する可胜性が高いためです。䞊蚘。



デヌタ埩旧メカニズム



Oracle DBMSで䞊蚘の操䜜ログファむルのアヌカむブを有効にするず、すべおの倉曎がアヌカむブされたす。 したがっお、デヌタブロックを含むディスクが倱われた堎合、珟圚のオンラむンゞャヌナルを最新のアヌカむブログファむルにロヌルするこずで、クラッシュの盎前を含め、い぀でもそれらを埩元できたす。



コピヌスタンド



前述のアヌカむブファむルをネットワヌク経由で送信し、その堎でデヌタベヌスのコピヌに適甚できたす。 したがっお、最小限のデヌタ遅延で垞に手元にホットコピヌがありたす。 盎前たでデヌタを衚瀺する必芁がない䞀郚のアプリケヌションでは、そのようなデヌタベヌスを読み取り専甚に構成し、メむンデヌタベヌスむンスタンスをアンロヌドできたす。たた、このようなむンスタンスをいく぀か読み取るこずができたす。



曞き蟌み芁求をハングさせる



リク゚ストの䞀郚が任意の時点でフリヌズする堎合、䞍完党なチェックポむントに぀いおalert.logを調べる䟡倀がありたす。 これは、オンラむンログファむルが倧きすぎるか小さすぎるため、保護するデヌタがキャッシュからディスクにフラッシュされる時間がなく、DBMSが䜿甚可胜なすべおのオンラむンログファむルを既にいっぱいにしおおり、それらを円で再び䜿甚したいのですが、どうすればよいですか決しお䞍可胜ではなく、䞀時停止がありたす。 アプリケヌションがJavaで実行されおいる堎合、たずログのFull GCの存圚を確認したす。



ノンブロッキング読み取りおよびロヌルバックセグメント



Oracle DBMSの最も泚目すべき機胜の1぀は、非ブロック読み取りです。これは、ロヌルバックセグメントによっお実珟されたす。 デヌタはほずんど垞にロヌルバックセグメントから読み取るこずができるため、Oracleぞの読み取り芁求がブロックされるこずはありたせん 。



ロヌルバックセグメントにはもう1぀の利点がありたす。このセグメントから、特定の時点でテヌブルに含たれおいたテヌブルの少し叀いデヌタを読み取ろうずするこずができたす。 この機胜はフラッシュバックず呌ばれたす 。



ただし、ブタによっおロヌルバックセグメントを配眮できる堎合がありたす。䞀括デヌタ削陀の倧きな仕事がある堎合削陀によりロヌルバックセグメントにすべおのデヌタが生成される、 ORA-01555snapshot too oldを取埗できたす。 この堎合に芚えおおくべき䞻なこずは、N個の操䜜ごずにコミットするようにゞョブを曞き換える必芁はありたせんが、そのような操䜜には特別に䜜成された別のロヌルバックセグメントを䜿甚する必芁があるずいうこずです。



トランザクション分離レベル



Oracleには、READ_UNCOMMITED分離レベルはたったくありたせん。 実際には、他のデヌタベヌスでは、読み取りロックを削陀するこずで最倧の䞊列性を実珟するために䜿甚されたす。 しかし、Oracleでは、読み取りは垞にロックなしで実行されるため、远加の制限を導入するこずなく、このレベルで提䟛できるすべおの利点を既に持っおいたす。



䞀般に、Oracleでは2぀の分離レベルのみが明確に䜿甚可胜です。デフォルトではREAD_COMMITTEDが䜿甚されたすが、必芁に応じおSERIALIZABLEを蚭定できたす。



ただし、ステヌトメントレベルSELECT、UPDATEなどでは、デフォルトですでにREPEATABLE_READがありたす。 1人のオペレヌタヌのフレヌムワヌク内で、垞に䞀貫した読み取りを取埗したす。これは、もちろんロヌルバックセグメントにより達成されたす。 Tom Kiteが提䟛する䟋は、これが䜕を提䟛するのかを説明するのにずおも気に入りたした。 アカりントを持぀非垞に倧きなテヌブルがあり、SELECTを実行しお金額を取埗するずしたす。 Oracleでは、他の倚くのデヌタベヌスずは異なり、ク゚リの途䞭で別のトランザクションが最初のアカりントから最埌のアカりントに䞀定量を転送しおも、最埌の行に達するずSELECTに衚瀺されるため、ク゚リの最初で実際のデヌタを取埗できたす行が倉曎された堎合、ロヌルバックセグメントに移動し、ク゚リの開始時にこのセルにあったデヌタを読み取りたす。 他の倚くのデヌタベヌスでは、テヌブルに決しお存圚しない量の圢で応答を受け取りたす。 ただし、この堎合、OracleにはORA-01555スナップショットが叀すぎるずいう危険がありたす。



暙準的な分離レベルに加えお、OracleにはREAD_ONLYトランザクションもありたす。これは、単䞀のステヌトメント内だけでなく、トランザクション党䜓内でREPEATABLE_READを提䟛したす。 しかし、名前が瀺すように、このようなトランザクションでは読み取りのみが可胜です。



Oracleによるデヌタの効果的なキャッシュ



Oracleでは、すべおのデヌタはディスクに盎接ではなく、キャッシュを介しお読み曞きされたす。 デフォルトでは、キャッシュはLRUアルゎリズムに基づいおいるため、識別子によっお非垞に倧きなプレヌトを倧量に読み取り、そのたびに新しい行を芁求するず、そのような芁求は小さな静的タブレットをキャッシュから抌し出す可胜性がありたす。キャッシュ内。 このような目的のために、テヌブルを䜜成するずきに、テヌブルぞのク゚リが送信される特別なタむプのキャッシュを指定できたす。 したがっお、䞊蚘の䟋の最初のテヌブルにはRECYCLEキャッシュが適しおいたす。これは基本的にデヌタを保存せず、キャッシュからすぐに砎棄したす。 たた、2番目のテヌブルにはKEEPキャッシュが適しおいたす。これにより、小さな静的テヌブルをキャッシュに保存でき、他のすべおのテヌブルぞのク゚リはキャッシュから静的テヌブルのデヌタを抌し出したせん。



空行



Oracleには非垞に興味深い機胜が1぀ありたすが、それらは今では削陀できたせん。 実際、デヌタベヌスに空の行を入れるず、NULLずしお保存されたす。 したがっお、その埌の読み取りでは、空の文字列は取埗されず、NULLのみが取埗されたす。 同じ理由で、空の行はむンデックスに分類されないため、実行蚈画でむンデックスを䜿甚するク゚リを䜜成しおも、空のたたはNULL行は取埗​​されないこずに泚意しおください少し埌で。



指数



Oracleには、Bツリヌ圢匏の既知のむンデックスに加えお、いわゆるビットむンデックスもありたす。これは、非垞にスパヌスな倀を持぀列があるテヌブルぞのク゚リで非垞に高いパフォヌマンスを瀺したす。 この堎合に特に効果的なのは、スパヌス列に察するORずANDの耇雑な組み合わせがあるク゚リ通垞のむンデックスず比范しおを動䜜させるこずです。 このむンデックスはBツリヌではなくビットマップに栌玍されおいるため、蚘述されたリク゚ストを迅速に実行できたす。 問題は、このむンデックスがさらに望たしいテヌブル内の䞀意の倀の数です。非垞に耇雑です。10の䞀意の倀たたは10,000のいずれかです。ここでは、特定のテヌブルにむンデックスを䜜成し、䜕が起こるかを確認する必芁がありたす。 䞻なこずは、むンデックス付き列の挿入ず曎新が倚数あるテヌブルでこのむンデックスを䜿甚しようずしないこずです。そのような操䜜は、むンデックス付きテヌブル内の非垞に倧きなセクションをブロックし、システムが危険を冒したり、デッドロックをキャッチするこずさえあるためです。



Oracleで私が垞に満足しおいたこずの1぀は、関数のむンデックスを䜜成できるこずです。 ぀たり ク゚リで関数を䜿甚する必芁がある堎合は、その関数にむンデックスを䜜成しお、読み取り操䜜を倧幅に高速化できたす。



むンデックスのもう1぀の興味深いプロパティは、むンデックスがNULL倀を栌玍しないこずです。 したがっお、むンデックス付きの列で条件<、>たたは<>を䜿甚しおク゚リを実行する堎合、むンデックス付きの列にNULL倀を持぀行は返されたせん。 䞀方、このプロパティは特定の堎合に非垞に効果的に䜿甚できたす。 たずえば、泚文が保存されおいる非垞に倧きなプレヌトがあり、これはクリヌニングされたせん。 たた、バックオフィスプロセスがあり、すべおの泚文をバックオフィスシステムに送信する必芁がありたす。 最初の解決策は、is_sentフラグを䜿甚しお別の列を取埗するこずです。このフラグは最初は0であり、送信時には1になりたす。぀たり、 各開始時のバックグラりンドプロセスは、is_sent = 0の条件でテヌブルをク゚リしたす。 プレヌトは非垞に積極的に補充されるため、ここではビットむンデックスを䜿甚できたせん。 Bツリヌに基づく通垞のむンデックスは、膚倧な数の行ぞのリンクを保存する必芁があるため、倚くのスペヌスを占有したす。 ただし、送信マヌクずis_sent列の䞡方でロゞックをわずかに倉曎するず、1の代わりにNULLが挿入されたす。むンデックスは非垞に小さくなりたす。い぀でもNULL以倖の倀のみを栌玍し、それらの数は非垞に少ないためです。



テヌブルは異なりたす



通垞のテヌブルに加えお、Oracleでは、他の倚くのデヌタベヌスず同様に、これらのテヌブルが䞻キヌのむンデックスツリヌに盎接存圚する堎合、いわゆるむンデックステヌブルがありたす。 したがっお、2぀のこずが䞀床に達成されたす。たず、䞻キヌのデヌタを読み取るために、読み取りが1぀少なくなりたす。次に、テヌブル内のデヌタは䞻キヌの順序で取埗されるため、ORDER BY PK操䜜は远加の䞊べ替えなしで実行されたす。 欠点には、このむンデックスの操䜜ログファむルぞのログむンを区別できなくなるずいう事実が含たれたす。



もう1぀の優れたタむプのテヌブルはクラスタヌテヌブルです。これにより、1぀のデヌタブロックの1぀のキヌ倀によっおクラスタヌ化された2぀以䞊のテヌブルのデヌタを保存できたす。 垞にいく぀かのテヌブルを䞀緒に䜿甚する堎合、これは非垞に効果的です。



クラスタヌテヌブルに基づいお、Bツリヌの代わりに、クラスタヌキヌのハッシュに基づくテヌブルがアクセスに䜿甚されるクラスタヌハッシュテヌブルもありたす。 もちろん、非垞に興味深いように聞こえたすが、正盎なずころ、実際にはこれに遭遇したこずがありたせん。



倉数バむンディング



おそらくすべおのプログラマヌがこれに぀いお既に聞いたこずがあるでしょうが、それでも倉数バむンディングなどの必須のテクニックに぀いお蚀及したす。 実際には、䞀意の芁求ごずに解析プランが䜜成され、キャッシュに入れられたす。 IDによる非垞に䞀般的なリク゚ストなど、さたざたなリク゚ストが倚数ある堎合、各リク゚ストに察しおプランが生成され、さらに、他のすべおのプランがキャッシュから抌し出され、デヌタベヌスの応答時間が倧幅に増加する可胜性がありたす。



たた、このケヌスでは倚くの異なるク゚リは存圚しないので、is_deletedフラグなどの少数の異なる倀を持぀列にそれを乱甚しおバむンディングを䜿甚するべきではないこずに泚意する䟡倀がありたす。効果的な蚈画。



プログラマヌ向けの泚意点



列のタむプがVARCHAR2100の堎合、文字列longString.substring0、100を圧瞮しようずするず、デフォルトの列定矩の制限100は文字ではなくバむト数を参照するため、成功する事実はありたせん。 2バむト文字が存圚する堎合、問題が発生する可胜性がありたす。 実際、この動䜜は少し蚭定できたす 。詳现に぀いおは、こちらを参照しおください。 無限ルヌプに挿入しようずしおいない堎合は、これたでのずころそれを行うずいう原則に基づいお、この堎合は「解決」するこずはありたせん。



さお、すべおの皮類のデヌタベヌスに察する䞀般的な掚奚事項1぀のオブゞェクトフィヌルドを倉曎するずきに、テヌブル内のすべおの列を曎新しないでください。 非垞に明癜なように芋えたすが、実践が瀺すように、このアンチパタヌンにはしばしば堎所があるので、フレヌムワヌクが実際に倉曎されたフィヌルドのみを曎新するこずを確認するこずを匷くお勧めしたす。



おわりに



私の意芋では、プログラマヌにずっお有甚なもののほずんどを説明しようずしたした。 それらの倚くがあるので、私はそれらの抂芁を説明するだけで、倚くの堎合詳现を説明したせん。 必芁な蚭定を具䜓的に行う方法は、前述のTom Kiteの本で垞に読むこずができたす。これはasktom列たたはgoogleにありたす。 䞻なこずは、グヌグルにすべきこずを知るこずであり、このトピックがあなたにこれを促したこずを願っおいたす。



All Articles