1

PostgreSQLデータベースの大きなテーブル(7,000,000行/日)に対してSQLクエリのコレクションを実行していて、最初のビューでいくつかのパフォーマンスの問題が発生し、現在はテーブルを作成しています。私が使用しているコマンドのほとんどは、次のクエリに似ています。

CREATE TABLE events_tb AS

SELECT *

FROM
(SELECT column1, column2, column3, column4, column5
 FROM test_database_1
 WHERE column6 = 'value1'
   AND date_column > '2012-07-01'
   AND date_column < '2012-07-10'
) a

INNER JOIN ( SELECT DISTINCT column1 FROM test_database_2) b
        ON (a.column1 = b.column1);

クエリが非常に大きなテーブルに対して実行されているという事実を説明するために、上記のステートメントのコレクションを改善する方法はありますか?

4

2 に答える 2

5

これはよりシンプルで高速です。

CREATE TABLE events_tb AS
SELECT column1, column2, column3, column4, column5
FROM   test_database_1 t1
WHERE  column6 = 'value1'
AND    date_column > '2012-07-01'
AND    date_column < '2012-07-10'
AND    EXISTS (
    SELECT 1
    FROM   test_database_2 t2
    WHERE  t2.column1 = t1.column1
    );

あなたが持っていた方法column1では、新しく作成されたテーブルに 2 回含まれ、エラー メッセージが表示されます。

EXISTSセミ結合は、最初の検索で実行を停止できるため、OR 式よりJOINも高速である必要があります。これは、クエリINの から判断すると、重複しているように見える重複の場合に特に有益です。DISTINCT

于 2012-07-10T23:19:21.763 に答える
2

PostgreSQL のオプティマイザーについては何も知りませんがINNER JOIN、をIN (SELECT...)構造体に置き換えてみてください。

CREATE TABLE events_tb AS

SELECT column1, column2, column3, column4, column5

FROM test_database_1

WHERE column6 = 'value1'
  AND date_column > '2012-07-01'
  AND date_column < '2012-07-10'
  AND column1 IN ( SELECT DISTINCT column1 FROM test_database_2 )
于 2012-07-10T21:57:16.260 に答える