2016-07-25 5 views
0

7-24-2016に記録されたレコードを持つ「FooBar」という名前の顧客に対して、100万レコードのテーブルを照会したいと考えています。テーブルには10日間のデータがあります。Oracle SQLでは、テーブル全体の代わりにテーブルのパーティションにクエリを実行して、テーブルを高速に実行できますか?

select * 
from table 
where customer = 'FooBar' 
and insert_date between to_date('2016-07-24 00:00:00', 'YYYY-MM-DD HH24:MI:SS') and to_date('2016-07-24 23:59:59', 'YYYY-MM-DD HH24:MI:SS'); 

上記のクエリの問題は、実行するのに時間がかかります。私はそれをより速く走らせたいと思います。

テーブルは24時間に分割されています。テーブルパーティションにクエリを集中させることができますか?クエリをより速く実行させるでしょうか?

select * 
from partition-7-24-2016 
where customer = 'FooBar'; 
+3

Oracleは、問合せに適切なパーティションを選択する必要があります。 –

+0

クエリプランとは何ですか? Oracleは実際に自動的にパーティションのプルーニングを実行していますか? 'customer'にローカルインデックスがありますか?テーブルに10日しかないデータがある場合、パーティションプルーニングでは、表のデータの10%を持つパーティションをフルスキャンする必要があります。 'customer'が合理的に選択的であると仮定すると、' customer'のインデックスはパーティショニングよりもはるかに大きなメリットになります。 –

答えて

1

正しい構文はselect [columns] from [table] partition ([partition])です。

SELECT * 
FROM mytable PARTITION (partition_7_24_2016) 
WHERE customer = 'FooBar'; 
+3

まず、パーティション名をかっこで囲む必要があることを私は確信しています(私は現在、テストするためにパーティション化されたテーブルを持っていません)。この構文を使用することはできますが、この構文を使用することはほとんどありません。テーブルが(実際には予約語の後に実際には名前が付けられていない) 'date'カラムでパーティション化されている場合、パーティションプルーニングは必要なパーティションを自動的に選択します。動的SQLを使用してパーティション名をクエリに追加するよりもはるかに意味があります。 –

+0

このクエリは私のために働いた。 3つの別々のパーティションで3つのテストを行った。上記の元のクエリをパーティションなしで比較したところ、このクエリは8倍から24倍高速で実行されました。テスト1:28秒の元のクエリ、3秒のパーティションクエリ。テスト2:49秒の元のクエリ、2秒のパーティションクエリ。テスト3:元のクエリ79秒、パーティションクエリ9秒。 –

1

あなたはこのようにそれを行うことができます::だから、このユースケースでは、あなたはこのような何かを持っていると思います

select * from table PARTITION FOR (date '2016-07-24') where customer = 'FooBar' 
and insert_date between to_date('2016-07-24 00:00:00', 'YYYY-MM-DD HH24:MI:SS') and to_date('2016-07-24 23:59:59', 'YYYY-MM-DD HH24:MI:SS'); 

あなたの日付が該当する場所にのみ、パーティション内の行を探します - date '2016-07-24'この例では、

大括弧で区切り値を指定する必要があります。 また、インデックスを作成した場合は、それがローカルであることを確認してください。それ以外の場合は、テーブル自体からの選択よりも大幅な改善は見られません。

+0

上記のクエリでは、追加の 'and'を削除して実行しました。私がしたとき、私は誤りを受けた。 ORA-00905:キーワードがありません。 –

+1

12cで動作します。古いバージョンを実行している可能性があります – Palcente

関連する問題