2011-11-27 3 views
-4

私はあなたが確実に伝えることができる唯一の方法はであり、私は現在、0から9999GENERATE SERIESはSUBQUERYよりも速いですか?

enter image description here

+2

ベンチマークしてご覧ください。そして、どのデータベース? –

+0

私の自家製データベースです。 –

+0

あなたはデータベースの質問を理解していないかもしれません。それはSQL ServerかOracleかMySQLか?クエリが書き込まれたデータベースを理解していないと、パフォーマンスの回答を得ることはできません。 –

答えて

2

にSMALLINT値のシーケンスでロードされた表をサブ照会よ、私のクエリを最適化したいと思います試して。

私は2,3ヶ月前にPostgreSQLを使って同様のテストを行いました。問題は、カレンダー表をgenerate_series()に置き換えることが理にかなっているかどうかです。

私たちの場合、テーブルはより速くなりました。しかし、テストすれば、generate_series()が特定の行数で高速になることがわかります。私の考えでは、その時点で、シリーズを生成するのに要する時間は、インデックスと行を読み取るのにかかる時間よりも短くなりますディスク。

PostgreSQLのEXPLAIN ANALYZEは、ディスクI/Oについて詳しくは分かりません。

+0

あなたのカレンダーファクトテーブルと非常によく似た状況がありました。http://stackoverflow.com/questions/2616119/date-lookup-table-1990-01-012041-12-31 ..私の状況は次のとおりです。私はファクトテーブルを持っています0から9999の系列を含む1つの小整数(32767)列と、Pick-4宝くじゲームで描かれたすべての数字(2,820の数字)にNOT INサブクエリを実行するインデックスが付けられているので、私は、生成シリーズを使用すると、10,000行の余分なテーブルを開く必要があると考えていますか? –

+0

私はdbmsが "テーブルを開く"必要があるとは思わないでしょう。推測は、特にデータベース管理システムではうまく拡張できません。そのため、クエリオプティマイザが何をしているのかを確認する方法があります。すべてのNOT IN問合せで索引を使用できないと仮定する必要があります。 Googleの "sargable表現"。 10000行はあまり多くありません。オプティマイザは索引を使用することができたとしても、その表に対して順次スキャンを実行することがあります。 –

+0

私たちのSET EXPLAIN ONはまた何が起こっているのかについて多くの説明を得ていない別の領域です。クエリのオプティマイザはコストベースですが、ディスクI/O、CPU使用率、テーブルスキャンとインデックスの使用などは説明しません。通常、他のプロセスを最小限に抑えるためにセーフブートを行いますWINDOWSタスクマネージャのパフォーマンスアナライザまたはUNIXの「sar」(システムアクティビティレポート)を使用して、何が起きているのかを確認します。私の過去の経験は、NOT INで評価される10,000行を含むテーブルをスキャンしなければならないサブクエリです.ORに相当するのは、NOT IN(1,2,3 ...)よりも高価です。 –

関連する問題