Tous les produits
Search
Centre de documentation

Tablestore:Optimisation des requêtes

Dernière mise à jour :Aug 18, 2026

Le moteur SQL de Tablestore optimise les requêtes en sélectionnant le meilleur index pour la lecture des données et en déportant les calculs vers la couche d'index.

Sélection d'index

Lorsqu'une table de données dispose d'un Secondary index ou d'un Search index, le moteur SQL sélectionne le chemin de lecture optimal avant d'exécuter la requête. La sélection de l'index peut être automatique ou manuelle.

Remarque

Avant d'utiliser l'optimisation des requêtes, assurez-vous d'avoir créé les mappages de tables de données. Pour plus d'informations, consultez les Opérations DDL. Pour accélérer les requêtes avec un index de recherche, créez également l'index de recherche et son mappage.

Règles de sélection automatique

Lorsque vous interrogez un mappage de table de données, le moteur SQL sélectionne automatiquement un index selon la priorité suivante :

Priorité

Cible

Condition

1

Index de recherche

Toutes les colonnes des clauses WHERE, d'agrégation et ORDER BY sont couvertes par le même index de recherche.

Exemple : SELECT A,B,C FROM t WHERE A=1 AND D=2; — Si les colonnes A, B, C et D figurent toutes dans le même index de recherche, celui-ci est sélectionné.

2

Index secondaire

L'index secondaire correspond à davantage de colonnes de clé primaire principales dans la clause WHERE que la table de données (correspondance du préfixe gauche) et couvre toutes les colonnes de la requête.

Exemple : La table de données possède les clés primaires a et b. Un index secondaire possède les clés primaires c, a et b. Pour WHERE c = 1 AND a > 1, l'index secondaire correspond à 2 colonnes, contre 1 colonne pour la table de données.

3

Décision CBO

Si aucune des règles précédentes ne s'applique, le moteur SQL utilise l'optimiseur interne CBO (Cost-Based Optimizer) pour sélectionner l'option au coût le plus faible entre la table de données et les index secondaires.

Important
  • Si le mappage est configuré avec une cohérence forte ou nécessite des résultats d'agrégation exacts, le moteur SQL ne sélectionne pas automatiquement un index de recherche.

  • Lorsqu'un index secondaire et un index de recherche couvrent tous deux les colonnes requises, le moteur SQL privilégie l'index de recherche.

Spécification manuelle d'un index

Pour utiliser un index spécifique, spécifiez-le manuellement de l'une des façons suivantes :

Syntaxe use index

Spécifiez un index dans l'instruction SELECT.

-- Force a full table scan (skip all indexes)
SELECT * FROM sampletable use index();

-- Use a search index
SELECT * FROM sampletable use index(sampletable_search_index);

-- Use a secondary index
SELECT * FROM sampletable use index(sampletable_secondary_index);
Remarque

Si l'index spécifié ne couvre pas les colonnes requises, le moteur SQL lit automatiquement les données manquantes depuis la table de données.

Table de mappage d'index

Interrogez directement la table de mappage d'un index secondaire ou d'un index de recherche.

-- Query through a search index mapping table (only columns in the index are queryable)
SELECT col_a, col_b FROM search_index_mapping WHERE col_a > 10;
Remarque

Les requêtes sur une table de mappage d'index ne peuvent retourner que les colonnes incluses dans l'index.

Recommandations

Scénario

Recommandation

Agrégation, tri ou recherche en texte intégral

Utilisez la sélection automatique (par défaut). Assurez-vous que l'index de recherche couvre toutes les colonnes requises. Le moteur SQL achemine la requête vers l'index de recherche et délègue les opérateurs automatiquement.

Filtres simples d'égalité ou de plage avec cohérence forte

Utilisez un index secondaire. Les index secondaires prennent en charge les lectures fortement cohérentes lorsque vous avez besoin de données en temps réel.

La sélection automatique produit des résultats inattendus

Spécifiez manuellement un index avec use index(index_name). Cette approche est utile pour l'ajustement des performances ou pour outrepasser les erreurs d'évaluation du CBO.

Seules les colonnes de l'index sont nécessaires

Interrogez directement la table de mappage d'index pour éviter de lire la table de données.

Délégation de calcul

Le moteur SQL délègue les opérateurs pris en charge vers la couche d'index de recherche, réduisant ainsi le volume de données qu'il doit traiter.

Conditions d'activation

La délégation de calcul nécessite que l'index de recherche couvre toutes les colonnes de l'instruction SQL, y compris les colonnes SELECT, WHERE, ORDER BY et GROUP BY. Si une colonne est manquante, le moteur SQL revient à une analyse complète de la table.

-- Table has columns a, b, c, d. Search index covers a, b, c.

-- d is not in the search index → full table scan, no pushdown
SELECT a, b, c, d FROM exampletable;

-- All columns are in the search index → reads through search index, pushdown supported
SELECT a, b, c FROM exampletable;

Opérateurs pris en charge

Type d'opérateur

Prise en charge de la délégation

Conditions

Opérateurs logiques

AND, OR

<!--@p {"id":"afe6389efb57"}--br>NOT ne peut pas être délégué.

Opérateurs relationnels

=, !=, <, <=, >, >=, BETWEEN...AND

Seules les comparaisons colonne-constante sont prises en charge. Les comparaisons colonne-colonne ne peuvent pas être déléguées, car les index de recherche construisent des index indépendants par colonne et ne peuvent pas résoudre les comparaisons inter-colonnes au niveau de l'index.

Fonctions d'agrégation

MIN, MAX, COUNT, AVG, SUM, ANY_VALUE, COUNT(DISTINCT), GROUP BY

Les arguments doivent être des noms de colonnes, pas des expressions. COUNT(*) prend en charge la délégation.

Tri et pagination

ORDER BY col LIMIT n

Les arguments ORDER BY doivent être des noms de colonnes. Les expressions dans ORDER BY ne peuvent pas être déléguées.

Fonctions vectorielles

VECTOR_QUERY_FLOAT32

Toutes les autres expressions de la clause WHERE doivent également satisfaire aux conditions de délégation. Si une expression ne les satisfait pas, la requête ne peut pas s'exécuter.

Anti-modèles courants

Anti-modèle

Modèle corrigé

Raison

WHERE a = '123'
WHERE a = 123

La colonne a est de type BIGINT. Une incompatibilité de type déclenche un CAST implicite.

SELECT SUM(a+b)
SELECT SUM(a)+SUM(b)

L'argument d'agrégation est une expression.

GROUP BY a+1
GROUP BY a

L'argument GROUP BY est une expression.

WHERE a > b

Aucune réécriture équivalente. Filtrez au niveau de la couche application.

Comparaison colonne-colonne.

ORDER BY a+1 LIMIT 10
ORDER BY a LIMIT 10

L'argument ORDER BY est une expression.

Mappage des expressions SQL et des fonctionnalités d'index de recherche

Le tableau suivant mappe les expressions SQL à leurs fonctionnalités de requête d'index de recherche équivalentes, ce qui vous aide à migrer depuis le SDK d'index de recherche vers SQL.

Expression SQL

Exemple

Fonctionnalité d'index de recherche

Aucune clause WHERE

SELECT * FROM t

MatchAllQuery

=

a = 1

TermQuery

>, >=, <, <=

a > 1

RangeQuery

IS NULL / IS NOT NULL

a IS NULL

ExistsQuery

AND / OR / NOT / !=

a = 1 AND b = 2

BoolQuery

LIKE

a LIKE "%s%"

WildcardQuery

IN

a IN (1,2,3)

TermsQuery

TEXT_MATCH

TEXT_MATCH(a, "hello")

MatchQuery

TEXT_MATCH_PHRASE

TEXT_MATCH_PHRASE(a, "hello world")

MatchPhraseQuery

ARRAY_EXTRACT

ARRAY_EXTRACT(col)

Types de données Array et Nested

NESTED_QUERY

NESTED_QUERY(expr)

NestedQuery

ORDER BY / LIMIT

ORDER BY a LIMIT 10

Tri et pagination

Fonctions d'agrégation / GROUP BY

SUM(col) / GROUP BY col

Agrégation