Apache IgniteとOracle DBMS

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

<!-- Enabling Apache Ignite Persistent Store. --> <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の開始

Source: https://habr.com/ru/post/J346262/


All Articles