Avant d'exécuter une requête sur PolarDB for MySQL, utilisez dbms_imci.check_columnar_index() pour vérifier que chaque colonne référencée dispose d'un In-Memory Column Index (IMCI) valide. Cette procédure retourne les colonnes non couvertes par un IMCI, ce qui permet d'identifier précisément les tables nécessitant un IMCI avant de bénéficier de l'accélération du moteur columnaire.
Si une colonne référencée ne possède pas d'IMCI valide, la procédure retourne le nom de la base de données, de la table et de la colonne pour chaque élément non couvert.
Si toutes les colonnes référencées disposent d'un IMCI valide, la procédure retourne un ensemble de résultats vide.
Prérequis
Avant de commencer, assurez-vous de disposer des éléments suivants :
-
Un cluster PolarDB for MySQL exécutant l'une des versions suivantes :
PolarDB for MySQL 8.0.1, version de révision 8.0.1.1.30 ou ultérieure
PolarDB for MySQL 8.0.2, version de révision 8.0.2.2.12 ou ultérieure
L'autorisation SELECT sur les tables référencées dans l'instruction SQL
Syntaxe
dbms_imci.check_columnar_index('<query_string>');
Paramètres
| Paramètre | Description |
|---|---|
query_string |
Instruction SQL à analyser. Doit être une chaîne littérale, et non une variable ou le résultat d'une requête. |
query_string doit correspondre à une instruction SELECT valide. Les instructions INSERT, UPDATE, DELETE et autres instructions DML ne sont pas prises en charge. Si l'instruction SELECT contient une erreur (par exemple, une colonne inexistante), la procédure retourne un message d'erreur au lieu d'un ensemble de résultats.
Notes d'utilisation
Cette procédure stockée respecte la casse.
Si l'instruction SQL inclut un nom de table complet (par exemple,
db_name.table_name), la procédure utilise la base de données spécifiée. En l'absence de préfixe de base de données, exécutezuse db_namepour basculer vers la base de données appropriée avant d'appeler la procédure.La longueur de l'instruction SQL n'est pas explicitement limitée, mais elle est contrainte par les paramètres
thread_stack(utilisé lors de l'analyse SQL) etmax_allowed_packet.La procédure retourne une erreur si le type de données d'une colonne n'est pas pris en charge par IMCI.
Bien que
query_stringpuisse prendre la forme paramétrée d'une instruction préparée, la syntaxePREPARE...FROMn'est pas prise en charge.-
Échappez les caractères entrant en conflit avec le délimiteur de chaîne conformément à la syntaxe MySQL :
-
Avec des guillemets simples, remplacez
'par'':call dbms_imci.check_columnar_index('select t1.a from t1 where t1.b = ''some_string'''); -
Avec des guillemets doubles, remplacez
"par"":call dbms_imci.check_columnar_index("select t1.a from t1 where t1.b = ""some_string""");
Pour consulter la liste complète des règles d'échappement, reportez-vous à la documentation MySQL string literals.
-
Exemples
Les exemples suivants utilisent trois tables dans la base de données test. L'IMCI est activé sur t3 via comment 'columnar=1', contrairement à t1 et t2.
Configuration des tables de test :
use test;
create table t1 (a int, b int) engine = innodb;
create table t2 (a int, b int) engine = innodb;
create table t3 (a int, b int) engine = innodb comment 'columnar=1';
Vérification d'une requête joignant des tables sans IMCI
call dbms_imci.check_columnar_index('select count(t1.a) from t1 inner join t2 on t1.a = t2.a group by t1.b');
Résultat :
+--------------+------------+-------------+
| TABLE_SCHEMA | TABLE_NAME | COLUMN_NAME |
+--------------+------------+-------------+
| test | t1 | a |
| test | t1 | b |
| test | t2 | a |
+--------------+------------+-------------+
3 rows in set (0.01 sec)
Chaque ligne du résultat identifie une colonne dépourvue d'IMCI valide :
TABLE_SCHEMA: base de données contenant la colonneTABLE_NAME: table contenant la colonneCOLUMN_NAME: nom de la colonne
La requête référence t1.a, t1.b et t2.a, mais aucune de ces colonnes ne possède d'IMCI. Pour activer l'accélération IMCI pour cette requête, créez un IMCI sur t1 et t2, puis relancez cette vérification afin de confirmer la couverture complète.
Vérification d'une requête sur une table avec IMCI
call dbms_imci.check_columnar_index('select a, b from t3');
Résultat :
Empty set (0.00 sec)
Toutes les colonnes référencées dans la requête (t3.a et t3.b) disposent d'un IMCI valide. Cette requête peut donc bénéficier de l'accélération du moteur columnaire.