2012-03-27 8 views
0

大きなテキストデータを含む列があるテーブルがあります。 10行(テーブルには31レコードしかない)のクエリには20秒以上かかります。大きいサイズのフィールドを削除すると、クエリはすばやく実行されます。 1行(idによる)のクエリは、常に迅速に実行されます。大きなサイズのテーブルのクエリ

多くの行のクエリをより高速に実行するにはどうすればよいですか?

クエリは、この

SELECT DISTINCT (a.id), a.field_1, a.field_2, a.field_3 
    , a.field_4, a.field_5, a.filed_6, ... 
FROM table_a a, table_b b 
WHERE a.field_8 = 'o' 
ORDER BY a.field_2 DESC 
LIMIT 10; 
+1

'DISTINCT'は**ない**機能です。使用している構文では、ID列だけではなく、すべての列で別名を使用します。 –

+0

@a_horse_with_no_name、はい、あなたは正しいです!今はもっと速くなりますが、私たちが望むほど速くはありません。多分何かがあるのでしょうか? –

+0

クエリプランがない場合のパフォーマンス分析はほとんど推測ですが、DISTINCTをONにした後、クエリにEXPLAIN ANALYZEの出力を投稿してください。 – dbenhur

答えて

1

@a_horseは、すでに誤っている構文エラーを暗示しています。

 
SELECT DISTINCT ON (a.id) a.id, a.field_1, a.field_2, a.field_3, ... 
FROM table_a a 
-- JOIN table_b b ON ??? 
WHERE a.field_8 = 'o' 
ORDER BY a.id, a.field_2 DESC 
LIMIT 10; 

注太字強調をしてDISTINCT clause in the manualをよく読んで:試してみてください。

また、field_8のインデックスが参考になる場合があります。
multicolumn index(field_8, id, field_2)にすると、それを絞り込むことができればさらに助かります(もし私が疑問に思うソート順であれば)。 id主キーであればPostgreSQLの9.1で 、::あなたが最初a.field_2 DESCによるソート結果をしたい場合は

SELECT a.id, a.field_1, a.field_2, a.field_3, ... 
FROM table_a a 
-- JOIN table_b b ON ??? 
WHERE a.field_8 = 'o' 
GROUP BY a.id -- primary key takes care of all columns in table a 
ORDER BY a.field_2 DESC 
LIMIT 10; 
+0

はい、私はDISTINCTで質問を研究しました。私が 'GROUP BY a.id'を使う時、postgresはグループごとにテーブルの全てのカラムを使いました。 –

+0

私が言及したように、これは主キーがテーブル全体をカバーするバージョン9.1(またはそれ以降)で動作します。あなたはあなたのバージョンのPostgreSQLについて言及することを怠りました。以前のバージョンでは、 'GROUP BY'節の' SELECT'リストの集約されていない全ての列を繰り返すか、副問い合わせで 'DISTINCT ON(id)'を使い、外側の問い合わせで 'ORDER BY/LIMIT'を適用してください。 –

0

なぜあなたが選択されているtable_bのように見えますか?あなたはこのテーブルに参加しません! は、実際にはその後、(ここで、文の中で)field_8がキーで定義されていることを確認してください。この

SELECT DISTINCT 
    (a.id), a.field_1, a.field_2, a.field_3, a.field_4, a.field_5, a.filed_6 
FROM table_a a 
INNER JOIN table_b b 
    ON b.field_on_table_b = a.field_on_table_a 
WHERE a.field_8 = 'o' 
ORDER BY a.field_2 DESC LIMIT 10 

のように参加します!

関連する問題