web-dev-qa-db-fra.com

Dans Oracle SQL, puis-je interroger une partition d'une table au lieu d'une table entière pour accélérer son exécution?

J'aimerais interroger une table contenant un million d'enregistrements pour des clients nommés 'FooBar' ayant des enregistrements datés du 24/07/2016. La table contient 10 jours de données.

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');

Le problème avec la requête ci-dessus est qu'il faut un certain temps pour s'exécuter. Je voudrais qu'il soit plus rapide.

La table est divisée en 24 heures. Puis-je concentrer la requête sur les partitions de la table? Est-ce que cela rendrait la requête plus rapide? 

select *
from partition-7-24-2016
where customer = 'FooBar'; 
6
Cale Sweeney

La syntaxe correcte est select [columns] from [table] partition ([partition]). Donc, dans ce cas d'utilisation, vous auriez quelque chose comme ceci:

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

Vous pouvez le faire comme ça:

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');

Cela recherchera uniquement les lignes de la partition dans lesquelles votre date se situe - date '2016-07-24' dans cet exemple.

Vous devez vous assurer de fournir la valeur de la partition entre crochets . De plus, si vous créez un index, veillez à ce qu'il soit local, sinon vous ne constaterez pas beaucoup d'amélioration par rapport à la sélection dans la table.

1
Palcente