web-dev-qa-db-ja.com

Oracle SQLでは、表全体ではなく表のパーティションを問い合せて実行を高速化できますか?

2016年7月24日の日付のレコードを持つ 'FooBar'という名前の顧客について、100万レコードのテーブルを照会したいと思います。テーブルには10日間のデータがあります。

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'; 
6
Cale Sweeney

正しい構文はselect [columns] from [table] partition ([partition])です。したがって、このユースケースでは、次のようになります。

SELECT *
FROM   mytable PARTITION (partition_7_24_2016)
WHERE  customer = 'FooBar'; 
16
Mureinik

次のようにできます:

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'この例では。

括弧内にパーティション値を指定する必要があります。また、インデックスを作成した場合は、それがローカルであることを確認してください。そうしないと、テーブル自体から選択する場合ほどの改善は見られません。

2
Palcente