鋭い区別を共有し、そして、等を分散SQLデータベース、インデックスの一部の利点を探求し、性能試験結果を説明するために、学習の過程で 共有へのご参考学習のための、非常に実用的なドライ。
代わりに、従来のインデックスのローカルインデックスは、列内の空であってもよい場合(その列線のごく一部がヌル値を有していない)、および著しく挿入、更新、削除、応答時間を短縮することができます。さらに、単一の行を選択し、応答時間は少し短縮されます。この記事では、インデックスの一部であるかを説明、部分インデックス仕様を作成する方法を示しますが、ユースケースの部分インデックスを使用するための要件は、いくつかの簡単なパフォーマンステストを記述し説明し、その結果を正当化するディスプレイは、部分インデックスをお勧めします。適切なユースケース。
**はじめに**
時には、ビジネス分析は、エンティティのタイプが一般的に提供されない任意の属性を持って、特定の値、およびイベントの認識に代わる物性が表示されますを確認する必要が設けられていないことはございません決定します。今典型的な例があり、いくつかのオフィス施設には、小規模地下に限定された自転車のストレージスペースを提供し、非常に少数の人々はこれを利用するためにキーの数を提供します。管理人がキーをずらした場合、実際には「?数42キーを割り当てられた人」を見つける必要がある、しかし、人は自転車置き場を使用していない特定する必要はありません。
テーブルの列を有するタイプが空オプションの属性であるようなエンティティを実現することになります。そして、この列は、行を識別するために、この列にNULL値によってクエリの迅速な実施を支援するためにセカンダリインデックス、クエリアフリカとアフリカが必要になります。
あなたは、「請求」とテーブルの「未請求」の注文が含まれている場合は、別の状況は「未請求」の受注が唯一のテーブルを占め、(わずかに異なるオプションの属性の場合)が発生しますごく一部ですが、通常は、あなたがオブジェクトを選択したいOLTPシーンで - それが処理され、それを設定することができるようなので、ある「課金。」唯一のいくつかのテーブルインデックスの行のように、インデックスの部分を画定する制限。本例では、最初のケースでは、唯一の指定された制限は、行インデックスを有するNULL列がありません。または、後者の場合では、唯一の指標「未請求」ライン。
インデックスの部分は通常の索引よりもはるかに小さいように、それは有益であろう。最も重要なことは、典型的なケースでは、挿入または削除行はメンテナンスコストのインデックスを回避する、です。
**「インデックスの作成」の構文**
我々は、テーブルを作成するとします。
テーブルt(k個の整数主キーのV INT)を作成します。
(私は彼らが命令フォーマットの表示をysqlshなるため、すべてのSQL文の末尾部品番号この資料に表示されます。)ノートは、テレビ欄が空でください。
定期的にセカンダリインデックスを作成します。
T(V)のインデックスt_vを作成します。
そして、いくつかのセカンダリインデックスを作成します。
vがnullではないトン(V)にインデックスt_vを作成します。
where句の制限は、インデックステーブル内の任意の列に単一の式のみ参照することができます。例えば、 ``ここで、vはnullでなく、V!= 0 ''。それは簡単です!
性能試験
私はテレビのラインのわずか10%が空ではありませんそのうち万行のテーブルt、で満たされています。これは、%は、機能のためにモジュロ演算を表し構文PostgreSQLのSQLで記述されています。
Tへの挿入(K、V) 選択 AV、 10%AVケース とき0その後、AV それ以外はnull 終わり から (Vとしてgenerate_series(1、1000000)を選択)。
テスト1:インデックスを作成します。
まず第一に、私は最初にすべてのテレビで定期的にインデックスを作成し、 ``「」動作時間を作成し、スクリプトのタイミングを実行するための指標。それから私は、インデックスを削除し、テレビでいくつかのインデックスが、また、動作のタイミングを作成し、再度タイミングスクリプトを実行します(このスクリプトの実装は、#4に#2をテスト)。
テスト2:単結合を選択
上の\タイミング コールselect_not_null_rows(100000); \オフタイミング
プロセス select_not_null_rows()OLTP文を選択し、「forループ」を実行することによって達成単一の行をシミュレートします。
1..num_rowsループ内のjについて TV = the_v Tからthe_kにTKを選択します。 the_v:= the_v + sparseness_step。 ループを終了します。
もちろん、誰もがこのような実際のプログラムを書きません -特にユニーク制約ont.v例不在であるため、複数の行を返すことが声明を選択します!しかし、この単純な方法は、タイミングの目的のためには十分です。sparseness_step値は、それがのように表現、私の選択を反映して、10:
10%AVケース
上に示したINSERT文で、私はテーブルの移入に使用トンを。SQLの実行は最高の準備に従わないので、あなたは、プログラムが実行されている。この問題が発生した最初の時間は、繰り返し舞台裏で準備されたステートメントを発行したプログラムを選択-実行パラダイムを
試験 3:単一行の挿入
上の\タイミング コールINSERT_ROWS(100000); \オフタイミング
プロセス文挿入単一行OLTPをシミュレートするために、「forループ」を実行することによって達成INSERT_ROWS():
1..num_rowsループ内のjについて T(K、V)値(1000000 + J、NULL)に挿入します。 コミット; ループを終了します。
誰もが、実際のプログラムの各行のために提出されません。 しかし、これは、単一のラインのアナログである OLTP機器。ここでは、SQLの実行は、実行パラダイムを準備最高に従ってください。
テスト 4:一括削除
上の\タイミング トンから削除ここでk> 1000000; \オフタイミング
私はここで使用していない時間は、時間のごく一部の行だけ削除数千人をコンパイルし、SQLプログラムのために必要なので、準備を実行パラダイムを。
テスト環境
私は両方の環境で時間を記録しました。
・ まず、私は地元の使用単一ノードのクラスタYugabyteDB(バージョン2.0.1)を実行しているのMacBookを、複製因子(RF)が1です。ysqlshクライアントは、同じローカルコンピュータ上で実行されています。
・ その後、私は、デリゲートを使用してそれらを実行するには、実際の3ノードクラスタのAWS、RF = 3に。私は、同じ「」(OR)アベイラビリティゾーン``で米国西部-2に配置されているすべての3つのノードを持っています。ノードのタイプは「c5.large」で、各ノードは、私のテスト要件を満たすのに十分な収納スペースがあります。私は、同じエリア内の別のノード上のysqlshクライアントが利用可能に走りました。
結果
私は、両方の試験条件(従来のインデックスセクションのインデックス)と2つのテスト環境(に記録されたテスト上記「ローカル」と「クラウド」の下の経過時間)。各測定のために、時間インデックスより従来の割出し時間部分大きいです。それは時間の「ローカル」環境の絶対値、絶対値よりも「クラウド」時環境の大きいことが予想されます。くださいなおコンセンサスアルゴリズム及びラフト分散トランザクション、3つのより遅い3ノードクラスタノードの期待RF = SQL操作、RF = 1、なしショートコード・パスとノード間の通信。だから、柔軟かつスケーラブルなシステムは、多くのよく文書化の利点があり、これらの利点はコストを上回ることがあります。
私は、正規化された比率の結果は、それらを表します。従来のインデックス試験がかかる場合、例えば、 60秒、テストのインデックス部分を使用して3倍速い従来の速度指数より20秒、インデックス部分を取ります。測定の私の精度で、2つのテスト環境の速度が同じ比率です。
テスト節で速く、従来のインデックスより、インデックス
もちろん、あなたの結果が異なる場合があります。 非ゼロのスパース密度欄には、低密度以上の速度になるとスパースは彼らが小さくなります。
結論
这篇文章展示了如何在适当的用例中使用部分索引,可以减少二级索引维护的成本,从而加快有关表的插入,更新和删除操作。 通过使用部分索引来减少二级索引维护操作的数量在分布式SQL数据库(例如YugabyteDB)中特别有利。 这是因为在索引维护期间,看似仅插入,更新或删除单个行的事务会自动成为涉及主行和辅助索引行的分布式事务。
当主行和辅助索引行存在于群集的潜在两个不同节点上的两个不同分片上时,这种分布式事务可以是多分片事务。 可以想象,多分片事务必然比单分片事务昂贵。
文章写到这里,如有不足之处,欢迎补充评论!