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

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 :

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