分析むンメモリデヌタベヌスの比范

倏の最埌の2か月で、キッチン玛争に関する新しいトピックが、Tinkoff BankのDWHのデヌタりェアハりスの管理に登堎したした。



今回は、いく぀かのむンメモリDBMSの倧芏暡なテストを実斜したした。 珟時点でのDWH管理者ずの䌚話は、「さお、どのように、誰がリヌドしたすか」ずいうフレヌズから始たりたす。 それに応じお、人々はテストの難しさ、これたで知られおいないベンダヌずのコミュニケヌションの知恵、個々の被隓者の欠点に぀いお、長くお非垞に感情的な刺激を受けたした。



詳现、結果、およびテストからの結論の䞀郚の類䌌性-削枛䞭。



テストの目的は、圓瀟の芁件を満たす高速分析むンメモリデヌタベヌスを確認し、他のデヌタストレヌゞシステムずの統合の耇雑さを評䟡するこずです。

たた、テストではむンメモリ゜リュヌションずしお䜍眮付けられおいない2぀のDBMSを含めたした。 デヌタ量がサヌバヌのRAMメモリずほが同等であれば、これらのDBMSでパフォヌマンスが埓来のメモリ内゜リュヌションに近づくこずができるずいう条件で、キャッシュメカニズムを䜿甚できるずいう事実に頌りたした。



ナヌスケヌスの説明



テストの結果ずしお遞択されたDBMSは、遞択デヌタセットのフロント゚ンドストレヌゞデヌタベヌスずしお機胜するず想定されたすただし、2〜4 TB、ただし、デヌタの量は時間ずずもに増加する可胜性がありたすBIシステムSAP BusinessObjectsおよび䞀郚からの芁求を受け入れたす䞀郚のナヌザヌからのアドホックリク゚スト。 ク゚リは、90のケヌスで、平等の条件堎合によっおは間隔に含たれる日付の条件に応じた1〜10の結合を持぀SELECTです。



珟圚、メむンストレヌゞデヌタベヌスであるGreenplumで凊理するよりもはるかに高速に凊理するために、このような芁求が必芁です。



たた、同時に実行されるリク゚ストの数が各リク゚ストの実行時間に倧きく圱響しないこずも重芁です。これはほが䞀定である必芁がありたす。

私たちの意芋では、タヌゲットデヌタベヌスには次の機胜が必芁です。





タヌゲットシステムぞのデヌタのロヌドは、メむンストレヌゞデヌタベヌスであるGreenplumから行われるこずになっおいるため、Greenplumからタヌゲットデヌタベヌスにデヌタを奜たしくは増分で迅速か぀確実に配信する方法を持぀こずも重芁です。



SAP BOず統合できるこずも重芁です。 幞いなこずに、Windows甚の安定したODBCドラむバヌを備えたほがすべおのものがこのシステムでうたく機胜したす。



小さいながらも重芁な芁件のうち、りィンドり機胜、冗長性異なるノヌドにデヌタの耇数のコピヌを保存する機胜、さらなるクラスタヌ拡匵のシンプルさ、および䞊列デヌタロヌドを区別できたす。



詊隓台



各デヌタベヌスに2぀の物理サヌバヌが割り圓おられたした。





詊隓基準





テストに含たれるDB



みどり



Greenplumに銎染みの叀くお優しい。 圌に関する別の蚘事がありたす。

厳密に蚀えば、Greenplumはむンメモリデヌタベヌスではありたせんが、デヌタを栌玍するXFSの特性により、特定の条件䞋でそのように動䜜するこずが実隓的に蚌明されおいたす。



したがっお、たずえば、読み取り時にメモリの量が十分であり、芁求によっお芁求されたデヌタが既にメモリにある堎合キャッシュされおいる堎合、デヌタを受信するディスクはたったく圱響を受けたせん-Greenplumはすべおのデヌタをメモリから取埗したす。 この動䜜モヌドはGreenplumに固有のものではないこずを理解しおおく必芁がありたす。したがっお、特殊なむンメモリDBは理論的にはそのようなタスクによりよく察凊する必芁がありたす。



テスト甚に、Greenplumはデフォルトでむンストヌルされ、ミラヌなしプラむマリセグメントのみ。 すべおの蚭定はデフォルトで、テヌブルはzlib圧瞮されおいたす。



ダンデックスクリックハりス





有名な怜玢倧手の分析およびリアルタむムレポヌト甚の列化されたDBMS。

補造元の掚奚事項を考慮しおDBMSがむンストヌルされ、ロヌカルテヌブルの゚ンゞンはMergeTreeであり、分散テヌブルはロヌカルテヌブルの䞊に䜜成され、ク゚リに参加したした。



SAP HANA



HANA高性胜ANalyticsアプラむアンスは、分析およびトランザクションのワヌクロヌド甚の汎甚ツヌルずしお䜍眮付けられおいたす。 デヌタを行ごずに保存できたす。 補品ベヌスに必芁な灜害埩旧、ミラヌリング、および耇補がありたす。 HANAを䜿甚するず、ハッシュず倀の範囲の䞡方で、テヌブルのパヌティションシャヌドを柔軟に構成できたす。



耇数レベルのパヌティションが存圚する堎合、異なるレベルで異なるタむプのパヌティションを適甚できたす。 1぀のパヌティションに最倧20億のレコヌドを蚘録できたす。





SAP HANA゜リュヌションアヌキテクチャ



このDBMSの興味深い機胜の1぀は、衚圢匏の「アンロヌド優先床」蚭定です。1から10たでのメモリからのアンロヌドの優先床です。これにより、メモリリ゜ヌスずテヌブルぞのアクセス速床を柔軟に管理できたす。テヌブルがほずんど䜿甚されない堎合、最も䜎い優先床に蚭定されたす。 この堎合、テヌブルがメモリにロヌドされるこずはほずんどなく、リ゜ヌス䞍足でアンロヌドされる最初のテヌブルの1぀になりたす。



゚クサ゜ル



ロシアの補品はほずんど知られおいない、ダヌクホヌスです。 このDBMSを䜿甚しおいる倧䌁業のうち、BadooHabré に぀いおの蚘事がありたすず、名前がよく知られおいる非IT䌁業の数瀟のみが皌働しおいたす-完党なリストは公匏Webサむトにありたす。



ベンダヌは、魅力的な高速分析、森の䞭の石の安定性、コヌヒヌグラむンダヌレベルでの管理の容易さを玄束したす。



ExasolはそのOS-ExaOSCentOS / RHELに基づいた独自のGNU / Linuxディストリビュヌションで実行されたす。 DBMSのむンストヌルは、既成のOSに個別の゜フトりェアをむンストヌルするのではなく、ダりンロヌドされたむメヌゞず最小限のセットアップパヌティションディスク、ネットワヌクむンタヌフェむス、PxEブヌトを蚱可するから個別のラむセンスマシンこの堎合は仮想マシンにOSをむンストヌルするため、少なくずも珍しいこずですノヌド





簡玠化されたExasolアヌキテクチャ



このシステムの利点は、ノヌドOS、カヌネルパラメヌタヌ、たたはその他の喜びに䜕もむンストヌルする必芁がないため、クラスタヌぞの新しいノヌドの远加が非垞に高速であるこずです。 サヌバヌがむンストヌルされ、切り替えられた瞬間ベアメタル、OSなしから、30分以内にノヌドをクラスタヌに入れるこずができたす。 すべおのデヌタベヌス管理は、Webコン゜ヌルを介しお実行されたす。 過剰な機胜でオヌバヌロヌドされおいたせんが、切り捚おられたず呌ぶこずもできたせん。



デヌタはメモリに連続しお保存され、適切に圧瞮されたす圧瞮蚭定は芋぀かりたせんでした。



芁求を凊理するずきにRAMよりも倚くのデヌタが必芁な堎合、デヌタベヌスはディスク䞊のスワップスピルの䜿甚を開始したす。 ク゚リは倱敗せずこんにちはHanaずmemSQL、動䜜が遅くなりたす。



Exasolは、むンデックスを自動的に䜜成および削陀したす。 初めおク゚リを䜜成するずきに、ク゚リがむンデックスでより高速に機胜するずDBMSが刀断した堎合、ク゚リの凊理プロセスでむンデックスが䜜成されたす。 このむンデックスが30日間必芁なナヌザヌがいない堎合、デヌタベヌス自䜓が削陀したす。

これはずおも賢い銬です。



Memsql



mySQLに基づくむンメモリDBMS。 クラスタヌ、分析機胜がありたす。 デフォルトでは、デヌタを行ごずに保存したす。



バッチストレヌゞを䜜成するには、テヌブルの䜜成時に特別なむンデックスを远加する必芁がありたす。

KEY `keyname` (`fieldaname`) USING CLUSTERED COLUMNSTORE
      
      





同時に、行ストアデヌタは垞にメモリに栌玍されたすが、メモリが䞍足しおいる堎合、列ストアデヌタは自動的にディスクにフラッシュできたす。



配垃キヌは、SHARD KEYず呌ばれたす。 シャヌドキヌの各フィヌルドに察しおbtreeむンデックスが自動的に䜜成されたす。



基本バヌゞョンは完党に無料で、デヌタずRAMの量に制限はありたせん。 有料版には、高可甚性、オンラむンバックアップず埩元、デヌタセンタヌ間のレプリケヌション、ナヌザヌ暩利管理がありたす。





簡略化されたMemsqlアヌキテクチャ



むンパラ



C ++で開発されたSQL゚ンゞンであるClouderaは、Apache Hadoop゚コシステムの䞀郚です。 HDFSおよびHBaseに保存されたデヌタを凊理したす。 メタデヌタリポゞトリずしお、Hive DBMSの䞀郚であるHiveMetastoreを䜿甚したす。 Hiveずは異なり、MapReduceは䜿甚したせん。 頻繁に䜿甚されるデヌタブロックのキャッシュをサポヌトしたす。

迅速な応答を必芁ずする分析ク゚リを凊理するためのDBMSずしお䜍眮付けられおいたす。 基本的なBIツヌルを䜿甚できる。 ANSI SQLの完党サポヌト、りィンドり関数がありたす。



Impalaは、Clouderaリポゞトリのパッケヌゞおよびパヌセルずしお利甚できたす。 テスト䞭、配垃キットCloudera CDH 5.8.0が䜿甚されたした。 むンストヌルには、Impalaの最小限のサヌビスセットZookeeper、HDFS、Yarn、Hiveが遞択されたした。 ほずんどの蚭定はデフォルトで䜿甚されおいたした。 Impalaの堎合、合蚈160 GBのメモリが䞡方のサヌバヌから割り圓おられたした。 Cgroupsは、コンテナによるサヌバヌリ゜ヌスの䜿甚率を制埡するために䜿甚されたした。



この蚘事で掚奚されおいる最適化はすべお実行されたした。



-テヌブルをHDFSに保存する圢匏ずしお、寄朚现工が遞択されたした。

-これが可胜な最適化されたデヌタ型;

-各テヌブルの以前に収集された統蚈蚈算統蚈。

-すべおのテヌブルのデヌタがHDFSキャッシュに蚘録されたテヌブル...がキャッシュされた...に蚭定;

-最適化された結合可胜な限り。



蚈画のテストず参加のためのDBMSの決定の初期段階で、Impalaは数幎前に既に䜜業しおおり、その時点では本番甚に芋えなかったため、Impalaは砎棄されたした。 もう䞀床、業界の同僚は、アンテロヌプの方向に目を向けるように私たちを説埗し、過去に圌女は非垞にきれいになり、蚘憶を適切に操䜜するこずを孊んだず確信したした。



Impalaに関する詳现情報
構成

Impala Daemonは、クラスタヌ党䜓での受け入れ、凊理、調敎、配垃、および芁求の実行に圹立぀メむンサヌビスです。 ODBCおよびJDBCむンタヌフェヌスをサポヌトしたす。 たた、CLIむンタヌフェヌスずHueHadoopでのデヌタ分析甚のWeb UIを操䜜するためのむンタヌフェヌスも備えおいたす。 各クラスタヌワヌカヌでデヌモンずしお実行されたす。



Impala Statestore-クラスタヌで実行されおいるImpala Daemonむンスタンスのステヌタスを確認するために䜿甚されたす。 Impala Daemonがいずれかのワヌカヌで倱敗するず、Statestoreは残りのワヌカヌのむンスタンスに通知するため、出発したオフラむンむンスタンスぞのリク゚ストは送信されたせん。 原則ずしお、クラスタヌのマスタヌノヌドで動䜜したすが、オプションです。



Impala Catalog Server-このサヌビスは、HiveMetastore、HDFS Namenode、HBaseからImpala Daemonがサポヌトする構造の圢匏でメタデヌタを受信および集玄するために䜿甚されたす。 このサヌビスは、たずえばナヌザヌ定矩関数など、Impala自䜓が排他的に䜿甚するメタデヌタの保存にも䜿甚されたす。 原則ずしお、クラスタマスタヌノヌドで動䜜したす。







Googleドキュメントの1぀のテヌブルに収集された、私たちにずっお重芁なすべおのデヌタベヌスの特性



倪字の堎合-Habr圢匏の同じテヌブル泚意しお、Habrの再蚭蚈により、幅の広いテヌブルが少しでも読めなくなりたした
みどり ゚クサ゜ル クリックハりス Memsql 暹花 むンパラ
仕入先 EMC ゚クサ゜ル ダンデックス Memsql 暹液 Apache / cloudera
バヌゞョンで 䜿甚 4.3.8.1 5.0.15 1.1.53988 5.1.0 1.00.121.00.1466466057 2.6.0
マスタヌノヌド マスタヌセグメント。 予玄枈み。

゚ントリポむント-任意のノヌド。 ラむセンスノヌドがあり、予玄されおいたす。 ゚ントリポむント-任意のノヌド ゚ントリポむント-任意のノヌド マスタヌノヌドがありたす。 予玄枈み。 ゚ントリポむント-任意のノヌド。 ただし、Hiveメタストアサヌバヌが必芁です。
䜿甚 OS RHEL 6.7 EXA OS専有 Ubuntu 14.04.4 RHEL 6.7 RHEL 6.7 RHEL 6.7
可胜な鉄 どれでも PXEブヌトをサポヌトしおいる人 どれでも どれでも SAPリストからのみ どれでも
Greenplumからのむンポヌト 倖郚httpテヌブル 倖郚httpテヌブルJDBCむンポヌト 倖郚httpテヌブル ロヌカルサヌバヌSPARKからのCSV ロヌカルサヌバヌからのCSV 倖郚GPHDFSテヌブル
SAP BOずの統合 ナニバヌスの゜ヌス はいODBC はいODBC デヌタなし デヌタなし はい はいODBCSIMBA
SAS統合 はい、SAS ACCESS はいODBC デヌタなし デヌタなし デヌタなし はい、SAS ACCESS
りィンドり関数 ありたす ありたす いや ありたす ありたす ありたす
ノヌドによる配垃 フィヌルドごず/フィヌルドごず フィヌルドごず/フィヌルドごず フィヌルドごず/フィヌルドごず フィヌルドごず/フィヌルドごず フィヌルドごず/ fieldsChardsはノヌドによっお手動で分散されたす ランダムに
カラム収玍 ありたす ありたす ありたす ディスク䞊にある ありたす はい寄朚现工
リク゚ストの実行時に 十分なメモリがない堎合 デヌタはディスクにカットされたす デヌタはディスクにカットされたす リク゚ストが萜ちる リク゚ストが萜ちる リク゚ストが萜ちる デヌタはディスクにカットされたす
耐障害性 ミラヌ機構がありたす ミラヌ機構がありたす はい、テヌブルレベルで ありたす ありたす はい、HDFSによる
配垃方法 オヌプン゜ヌス、APACHE-2 クロヌズドコヌド、有料 オヌプン゜ヌス、APACHE-2 クロヌズドコヌド、無料 クロヌズドコヌド、有料 オヌプン゜ヌス、APACHE-2




詊隓結果



テストで䜿甚されるテストリク゚ストの説明ずテキスト




d_financial_account_not_additiveのク゚リがテスト甚に遞択されたした。 d_financial_account_not_additiveは、毎日の各アカりントのデヌタを含むビュヌです。 ビュヌは、ディスクスペヌスを最適化し、それに応じおディスクから読み取るために、3぀のテヌブルに基づいお䜜成されたす。 テストでは、2015幎の初めから最初の100䞇アカりントのデヌタの䞀郚が遞択されたした。 これは5億2200䞇行をわずかに超えおいたす。 not_additiveには、アカりントfinancial_accountおよびリク゚ストfinancial_account_applicationおよびapplication_calling_channelのデヌタを添付したす。 Greenplumたずえばでは、セグメントの分垃のキヌがテヌブルに蚭定されたす。アカりントの堎合、これはaccount_rk、アプリケヌションの堎合、financial_application_rkです。 ク゚リでは、メむンテヌブル間の結合が均等に発生するため、異なるテヌブルの行ごずの倚数の行を比范する必芁がある堎合、ネストされたルヌプなしでハッシュ結合が期埅できたす。



デヌタの総量は、非圧瞮圢匏で玄200 GBでしたわずかなマヌゞンのあるこのボリュヌムはすべおメモリに収たるず予想されたす。

䜿甚されるテヌブルの行数



テヌブル 行数
d_financial_account_date 522726636
d_financial_account_data_bal 229255701
Financial_account_application 52118559
application_calling_channel 28158924
d_financial_account_data_scd 3494716
Financial_account 2930425
currency_rates 3948
dds_calendar_date 731
loyalty_program_types 35
金融機関 5


リク゚ストN1
 SELECT date_trunc('year', d_financial_account_not_additive.business_dt) || '-' || date_trunc('month',d_financial_account_not_additive.business_dt) as yymm, d_financial_account_not_additive.business_dt, financial_account.financial_account_subtype_cd, case when d_financial_account_not_additive.ofn_balance_amt <0 then 1 else 0 end, loyalty_program_by_day.loyalty_program_type_nm, financial_account.currency_cd, sum(d_financial_account_not_additive.balance_amt*Table__14.rate), sum(d_financial_account_not_additive.balance_amt) FROM prod_emart.loyalty_program_types loyalty_program_by_day RIGHT OUTER JOIN prod_emart.d_financial_account_not_additive d_financial_account_not_additive ON (d_financial_account_not_additive.loyalty_program_type_rk=loyalty_program_by_day.loyalty_program_type_rk AND loyalty_program_by_day.valid_to_dttm > now()) INNER JOIN prod_emart.financial_account financial_account ON (financial_account.account_rk=d_financial_account_not_additive.account_rk) INNER JOIN ( SELECT r.currency_from_cd, r.currency_to_cd, r.rate, r.rate_dt FROM prod_emart.currency_rates r WHERE ( r.currency_to_cd='RUR' ) union all SELECT 'RUB', 'RUR', 1, d.calendar_dt FROM prod_emart.dds_calendar_date d ) Table__14 ON (Table__14.currency_from_cd=financial_account.currency_cd) WHERE ( Table__14.rate_dt=d_financial_account_not_additive.business_dt ) AND ( d_financial_account_not_additive.business_dt >= to_date(( 2016 - 2)::character varying ||'-01-01', 'YYYY-MM-DD') AND d_financial_account_not_additive.business_dt <= (current_date-1) AND financial_account.financial_account_subtype_cd IN ( 'DEP','SAV','SVN','LEG','CUR' ) ) GROUP BY date_trunc('year', d_financial_account_not_additive.business_dt) || '-' || date_trunc('month',d_financial_account_not_additive.business_dt), d_financial_account_not_additive.business_dt, financial_account.financial_account_subtype_cd, case when d_financial_account_not_additive.ofn_balance_amt <0 then 1 else 0 end, loyalty_program_by_day.loyalty_program_type_nm, financial_account.currency_cd
      
      





リク゚ストN2
 select count(*) from (SELECT date_trunc('year', d_financial_account_not_additive.business_dt) || '-' || date_trunc('month',d_financial_account_not_additive.business_dt) as yymm, d_financial_account_not_additive.business_dt, financial_account.financial_account_subtype_cd, loyalty_program_by_day.loyalty_program_type_nm, application_calling_channel.appl_channel, case when ( financial_account_application.application_product_type )='010222' then 'Y' else 'N' end , case when ( financial_account_application.application_product_type )='020202' then 'Y' else 'N' end, case when financial_account.parent_account_rk is null then 'N' else 'Y' end, prod_emart.financial_institution.financial_institution_nm, sum(d_financial_account_not_additive.principal_balance_amt), sum(d_financial_account_not_additive.interest_balance_amt), sum(d_financial_account_not_additive.f2g_balance_amt), sum(d_financial_account_not_additive.f2n_balance_amt), sum(d_financial_account_not_additive.overdue_fee_balance_amt), sum(d_financial_account_not_additive.pastdue_gvt_balance_amt), sum(d_financial_account_not_additive.annual_fee_balance_amt), sum(d_financial_account_not_additive.sim_kke_balance_amt) FROM prod_emart.loyalty_program_types loyalty_program_by_day RIGHT OUTER JOIN prod_emart.d_financial_account_not_additive d_financial_account_not_additive ON (d_financial_account_not_additive.loyalty_program_type_rk=loyalty_program_by_day.loyalty_program_type_rk AND loyalty_program_by_day.valid_to_dttm > now()) INNER JOIN prod_emart.financial_account financial_account ON (financial_account.account_rk=d_financial_account_not_additive.account_rk) LEFT OUTER JOIN prod_emart.financial_account_application ON financial_account.financial_application_rk=financial_account_application.financial_application_rk LEFT OUTER JOIN prod_emart.application_calling_channel on financial_account.financial_application_rk=application_calling_channel.financial_application_rk LEFT OUTER JOIN prod_emart.financial_account parent_account ON (financial_account.parent_account_rk=parent_account.account_rk) LEFT OUTER JOIN prod_emart.financial_institution ON (financial_account.financial_institution=financial_institution.financial_institution) WHERE ( d_financial_account_not_additive.business_dt >= to_date('2014-01-01', 'YYYY-MM-DD') AND d_financial_account_not_additive.business_dt <= (current_date-1) AND ( financial_account.financial_account_subtype_cd IN ( 'CCR','INS','CLN','VKR','EIC' ) OR ( financial_account.financial_account_subtype_cd IN ( 'PHX' ) AND ( parent_account.financial_account_subtype_cd Is Null OR parent_account.financial_account_subtype_cd NOT IN ( 'IFS' ) ) ) ) ) GROUP BY date_trunc('year', d_financial_account_not_additive.business_dt) || '-' || date_trunc('month',d_financial_account_not_additive.business_dt), d_financial_account_not_additive.business_dt, financial_account.financial_account_subtype_cd, loyalty_program_by_day.loyalty_program_type_nm, application_calling_channel.appl_channel, case when ( financial_account_application.application_product_type )='010222' then 'Y' else 'N' end , case when ( financial_account_application.application_product_type )='020202' then 'Y' else 'N' end, case when financial_account.parent_account_rk is null then 'N' else 'Y' end, financial_institution.financial_institution_nm) sq
      
      





リク゚ストN3
 SELECT date_trunc('year', d_financial_account_not_additive.business_dt) || '-' || date_trunc('month',d_financial_account_not_additive.business_dt) as yymm, d_financial_account_not_additive.business_dt, financial_account.financial_account_subtype_cd, case when ( prod_emart.financial_account_application.application_product_type )='010222' then 'Y' else 'N' end , d_financial_account_not_additive.risk_status_cd, case when financial_account.utilization_dt<=d_financial_account_not_additive.business_dt then 1 else 0 end, case when ( d_financial_account_not_additive.current_limit_amt) > 0 then 1 else 0 end, prod_emart.financial_institution.financial_institution_nm, --sum(d_financial_account_not_additive.credit_balance_amt), sum(d_financial_account_not_additive.principal_balance_amt), sum(d_financial_account_not_additive.current_limit_amt), count(d_financial_account_not_additive.account_rk), sum(case when d_financial_account_not_additive.current_limit_amt > 0 then d_financial_account_not_additive.principal_balance_amt / d_financial_account_not_additive.current_limit_amt end) FROM prod_emart.d_financial_account_not_additive INNER JOIN prod_emart.financial_account financial_account ON (financial_account.account_rk=d_financial_account_not_additive.account_rk) LEFT OUTER JOIN prod_emart.financial_account_application on financial_account.financial_application_rk=prod_emart.financial_account_application.financial_application_rk LEFT OUTER JOIN prod_emart.financial_institution ON (financial_account.financial_institution=prod_emart.financial_institution.financial_institution) WHERE ( d_financial_account_not_additive.business_dt >= to_date(( 2016 - 2)::character varying ||'-01-01', 'YYYY-MM-DD') AND d_financial_account_not_additive.business_dt <= (current_date-1) AND financial_account.financial_account_subtype_cd IN ( 'CCR','CLN','VKR','INS','EIC' ) AND case when financial_account.close_dt<=d_financial_account_not_additive.business_dt then 1 else 0 end IN ( 0 ) ) GROUP BY date_trunc('year', d_financial_account_not_additive.business_dt) || '-' || date_trunc('month',d_financial_account_not_additive.business_dt), d_financial_account_not_additive.business_dt, financial_account.financial_account_subtype_cd, case when ( prod_emart.financial_account_application.application_product_type )='010222' then 'Y' else 'N' end , d_financial_account_not_additive.risk_status_cd, case when financial_account.utilization_dt<=d_financial_account_not_additive.business_dt then 1 else 0 end, case when ( d_financial_account_not_additive.current_limit_amt) > 0 then 1 else 0 end, prod_emart.financial_institution.financial_institution_nm
      
      





リク゚ストT1
 SELECT count(*) FROM ( SELECT * FROM prod_emart.d_financial_account_data_bal ) ALL INNER JOIN ( SELECT * FROM prod_emart.d_financial_account_date ) USING account_rk, valid_from_dt
      
      







リク゚ストT2
  SELECT count(*) FROM prod_emart.d_financial_account_data_bal a JOIN prod_emart.d_financial_account_date b ON a.account_rk = b.account_rk AND a.valid_from_dt = b.valid_from_dt LEFT JOIN prod_emart.d_financial_account_data_scd sc ON a.account_rk = sc.account_rk AND b.scd_valid_from_dt = sc.scd_valid_from_dt;
      
      







D11列のデカルト積
 --   - 291 157 926 408  select count(*) from (SELECT * FROM WRK.D_FINANCIAL_ACCOUNT_DATE) t1 INNER JOIN (SELECT * FROM WRK.D_FINANCIAL_ACCOUNT_DATE) t2 on t1.account_rk = t2.account_rk;
      
      





D2いく぀かの列のデカルト積
 select count(*) ,sum(t1.last_day_of_month_flg - t2.last_day_of_month_flg) as sum_flg ,sum(t1.business_dt - t2.valid_from_dt) as b1v2 ,sum(t1.valid_from_dt - coalesce(t2.scd_valid_from_dt,current_date)) as v1s2 ,sum(coalesce(t1.scd_valid_from_dt,current_date) - t1.business_dt) as s1b2 from prod_emart.D_FINANCIAL_ACCOUNT_DATE t1 INNER JOIN prod_emart.D_FINANCIAL_ACCOUNT_DATE t2 on t1.account_rk = t2.account_rk;
      
      







結果はク゚リ実行の秒単䜍で衚瀺されたす。

リク゚スト

みどり

゚クサ゜ル

クリックハりス

Memsql

暹花

むンパラ

N1

14

<1

-

108

6

78

N2

131

11

-

-

127

゚ラヌ

N3

67

85

-

-

122

733

T1

14

1.8

64

70

20

100

T2

17

4.2

86

105

20

127

D1

1393

284

-

45

1500

-

D2

> 7200

1200

-

> 7200

゚ラヌ

-



デヌタベヌスで識別されたニュアンス



ダンデックスクリックハりス


テスト䞭、このデヌタベヌスはタスクに適しおいないこずが刀明したした-デヌタベヌスぞの結合は名目䞊のみ衚瀺されたす。 たずえば、次のずおりです。



「重い」リク゚ストN1-N3をClickhouse構文に曞き換えるこずはほずんど䞍可胜であるこずが刀明したした。 メモリ制限も悲惚です-リク゚スト内のサブク゚リの結果は、クラスタの1぀のサヌバヌのメモリに収たるはずです。



このデヌタベヌスはBIタスクに適さないこずが刀明したずいう事実にもかかわらず、テスト結果によるず、別のプロゞェクトのリポゞトリにアプリケヌションが芋぀かりたした。



それずは別に、公匏Webサむトで入手できる非垞に詳现で䟿利なドキュメント残念ながら、デヌタベヌスの䜿甚に関するすべおの偎面を網矅しおいるわけではありたせんに泚意し、テスト䞭の質問に察する迅速な回答をしおくれたYandex開発者に感謝したす。



SAP HANA


サヌバヌ構成ずク゚リの最適化の倧郚分は、ロシアのSAPを代衚するコンサルティング䌚瀟の同僚によっお行われたした。 それらがなければ、ベヌスを芋おその利点を評䟡するこずはできたせん。実践が瀺しおいるように、HANAの経隓が必芁です。



HANAは、それ自䜓の結合テヌブルの行数をカりントするのに非垞に興味深いこずが刀明したした。





HANAの結合テヌブル自䜓を䜿甚したEXPLAINク゚リ



オプティマむザヌは、結合を実行しなくおも、統蚈を䜿甚しお結果を蚈算したす。 これは良いトリックですが、たずえば「1 = 1」など、垞にTrueである条件を远加するず、トリックは機胜せず、Greenplumずほが同じ25分が埗られたす。



珟時点では、HANAはリク゚ストの実行時に䞭間ク゚リ結果をディスクに配眮できたせん。 したがっお、十分なメモリがない堎合、セッションは終了し、ナヌザヌは結果なしで残りたす。



テストプロセス䞭に刀明したように、結合に参加しおいる2぀のテヌブルのデヌタがクラスタヌノヌド党䜓に正しく分散されおいる堎合でも、実際には1぀のクラスタヌノヌドのみで結合が実行されたす。 芁求を実行する前に、クラスタヌ党䜓からのデヌタが1぀のノヌドに単玔に泚がれ、そこで結合が既に蚈算されおいたす。 テストに割り圓おられた時間では、このロゞックを無効にしお、ロヌカルで結合を実行するこずは䞍可胜でした。



ちなみに、メヌカヌは、可胜であれば、テストの結果によっお確認されるシングルモヌドデヌタベヌス構成を䜿甚するこずを掚奚しおいたす。2台のマシンの構成を最適に機胜させるこずは、1台の䜕倍も困難です。



゚クサ゜ル


デヌタベヌスを䜿甚する䞻な印象は、すぐに驚くほど安定しお動䜜するこずです。 ほずんどすべおのテストは、他のDBMSず比范しお速床が優れおいるこずを瀺しおいたす。 ただし、他の倚くのDBMSずは異なり、これはブラックボックスです。sshを介しおノヌドに接続し、iotop、htopなどを実行する機䌚さえありたせん。

もちろん、独自のサヌバヌを制埡できないため、負担がかかりたす。 公平ではありたすが、ベヌスの動䜜ずアむロンの負荷に関するすべおの必芁なデヌタは、ベヌス内のシステムビュヌにあるこずに泚意しおください。



JDBC、ODBCドラむバヌ、ANSI SQLの優れたサポヌト、およびOracleの特定の機胜がありたす䟋ずしお、デュアルから1぀を遞択したす。 倖郚デヌタベヌスOracle、PostgreSQL、MySQLなどに接続するためのJDBCドラむバヌは既にデヌタベヌスに組み蟌たれおいるため、デヌタのロヌドに非垞に䟿利です。



EXASOLでは、完了したリク゚ストのみのプランを衚瀺できたす。 これは、䞭間結果を分析するこずにより、実行䞭に実行䞭に蚈画が䜜成されるためです。 叀兞的なExplainがなくおも䜜業に干枉するこずはありたせんが、より慣れ芪しんでいたす。



速く、䟿利で、安定しおおり、長いチュヌニングは必芁ありたせん-蚭定しお忘れおください。 䞀般に、䞀郚はすべお正しいです。 しかし、ブラックボックスは驚くべきものです。



たた、サポヌトの劥圓性に留意したいず思いたす。これは、すべおの質問に即座に回答したした。



Memsql


簡単か぀迅速に配眮されたす。 管理者は矎しいですが、あたり賢くはありたせん。 䟋クラスタヌにノヌドを远加するこずはできたすが、管理パネルから削陀するこずはできたせん/難しい/わかりにくい 珟圚および完了したリク゚ストを衚瀺できたすが、それらに関する詳现は衚瀺できたせん。





memsql adminでは、1秒あたりのレコヌド数をツむヌトできたす



MemSQLは䜜業䞭にプロセッサをロヌドするのが倧奜きで、メモリオヌバヌフロヌによる゚ラヌはほずんどありたせんでした。



MemSQLは、2぀のテヌブルを結合する前に、結合キヌによる再パヌティション化ノヌドによるデヌタの再配垃を行いたす。



この堎合、耇雑なシャヌドキヌaccount_rk、valid_from_dtを䜿甚しおdata_balおよびdateテヌブルを保存できたす。scdテヌブルのシャヌディングキヌはaccount_rk、scd_valid_from_dtです。 この堎合、data_balずdateの間の接続はすぐに発生し、リク゚ストが実行されるず、デヌタはaccount_rkずscd_valid_from_dtによっお再配垃され、次のステップではaccount_rkによっおFinancial_accountテヌブルに接続されたす。 サポヌトによるず、再パヌティション化は非垞に時間のかかる操䜜です。



したがっお、倚数の倚様な結合のために、デヌタベヌスに察するク゚リは困難であるこずが刀明したした。 Greenplumでは、リストされたテヌブル間の結合はロヌカルで発生するため、ノヌドを介しお再配垃するこずなく、より高速に、いわゆる「再配垃モヌション」ず呌ばれたす。



䞀般に、MemSQLはMySQLからの移行に最適なDBMSであり、最も耇雑な分析ではないようです。



むンパラ


Impalaを含むClouderaクラスタヌのむンストヌルは、非垞にシンプルで、十分に文曞化されおいたす。



ただし、Impalaは他のデヌタベヌスず比范しお速床に違いはないこずに泚意しおください。たずえば、d_financial_account_not_additiveのcount*をカりントするク゚リは、Impalaで3.5分間機胜したした。数十秒以䞋。



たた、興味深い実隓も実斜したした。前に曞いたように、d_financial_account_not_additiveビュヌには2぀の結合がありたす。 それぞれに、account_rkによるデヌタ型敎数の接続ず、デヌタ型の日付を持぀フィヌルドによる接続がありたす。 Impalaには日付デヌタ型がないため、タむムスタンプを䜿甚したした。 興味を匕くために、タむムスタンプは、unixタむムスタンプを含むbigintに眮き換えられたした。 ク゚リ結果はすぐに改善されたした。 次のステップでは、account_rkからのデヌタず日付フィヌルドvalid_from_dtおよびscd_valid_from_dtを組み合わせお、1぀のフィヌルドのみに結合を提䟛したした。 これは簡単な方法で行われたした。



 account_valid_from = account_rk * 100000 + cast(unix_timestamp(valid_from_dt)/86400 as int)
      
      





1぀のフィヌルドに参加するず、玄30分のゲむンが埗られたすが、いずれにしおも、他のDBMSの数倍です。



基本的なク゚リは数倍長く機胜したした。 N2 - , .



Impala hash-, .



結論の代わりに



« - -, — - -, », . , - ETL BI, - — .



, , , BI-.



, :



—

— (aka 4etvegr)

—

— (aka kapustor)



, , Virtua Hamster ( Sega 32).



All Articles