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

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

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;
Copy

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 :

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

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