なぜSQL集計機能でよりもずっと遅いですがPythonとJavaは貧しい人間のOLAP)
-
09-06-2019 - |
質問
いのですがDBAの意見を求めている。Postgres8.3間200msの実行のクエリでは自分のMacbook ProをJava、Pythonを同じ計算を20ms(350,000列):
SELECT count(id), avg(a), avg(b), avg(c), avg(d) FROM tuples;
はこの正常動作の場合はSQLデータベース?
このスキーマのテーブルを保有への対応調査):
CREATE TABLE tuples (id integer primary key, a integer, b integer, c integer, d integer);
\copy tuples from '350,000 responses.csv' delimiter as ','
書いた検査の一部をJava、Pythonのためのコンテキストで粉砕SQLを除くの純粋なpython):
java 1.5 threads ~ 7 ms
java 1.5 ~ 10 ms
python 2.5 numpy ~ 18 ms
python 2.5 ~ 370 ms
もsqlite3は競争力があるPostgresにもかかわらず、それがassumping全てのカラムは文字列(コントラストものだけを使い、切り替える数字列の整数ではなく、Postgres結果と10倍の減速)
調弦法たな成功(盲目的で以下のウェブアドバイス):
increased the shared memory available to Postgres to 256MB
increased the working memory to 2MB
disabled connection and statement logging
used a stored procedure via CREATE FUNCTION ... LANGUAGE SQL
その後、私の質問は、私の経験がここには通常、これは何が期待できま利用の場合、SQLデータベース?内容を理解することができる酸べき費用がいと思います。私のなかのリアルタイムゲームの速度が、Javaプを百万倍の下には20msまで、さを感じる嫉妬.
はあるのでよりも簡単なOLAP、安く(両面での金融サーバーの複雑性)?またモンドリアおよび豚+Hadoopなスーパー励起についてもサーバアプリケーションというものです。
なPythonコードでJavaコードの全ての作家とは大きく異なっている点です。私の生成4列における350,000ランダム値は、それぞれにその平均値。私を含めないでください世代にタイミング、平均化する。Javaのスレッドのタイミング用の4つのスレッド(配列平均を失わせないアイテムがレコード店ディスクユニオンのにできます。
のsqlite3のタイミングを駆動するにはPythonプログラムが実行からディスク(メモリ:)
を実現Postgresであっても裏ものがないことが読み込みます。
のPostgresクな変化のタイミングその後の運行しています。
私は再Pythonの試験にスプールでのディスク。のタイミングが遅くなりほぼ4secs.私は推測するPythonのファイルの取り扱いコードなのですが、ここではCのものではないかもcsv lib?) このことを示したことPostgresなストリーミングからのディスクのいずれか(またはそのお正しいという弓の前に誰が書いた貯留層!)
解決
Postgresでは、以上のようにな保持データの整合性のためのスタート!)
場合には価値がない100%スポット、テーブルが更新されながることを計算によくするためには、入を実現景色を高速化しました。
(注ているわけではありません使用を実現しのビューをPostgresう少しhackyものがスイートだ。
えのオーバーヘッドの実際のサーバへの接続での往復に必要な要求の送信をサーバーを行います。
いろいろな200msというこのアーティストの迅速試験my oracleサーバーに同じテーブル構造で約500k行な指標の1-1.5秒であるだけでほぼすべてのoracleを吸ってデータオディスク。
現実の問題は、200msの高速れやすくないでしょうか?
-------------- 以上--------------------
に興味を持っていたのを解くことを実現し、からだった。これはoracle.
最初に作りましたMVを毎に更新さ分。
create materialized view mv_so_x
build immediate
refresh complete
START WITH SYSDATE NEXT SYSDATE + 1/24/60
as select count(*),avg(a),avg(b),avg(c),avg(d) from so_x;
その爽やかなが返される列
SQL> select * from mv_so_x;
no rows selected
Elapsed: 00:00:00.00
一度の更新は、よりはるかに早く、原索
SQL> select count(*),avg(a),avg(b),avg(c),avg(d) from so_x;
COUNT(*) AVG(A) AVG(B) AVG(C) AVG(D)
---------- ---------- ---------- ---------- ----------
1899459 7495.38839 22.2905454 5.00276131 2.13432836
Elapsed: 00:00:05.74
SQL> select * from mv_so_x;
COUNT(*) AVG(A) AVG(B) AVG(C) AVG(D)
---------- ---------- ---------- ---------- ----------
1899459 7495.38839 22.2905454 5.00276131 2.13432836
Elapsed: 00:00:00.00
SQL>
した場合に挿入するテーブルの結果が示のオープンする。
SQL> insert into so_x values (1,2,3,4,5);
1 row created.
Elapsed: 00:00:00.00
SQL> commit;
Commit complete.
Elapsed: 00:00:00.00
SQL> select * from mv_so_x;
COUNT(*) AVG(A) AVG(B) AVG(C) AVG(D)
---------- ---------- ---------- ---------- ----------
1899459 7495.38839 22.2905454 5.00276131 2.13432836
Elapsed: 00:00:00.00
SQL>
でも、ちょっと待った分でのMVを更新裏の結果が返される高速していきます。
SQL> /
COUNT(*) AVG(A) AVG(B) AVG(C) AVG(D)
---------- ---------- ---------- ---------- ----------
1899460 7495.35823 22.2905352 5.00276078 2.17647059
Elapsed: 00:00:00.00
SQL>
こんに最適です。スタートではなく、オシロスコープのリアルタイム挿入/更新はすぐに見えています。またなんかのクエリー走行のMVが必要かどうかではない(この曲を何時間フレーム、またはいます。が、これはどのようにはなく、MVすることができるよう、そうにエンドユーザーの方にご利用できればと暮らす価値なものまでの精度です。
他のヒント
私はテストスキームではないかと、思ったりしました。ためのdbクエリのdbサーバを複数の手順:
- SQLの構文解析
- ワークエリプランですe.を決定する指標を使用する場合)、最適化など。
- 場合にインデックスが使用されると、検索でのポインタの実際のデータ、その後の適切な位置にデータ
- ていない場合にインデックスが使用されると、スキャン 全体のテーブル を行が必要
- 負荷のデータからのディスクの一時的な位置(いものではありません、メモリ)
- を行い、count()、avg()の計算
なので、配列にPythonを平均基本的にスキップすべてのこれらの手順を保存立つブログが数多くあります。としてディスクI/Oが最も高価な業務プログラムは、この大きな欠陥は、試験の回答 この質問 またこの前で紹介したことがありますか?場合でも書の記載事項をよく読んでからのデータディスクにその他の試験のプロセスを完全に異なるかどう関連する結果です。
の情報も得られる場Postgres過ごその時、私はあなたが以下の試験:
- 比較の実行時間のクエリを選択な集計機能においてe.カットステップ5)
- この集計の大幅な減速した場合はPythonでは、取得のrawデータの平野から選択します。
を高速に検索すると、ディスクの低減にアクセスします。いくことで、凝集する。
あ行かない:
- キャッシュデータ(メモリ!) その後のアクセスのいずれかのdbエンジン独自の機能やツールのように瞬時に
- 削減のサイズを保存したデータ
- 最指す"ことである。このた大きめのスキップ指数の使用のた後でディスクアクセスがあります。のためのMySQLは記憶しているのでおすすめスキップ指数の場合このようなクエリを取り出し10%以上のすべてのデータを表に示す。
- た場合の指標をもたらすであろうと確信しておめのMySQLデータベースで入れる指標データを別々の物理ディスク.しかしその適用のためのPostgres.
- ももの高度化などの問題を入れ替えを行ディスクには何らかの理由により、あなたは結果セットが完全にできな処理されます。もうそのような研究まで実行されるために重要なパフォーマンスに問題が見つからなるもう一つの方法の修正が必要とする知識は多くの少し下でのフードの詳細に。
更新:
はないことをしまうというか一姫さんなるほどたしかに上がり指数上記のクエリがないをも通じているわけですから、かなり助言指しょうか。います。ただ、僕は凝集しないの問題がディスクアクセスです。てしまい指標も、とにかくいので、もしか利用します。
私は、訓MySQLを指定するエンジン=メモリと変化していませんのもふもふをご堪能ください(まだ200する機能が備わっています。Sqlite3を用いたメモリdbを同様のタイミングとして、250する機能が備わっています。
算引き算など余計な計算は こちらの 見正(少なくともサイズにも直結しているので、どこにどれほど大きsqlite db:-)
んとなく購入のディスク-原因-遅引数が表示は、テーブルメモリ(postgresうすべての警告に対してもピンテーブルに記憶していを誓う、OSりますのプログラマー)
を明らかにしのタイミングのJavaコードではありませんからの読み出しディスクでは全く不正との比較の場合Postgres読み込み中からのデータでの計算複雑なクエリー、その他のDBのはスマートに十分に小さなテーブルをメモリにロードおよびprecompile保存されている手順ぁ.
更新に対応の最初のコメント):
なんなのかどうかを試験し、クエリを使わずに凝集能とするものであるとかすればすべて選択を行で過ごしトンの直列化さとのフォーマットです。と言うつもりはありませんので遅めの凝集機能で、まだまだ十分とはいえませんがすぐ架からの並行処理、完全性ます。んかの単離と凝集として唯一の独立変数となります。
とても詳細な回答がほぼbegのか、どのようにこれらの給付にいながPostgresのデータを簡単にぴメモリが必要で同時に読み込みが書き込みが照会される同じクエリです。
ことはできprecompileクエリを最適化すか?うになると思っていましたが、保存の手続きいことなんです。
を避けるディスクアクセスで必要なキャッシュのテーブルに記憶でしPostgresいる。と思うのでこれからクエリを実行するだけで200msを繰り返して実行します。
できているというお話をしていPostgresのテーブルが読み取りのみでは適合の固定コードについて教えてください。
できると思うのクエリーの建設コストは空のテーブル(タイミング範囲から20-60ms)
があまりできなかった理由は、Java/Pythonの試験を無効となります。Postgresだけではないかに仕事がまだまだなの並行処理の側面のキャッシング、クエリー構築)
更新:とは思わないで公正な比較して選定したことで引き350,000のドライバを直列化手順にPythonの集計なものを省の凝集としてのオーバーヘッドフォーマットと表示が分離しにくいからです。場合もエンジンは営業上のメモリデータであれば、りんごりんごの比較、なんなのかどのよう保証することで起きていますが。
んを追加する方法を見つけ出すことコメントかな?
私はMS-SQLの男は自分自身に利用されています。 DBCC PINTABLE いテーブルのキャッシュされ、 設定統計IO しているのを見るの読書からのキャッシュさせます。
かにPostgres生PINTABLEが pg_buffercache そうい内容のキャッシュ-メッセージ-チェックしたいことを確認してくださいテーブルでは実際にキャッシュされます。
速の封筒計算する私の疑いるページングからのディスク。仮にPostgres用4バイト整数、(6*4)バイト配列は、テーブルは、最小の(24*350,000)バイト~8.4MBです。仮に40MB/sの持続的なスループットのごHDD、いろ200msデータを読みる 指摘されているように、, きがほとんどの時間は気になれないと思うから).
場合を除いて奮私は数学のどこかでんしていませんのでご注意くださきがきちんとできていることをお読み8MBおJavaアプリを処理して、まず自分のいるファイルが既にキャッシュのいずれかからのドライブやOS.
いとは思わない結果すべてが驚きであれば何でもあるPostgresいます。
なPostgresクエリの実行の時までとしたキャッシュのデータはもらえますか?少し公正な試験のためのJava、Pythonはカ国-地域のカントリーリスク情取得データの理想的載荷でのディスク).
このパフォーマンスレベルの問題のためにお申し込みが必要なものRDBMSその他の理由にしば見 memcached.だければ迅速にキャッシュへのアクセスrawデータとなる計算コードです。
を使用していまTCPへのアクセスPostgres?その場合Nagleはゴとタイミングでした。
他にも、RDBMSの情報等の全部又は一部をご提供する並行処理による保護から同時にアクセス。この行をロックが一部に架かる。
れば対応完全に静的なデータが変わることはありませんが、その場合の使い方基本的には"シングルユーザー"のシナリオ、それをデータベース化して必ずおります。
す増加するために必要なpostgres'キャッシュの全体の作業を設定くのメモリへの前に見ることが予想でき夫に匹敵していることがでメモリとプログラム。
のOracleのタイミングはどちらかと言えばそういうものを探してい(残念なが:-)
実現した意見をも検討に値といえるのではないかと思っていprecompute最も興味深いのはこのクエリをほとんどのユーザー
とは思わないクエリの往復時間は非常に高い走行には問合せのと全く同じることPostgresので、追加ができない潜?
いものにチェックインのキャッシュサイズ、そうでPostgresに依存して、OSの対応キャッシュは、具体的にはもBSDとして理想的なOSのためにこう考え方Mac OSうのは、僕のスマートに持ちを表示しますいのが特定のparams考えてきていると思い特定のキャッシュはの後に続きが出来るのかって?
最終的にできるだろうと200msの応答時間が、この7msが対象かった不満を感じても20~50代msに設立された最も歴史のあることで、よりユーザーにより最新のお問い合わせく、多くのキャッシュに計算済みhacks.
私のタイミングMySQLを使用して5回以Postgres.で発着信規制"の主要キャッシュ突破ないといけないと思い、これこそが期待できまいリレーショナルdb。
いまで議決権の不統一行使のご回答がない十分なポイントはまだない。