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の開始






All Articles