Apache Igniteはメモリ内の分散データベースであり、このようなデータベースは広がっています。たとえば、リレーショナルDBMS Oracleなど、すでに存在し、それ自体が証明されているものと比較したいと思います。 Igniteには広範な分散コンピューティング機能があり、ANSI-99レベルでのSQLサポート、SQLパフォーマンスもあり、比較したいと思います。 どちらの場合でも、データベースのチューニングはほとんどがデフォルトであり、Oracleの場合はXEであり、Igniteの場合は1台のコンピューター上の2つのノードです。 コンピューターi5 7400(4コア)3.5 GHz、8 GB RAM、SSDディスク。
テストデータとして、CLADRデータ(〜23万3千レコード)を、IgniteとOracleへの2つの接続が構成されているDBeaverクエリ実行環境として使用します。 最初に行うことは、データをテーブルにインポートすることです。KLADRデータをDBFからCSVに変換し、DBeaverを使用してテーブルにインポートします。

Igniteは、永続ストレージにデータを保存するようにも構成されています。
config \ default-config.xml
<property name="dataStorageConfiguration"> <bean class="org.apache.ignite.configuration.DataStorageConfiguration"> <property name="defaultDataRegionConfiguration"> <bean class="org.apache.ignite.configuration.DataRegionConfiguration"> <property name="persistenceEnabled" value="true"/> </bean> </property> </bean> </property>
クラドルテーブル構造
CREATE TABLE Kladr ( NAME VARCHAR, CODE VARCHAR, SOCR varchar, INDEX VARCHAR, PRIMARY KEY (CODE)) WITH "affinityKey=CODE";
affinityKey = CODE-Igniteのデータがパーティション全体に分散され、さらに2つのノードに分散されることを意味します。 Igniteの2つのインスタンスを起動すると、2つのノードが提供されます。
別の大きくないSOCRBASEテーブルには、略語ディレクトリがあり、分散ネットワークでは異なるストレージルールがあります。
CREATE TABLE Socrbase ( LEVEL LONG, SCNAME VARCHAR, SOCRNAME VARCHAR, KOD_T_ST LONG, PRIMARY KEY (KOD_T_ST)) WITH "template=replicated";
WITH "template = replicated"-テーブルは各ノードでいっぱいになります。 その後、各ノードは、結合要求を受信すると、異なるストレージモデルを使用してこのディレクトリにデータを接続できます。パーティションテーブルの一貫性を確保する必要があります。
ここに2つの実行中のノードがあります
最初:

2番目:

Orcaleの場合、構造はパーティションを除いて同じです。
永続-ディスク上のIgniteストレージは、パーティション(ファイル)による分散のように見えます。各ノードには合計1024があります。 ノードのすべてのデータは1024ブロックで分散され、その一部は最初のノードにあり、その他は2番目のノードにあります。
単一ノードの例

クエリの実行中に、Igniteはノードに分散リクエストを行い、ノードが持っているデータを収集します。その後、データは統合され、最終サンプルで送信されます。
そのため、最初の1つは、CSVのDBeaverツールを使用したデータのインポート、223千レコードです。 これが最初の結果です。
インポートデータ223千レコード(KLADR) |
点火12分 | Oracle 5秒 |
次に、比較のためにデータを検索するためにいくつかの簡単なクエリを実行します。結果として2番目の実行を続けます(2つのデータベースの場合は常に少なくなります)。
100個のCODEに対して100個のKLADRレコードを取得します。CODEにはインデックスがあります
SELECT * FROM KLADR WHERE code IN ( SELECT code FROM KLADR k WHERE k."INDEX" IS NOT NULL limit 100 ) LIMIT 100;
|
30 msに点火 | Oracle 6ミリ秒。 |
100のNAMEに対して100のKLADRレコードを取得します。NAMEのインデックスはありません
SELECT * FROM KLADR WHERE name IN ( SELECT name FROM KLADR k limit 100 ) LIMIT 100;
|
80 msに点火 | Oracle 6ミリ秒。 |
地域の被験者の数を数える
SELECT count(*) FROM KLADR WHERE CODE like '02%'
|
30 msに点火 | Oracle 6ミリ秒。 |
領域内のエンティティの数は1000を超えています
SELECT SUBSTR(k.code, 1, 2), count(k.code) FROM KLADR k GROUP BY SUBSTR(k.code, 1, 2) HAVING count(k.code) > 1000 ORDER BY SUBSTR(k.code, 1, 2)
|
150 msに点火します。 | Oracle 60ミリ秒。 |
参加リクエスト。 最初のレベルの科目を100個取得する
SELECT k.* FROM KLADR k JOIN SOCRBASE s ON k.SOCR = s.SCNAME WHERE s."LEVEL" = 1 LIMIT 100;
|
280ミリ秒に点火 | Oracle 2ミリ秒。 |
参加リクエスト。 レベルの被験者数
SELECT s."LEVEL", count(k.code) FROM KLADR k JOIN SOCRBASE s ON k.SOCR = s.SCNAME GROUP BY s."LEVEL";
|
点火13秒 | Oracle 140ミリ秒。 |
はい、後者の場合、正確に13秒です。 Igniteは、結合のあるものは良くないという要求を示しましたが、データを制限する条件を導入すると、この時間が短縮されます。
おそらく、これらの比較で十分です。まだ結論を出しません。Igniteの勉強を続けます...
材料:
点火する
はじめにSQLの開始