Accélération des requêtes avec des sous-requêtes scalaires via l’optimisation de la recherche¶
Une sous-requête scalaire retourne une valeur unique (une colonne d’une ligne). Si aucune ligne ne peut être retournée, la sous-requête retourne NULL. Le service d’optimisation de la recherche peut améliorer les performances des requêtes avec des sous-requêtes scalaires. Pour plus d’informations sur les sous-requêtes, voir Utilisation des sous-requêtes.
Les sections suivantes fournissent de plus amples informations sur la prise en charge de l’optimisation de la recherche pour les requêtes comportant des sous-requêtes :
Activation de l’optimisation de la recherche pour les requêtes avec des sous-requêtes scalaires
Exemples de requêtes avec des sous-requêtes scalaires prises en charge
Activation de l’optimisation de la recherche pour les requêtes avec des sous-requêtes scalaires¶
Les requêtes ayant des sous-requêtes ne sont pas améliorées à moins que vous n’activiez l’optimisation de la recherche pour la colonne qui est égale au résultat de la sous-requête. Pour améliorer les performances des requêtes avec des sous-requêtes scalaires dans une table, utilisez la commande ALTER TABLE … ADD SEARCH OPTIMIZATION pour effectuer l’une des opérations suivantes :
Activer l’optimisation de la recherche pour des colonnes spécifiques.
Activer l’optimisation de la recherche pour toutes les colonnes de la table.
En général, la meilleure pratique consiste à n’activer l’optimisation de la recherche que pour des colonnes spécifiques. Utilisez la clause ON EQUALITY pour spécifier les colonnes. Cet exemple active l’optimisation de la recherche pour une colonne spécifique :
ALTER TABLE mytable ADD SEARCH OPTIMIZATION ON EQUALITY(mycol);
Pour spécifier EQUALITY pour toutes les colonnes des types de données pris en charge (à l’exception de semi-structurées et GEOGRAPHY) :
ALTER TABLE mytable ADD SEARCH OPTIMIZATION;
Pour plus d’informations, voir Activation et désactivation de l’optimisation de la recherche.
Types de données pris en charge¶
Le service d’optimisation de la recherche peut améliorer les performances des sous-requêtes scalaires dans les colonnes des types de données suivants :
Types de données pour les numéros à virgule fixe, y compris les éléments suivants :
Tous les types de données INTEGER, qui ont une échelle de 0.
Les nombres non entiers à virgule fixe, qui ont une échelle différente de 0 (tels que
NUMBER(10,2)
).Transformations de nombres à virgule fixe (par exemple,
NUMBER(30, 2)::NUMBER(30, 5)
).
Types de données Chaîne et Binaire (par exemple, VARCHAR et BINARY).
Types de données de date et heure (par exemple, DATE, TIME, et TIMESTAMP).
Les sous-requêtes qui impliquent d’autres types de valeurs (par exemple, VARIANT, FLOAT, GEOGRAPHY ou GEOMETRY) n’en bénéficient pas.
Exemples de requêtes avec des sous-requêtes scalaires prises en charge¶
Les requêtes suivantes sont des exemples de requêtes avec des sous-requêtes scalaires qui sont prises en charge par le service d’optimisation de la recherche.
Cette requête comporte une sous-requête scalaire qui interroge la même table que celle de la requête externe. Pour améliorer les performances, assurez-vous que l’optimisation de la recherche est activée pour la colonne salary
dans la table employees
.
SELECT employee_id
FROM employees
WHERE salary = (
SELECT MAX(salary)
FROM employees
WHERE department = 'Engineering');
Cette requête comporte une sous-requête scalaire qui interroge une table différente de celle de la requête externe. Pour améliorer les performances, assurez-vous que l’optimisation de la recherche est activée pour la colonne product_id
dans la table products
.
SELECT *
FROM products
WHERE products.product_id = (
SELECT product_id
FROM sales
GROUP BY product_id
ORDER BY COUNT(product_id) DESC
LIMIT 1);