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