2016-09-19 1 views
15

私はapache-drillを使って単純なjoin-aggregateクエリを実行しようとしましたが、速度はあまり良くありませんでした。私のテストクエリは:apache drill bad performance

SELECT p.Product_Category, SUM(f.sales) 
FROM facts f 
JOIN Product p on f.pkey = p.pkey 
GROUP BY p.Product_Category 

実際には約422,000の行があり、製品には600行がありました。グループ化は4行に戻ります。

まず、このクエリをSqlServerでテストした結果、約150ms後に結果が得られました。

ドリル私は最初にSqlServerに直接接続してクエリを実行しようとしましたが、遅かった(約5秒)。

私はテーブルをjsonファイルに保存して読み込みましたが、それはさらに遅くなっていましたので、私は寄木細工のファイルを試しました。

私は約3秒で最初の実行で結果を返しました。次回の走行は約900msで、その後約500msで安定した。

周囲から読んで、これは意味をなさないので、ドリルは速くすべきです! "REFRESH TABLE METADATA"を試しましたが、速度は変わりませんでした。

ドリルコマンドラインを使用して、これをウィンドウで実行していました。

何か追加の設定が必要な場合は、

ありがとうございます!

答えて

5

ここでApache Drillがより高速になると思われる理由は何ですか?ドリルは非常に高速ですが、ですが、大規模な分散クエリのために設計されていますが、いくつかの異なるデータソースに対応していますが、分散データは使用していません。

SQL Serverには、1つのサーバー上で実行される最も高速なリレーショナルデータベースの1つになる数十億のコードと最適化があります。データは効率的に保存され、メモリにキャッシュされ、同じプロセスでクエリが実行されるため、スキャンや結合は非常に高速になります。

Apache Drillは、比較のためにはるかに多くの作業が必要です。クエリを分散プランに変換してから、すべてのドリルビットプロセスに送信し、データソースを検索し、生データにアクセスし、クエリを実行し、結果を最初のノードに返し、次に最終出力を得なければなりません。

JSONファイルも、1行ずつ開いて解析する必要があるため、処理速度が遅くなります。寄木細工は、スキャンには非常に効率的な、圧縮された列指向の記憶形式なので、はるかに高速ですが、前述のようにクエリを実行するためにはドリルがまだ多く必要です。データソースに応じて、Drillはすべてのデータを読み込み、それを別々にフィルタリングしなければならない場合があります。

任意のリレーショナルデータベースは、単一マシンでドリルするよりも高速です。ドリルが500ミリメートルで結果を得るという事実は、パーケットを提供する柔軟性を与えるためにはるかに多くの作業が必要であることを考えると、印象的です。数百万行しかない場合は、SQLサーバーを使用してください。何十億行もある場合は、SQL Serverの列ストア機能を使用して、大きな圧縮とパフォーマンスで列形式のデータを格納します。

使用Apacheのドリルとき:

  • てきた(10Sの)数十億行以上
  • ている多くのマシンに分散データ
  • 標準スキーマなしでファイルに保存されているJSONなどの非構造化データを持っています
  • クエリを複数のマシンに分割して並列化し、高速化したい
  • 異なるデータベースとファイルシステムのデータにアクセスしたい
  • は、人々はドリルがどのように機能するかについて理解する必要があり
2

ことの一つは、ドリルは、理論的には、からデータを取得して処理するために実行可能な計画に、任意のソースをSQLクエリを変換する方法であるこれらの異なるデータソース間でデータを結合したいですデータ。私は故意にデータソースを言わなかったので、人々はデータベースやソフトウェアベースのデータ管理システムを考えないでしょう。

ドリルは、ストレージプラグインがサポートしているデータからレコードを読み取るためにストレージプラグインを使用します。

ドリルは、これらの行を取得した後、それがクエリを実行するのに必要な実行を開始、(特定の列を選択する)の突出、入社、ソート、フィルタリングすることができる必要いただきました...など

だからドリルはしていません既定では、照会されたデータを処理するソースの機能のいずれかを使用します。実際、ソースはそのような機能をサポートしていない可能性があります。

ソースのデータ処理機能を利用するには、このソースにアクセスするために使用しているストレージプラグインを変更する必要があります。私はドリルのパフォーマンスについて考えるとき、私は定期的に覚えて

つのクエリは、唯一の理由>比較演算子のこの1

Select a.CUST_ID, (Select count(*) From SALES.CUSTOMERS where CUST_ID < a.CUST_ID) rowNum from SALES.CUSTOMERS a Order by CUST_ID 

で、ドリルは、テーブル全体をロードする必要があります(つまり、実際には寄木細工のファイル) 、SORT ITを入力して、結合を実行します。

このクエリは、あまり強力ではないマシンで実行するのに約18分かかりましたが、このクエリを処理するためにドリルが実行する必要がある作業は無視してはいけません。

ドリルの目的は高速ではありません。その目的は、膨大な量のデータを処理し、構造化データおよび半構造化データに対してSQLクエリを実行することです。そしておそらく私が今考えていることができない他のものが、他の答えのためのより多くの情報を見つけるかもしれません。

関連する問題