Traitement des requêtes Cloud SQL
Les requêtes sont traitées à l'aide de cellules sur le cluster Oracle Big Data Service.
A propos de l'analyse intelligente pour les sources Big Data
Les tables externes Oracle ne disposent pas d'index classiques. Les requêtes portant sur ces tables externes requièrent généralement une analyse complète de la table. L'agent de traitement Oracle Cloud SQL sur les DataNodes du cluster Hadoop étend les fonctionnalités d'analyse intelligente (comme les déchargements des prédicats de filtre) aux tables externes Oracle. L'analyse intelligente a été utilisée pendant un certain temps sur Oracle Exadata Database Machine pour effectuer le filtrage de colonne et de prédicat dans la couche de stockage avant le renvoi des résultats de requête à la couche de base de données. Dans Cloud SQL, l'analyse intelligente est une dernière étape de filtrage qui est effectuée localement sur le serveur Hadoop afin de garantir que seuls les éléments demandés sont envoyés au serveur de requête Cloud SQL. Les cellules Cloud SQL exécutées sur les DataNodes Hadoop peuvent effectuer des analyses intelligentes sur divers formats de données dans HDFS, comme CSV, Avro et Parquet.
Cette implémentation de l'analyse intelligente exploite la puissance du traitement massivement parallèle du cluster Hadoop pour filtrer les données au niveau de leur source. Elle peut rejeter de façon préemptive une grande partie des données non pertinentes (jusqu'à 99 % du total). Les avantages sont multiples :
-
Les déplacements de données et le trafic réseau entre le cluster et la base de données sont considérablement réduits.
-
Les ensembles de résultats renvoyés au serveur Oracle Database sont beaucoup plus petits.
-
Les données sont agrégées chaque fois que cela est possible grâce à l'évolutivité et au traitement du cluster.
Les résultats de requête sont renvoyés bien plus rapidement. Il s'agit de la conséquence directe de la réduction du trafic sur le réseau et de la charge sur Oracle Database.
A propos des index de stockage
Pour les données stockées dans HDFS, Oracle Cloud SQL gère automatiquement les index de stockage, et ce, de façon transparente pour Oracle Database. Les index de stockage contiennent le récapitulatif de la répartition des données stockées dans HDFS sur un disque dur. Ils réduisent le coût des opérations d'E/S et le coût de l'UC associé à la conversion des données de fichiers plats en blocs Oracle Database. Un index de stockage est comparable à un index négatif. Il indique à l'analyse intelligente que les données ne se trouvent pas dans un bloc de données, ce qui permet donc à l'analyse intelligente d'ignorer la lecture de ce bloc. Cela peut réduire considérablement le nombre d'E/S.
Les index de stockage peuvent être utilisés uniquement pour les tables externes reposant sur HDFS et créées à l'aide du pilote ORACLE_HDFS
ou ORACLE_HIVE
. Ils ne peuvent pas être utilisés pour les tables externes se servant de StorageHandlers, telles qu'Apache HBase et Oracle NoSQL.
Un index de stockage est un ensemble d'index de région en mémoire, dans lequel chaque index de région stocke des récapitulatifs de 32 colonnes au maximum. Il existe un index de région pour chaque fractionnement. Le contenu stocké dans un index de région ne dépend pas des autres index de région. Cette organisation les rend hautement évolutifs et permet d'éviter les conflits de verrous internes.
Les index de stockage conservent les valeurs minimale et maximale des colonnes d'une région pour chaque index de région. Les valeurs minimale et maximale permettent d'éliminer les E/S superflues. Cette méthode est également appelée filtrage des E/S. La statistique sur les octets d'E/S de granule de cellule XT économisés par les index de stockage, disponible dans la vue V$SYSSTAT
, indique le nombre d'octets d'E/S économisés grâce à l'utilisation des index de stockage.
Les index de stockage améliorent les requêtes qui utilisent les comparaisons suivantes :
-
Egalité (=)
-
Inégalité (<, != ou >)
-
Inférieur ou égal à (<=)
-
Supérieur ou égal à (>=)
-
EST NULL
-
N'EST PAS NULL
Les index de stockage sont créés automatiquement après que le service Oracle Cloud SQL a reçu une requête comportant un prédicat de comparaison supérieur à la valeur maximale ou inférieur à la valeur minimale de la colonne dans une région.
-
L'efficacité des index de stockage peut être améliorée en triant les lignes d'une table en fonction des colonnes qui apparaissent fréquemment dans la clause de requête
WHERE
. -
Les index de stockage fonctionnent avec tous les types de données non linguistiques, ainsi qu'avec les types de données linguistiques semblables à des index non linguistiques.
Elimination des E/S disque à l'aide des index de stockage
La figure suivante représente une table et des index de région. Les valeurs de la colonne B de la table sont comprises entre 1 et 8. Un premier index de région stocke la valeur minimale 1 et la valeur maximale 5. L'autre index de région stocke la valeur minimale 3 et la valeur maximale 8.

WHERE
de la requête.SELECT *
FROM TABLE
WHERE B < 2;
Amélioration des performances de jointure à l'aide des index de stockage
L'utilisation des index de stockage permet aux jointures de table d'ignorer les opérations d'E/S inutiles. Par exemple, la requête suivante réalise une opération d'E/S et applique un filtre de Bloom uniquement au premier bloc de la table de faits. Les filtres de Bloom sont cruciaux pour améliorer les performances de jointure. Dans cet exemple, un prédicat se trouve sur la table de dimensions, et non sur la table de faits. Le filtre de Bloom est créé en fonction de dim.name=Hard drive
et est ensuite appliqué à la table de faits. Par conséquent, même si le filtre figure sur la table de dimensions, vous pouvez filtrer les données au niveau de leur source (Hadoop) en fonction des résultats de la requête de dimension. Cela permet également d'exécuter certaines optimisations comme les index de stockage.
SELECT count(*)
FROM fact, dimension dim
WHERE fact.m=dim.m and dim.product="Hard drive";

Les E/S du second bloc de la table de faits sont complètement éliminées par les index de stockage car la plage de valeurs minimale/maximale (5 et 8) de celui-ci n'est pas présente dans le filtre de Bloom.
A propos de la propagation de prédicats
De nombreux systèmes Big Data prennent en charge un certain niveau de déchargement de prédicat, soit via le type de fichier lui-même (par exemple, Apache Parquet), soit via les API StorageHandler et le partitionnement de Hive . Oracle Cloud SQL tire parti de ces fonctions de déchargement en propageant des prédicats d'Oracle Database vers des systèmes qui les prennent en charge. Par exemple, la propagation de prédicats permet d'appliquer les comportements automatiques suivants :
-
Les requêtes portant sur les tables Hive partitionnées sont nettoyées en fonction des prédicats de filtre sur les colonnes de partition.
-
Les requêtes portant sur les fichiers Apache Parquet et Apache ORC réduisent les E/S en testant les prédicats par rapport aux structures de type index internes contenues dans ces formats de fichier.
Remarque
Les fichiers Parquet doivent être créés avec Hive ou Spark. Les fichiers Parquet créés à l'aide d'Apache Impala ne disposent pas des statistiques requises pour réaliser la propagation de prédicats. -
Les requêtes portant sur Oracle NoSQL Database ou Apache HBase utilisent des prédicats SARGable pour piloter les sous-analyses de données dans la banque de données distante.
Types de données requis pour permettre la propagation de prédicats
La propagation de prédicats requiert la présence de certaines mises en correspondance entre les types de données Hive et Oracle. Ces mises en correspondance sont décrites dans le tableau suivant.
Type de données Hive | Mise en correspondance avec le type de données Oracle |
---|---|
CHAR(m) |
CHAR(n), VARCHAR2(n) où n est >= m |
VARCHAR(m) |
CHAR(n), VARCHAR2(n) où n est >= m. |
chaîne |
CHAR(n), VARCHAR2(n) |
DATE |
DATE |
HORODATAGE |
TIMESTAMP(9). Le type de données TIMESTAMP de Hive utilise des nanosecondes, à savoir des fractions de seconde à 9 chiffres. |
TINYINT |
NUMBER(3) de préférence, mais NUMBER ou NUMBER(n) est valide pour n'importe quelle valeur de n. |
PETITE |
NUMBER(5) de préférence, mais NUMBER ou NUMBER(n) est valide pour n'importe quelle valeur de n. |
INT |
NUMBER(10) de préférence, mais NUMBER ou NUMBER(n) est valide pour n'importe quelle valeur de n. |
BIGINT |
NUMBER(19) de préférence, mais NUMBER ou NUMBER(n) est valide pour n'importe quelle valeur de n. |
DECIMAL(m) |
NUMBER(n), où m = n de préférence, mais NUMBER ou NUMBER(n) est valide pour n'importe quelle valeur de n. |
FLOTTE |
BINARY_FLOAT |
DOUBLE |
BINARY_DOUBLE |
BINAIRE |
RAW(n) |
VALEUR BOOLÉENNE |
CHAR(n), VARCHAR2(n) où n est >= 5. Valeurs "TRUE" et "FALSE" |
VALEUR BOOLÉENNE |
NUMBER(1) de préférence, mais NUMBER ou NUMBER(n) est valide pour n'importe quelle valeur de n. Valeurs 0 (False), 1 (True). |
A propos de la propagation du traitement CLOB
Les requêtes portant sur les données Hadoop peuvent impliquer le traitement d'objets volumineux (LOB) avec potentiellement des millions d'enregistrements. Renvoyer ces objets à Oracle Database pour le filtrage et l'analyse n'est pas efficace. Oracle Cloud SQL peut améliorer considérablement les performances en propageant le traitement CLOB vers ses propres cellules de traitement sur le cluster Hadoop. Le filtrage dans Hadoop réduit le nombre de lignes renvoyées à Oracle Database. L'analyse réduit la quantité de données renvoyées à partir d'une colonne dans chaque ligne filtrée.
Vous pouvez désactiver ou réactiver la propagation du traitement CLOB en fonction de vos besoins.
Pour le moment, cette fonctionnalité s'applique uniquement aux expressions JSON renvoyant des données CLOB. Les expressions de filtre JSON admissibles à l'évaluation de la couche de stockage incluent une syntaxe simplifiée, JSON_VALUE
et JSON_QUERY
.
La même prise en charge sera fournie pour les autres types CLOB (tels que substr
et instr
) ainsi que pour les données BLOB dans une prochaine version.
Cloud SQL peut propager le traitement vers Hadoop pour les objets CLOB respectant les contraintes de taille suivantes :
-
Filtrage des colonnes CLOB jusqu'à 1 Mo.
La quantité réelle de données pouvant être utilisées pour l'évaluation dans le serveur de stockage peut varier en fonction du jeu de caractères utilisé.
-
Analyse des colonnes jusqu'à 32 ko.
Cette limite fait référence à la projection de liste de sélection à partir du stockage pour le type de données CLOB.
Le traitement rebascule sur Oracle Database uniquement lorsque les tailles de colonne dépassent ces deux valeurs.
Traitement des documents JSON
{"ponumber":9764,"reference":"LSMITH-20141017","requestor":"Lindsey Smith","email": "Lindsey@myco.com", "company":"myco" …}
CREATE TABLE POS_DATA
( pos_info CLOB )
ORGANIZATION EXTERNAL
( TYPE ORACLE_HDFS
DEFAULT DIRECTORY DEFAULT_DIR
LOCATION ('/data/pos/*')
)
REJECT LIMIT UNLIMITED;
SELECT p.pos_info.email, p.pos_info.requestor
FROM POS_DATA p
WHERE p.pos_info.company='myco'
L'exemple de requête ci-dessus exécute deux optimisations d'élimination des données :
-
Les données sont filtrées en fonction des cellules Cloud SQL dans le cluster Hadoop. Seuls les enregistrements concernant la société
myco
sont analysés (et après l'analyse, seules les données sélectionnées à partir de ces enregistrements sont renvoyées à la base de données). -
Les cellules Cloud SQL du cluster analysent l'ensemble d'enregistrements filtré. Pour chaque enregistrement, seules les valeurs des deux attributs demandés (
p.pos_info.email
etp.pos_info.requestor
) sont renvoyées à la base de données.
Le tableau ci-dessous présente d'autres exemples dans lesquels la propagation du traitement CLOB est prise en charge. N'oubliez pas que les projections (références sur le côté sélectionné de la colonne CLOB) sont limitées à 32 ko de données CLOB, tandis que la propagation de prédicats est limitée à 1 Mo de données CLOB.
Requête | Commentaires |
---|---|
SELECT count(*) FROM pos_data p WHERE pos_info is json; |
Dans ce cas, le prédicat garantit que seules les colonnes conformes au format JSON sont renvoyées. |
SELECT pos_info FROM pos_data p WHERE pos_info is json; |
Même prédicat que dans le cas précédent, mais la valeur CLOB est ici projetée. |
SELECT json_value(pos_info, '$.reference') FROM pos_data p WHERE json_value(pos_info, '$.ponumber') > 9000 |
Ici, le prédicat est émis dans un champ du document JSON et une valeur JSON est également exécutée pour extraire le champ "reference" reposant sur la valeur CLOB JSON projetée. |
SELECT p.pos_info.reference FROM pos_data p WHERE p.pos_info.ponumber > 9000; |
Même requête que dans l'exemple précédent, mais avec une syntaxe simplifiée. |
SELECT p.pos_info.email FROM po_data p WHERE json_exists(pos_info, '$.requestor') and json_query(pos_info, '$.requestor') is not null; |
Cet exemple montre comment json_exists et json_query peuvent également être utilisés comme prédicats. |
A propos du déchargement d'agrégation
Oracle Cloud SQL utilise la technologie Oracle In-Memory pour propager le traitement d'agrégation vers les cellules Cloud SQL. Cela permet à Cloud SQL d'exploiter la puissance de traitement du cluster Hadoop pour répartir les agrégations entre les noeuds de cluster.
Les gains de performances peuvent être considérablement plus rapides par rapport aux agrégations qui n'effectuent pas de déchargement, en particulier lorsqu'il existe un nombre modéré de regroupements récapitulatifs. Pour les requêtes de table unique, l'opération d'agrégation doit systématiquement effectuer un déchargement.
Les cellules Cloud SQL prennent en charge les agrégations de table unique et multitables (par exemple, les tables de dimensions jointes à une table de faits). Pour les agrégations multitables, Oracle Database utilise l'optimisation de transformation par vecteur de clé dans laquelle les vecteurs de clé sont propagés vers les cellules pour le processus d'agrégation. Ce type de transformation est utile pour les requêtes SQL de jointure en étoile utilisant des opérateurs d'agrégation classiques (comme SUM
, MIN
, MAX
et COUNT
), qui sont courants dans les requêtes de gestion.
Une requête de transformation par vecteur est une requête plus efficace qui utilise un filtre de Bloom pour les jointures. Lorsque vous utilisez une requête transformée par un vecteur avec des cellules Cloud SQL, les performances des jointures dans la requête sont améliorées par la possibilité de décharger le filtrage des lignes utilisées pour l'agrégation. Une opération KEY VECTOR USE
apparaît dans le plan de requête pendant cette optimisation.
Dans les cellules Cloud SQL, les requêtes transformées par un vecteur bénéficient d'un traitement plus efficace en raison de l'application de colonnes de regroupement (vecteurs de clé) à l'index de stockage Cloud SQL.
-
Prédicat manquant
Si le plan d'explication ne contient pas le prédicatSYS_OP_VECTOR_GROUP_BY
, le déchargement d'agrégation est affecté. Le prédicat peut être manquant pour les raisons suivantes :-
Présence d'une source de ligne intermédiaire non autorisée entre l'analyse de la table et les sources de ligne de regroupement.
-
L'analyse de la table ne génère aucun rowset.
-
Présence d'une expression ou d'un type de données dans la requête qui ne peut pas être déchargé.
-
Le regroupement de vecteurs est désactivé manuellement.
-
La table de l'analyse ou de la configuration n'attend pas de gains provenant du déchargement d'agrégation.
-
-
Analyse intelligente manquante
Les octets d'interconnexion de cellule renvoyés par l'analyse intelligente XT et les granules de cellule XT demandés pour les statistiques de déchargement de prédicat doivent être disponibles.
-
Vecteurs de clé manquants
La limite des données transmises aux cellules est de 1 Mo. Lorsque ce seuil est dépassé, les requêtes peuvent bénéficier du filtrage intelligent des vecteurs de clé mais pas nécessairement de l'agrégation déchargée. Cette condition est appelée mode Vecteur de clé Lite. En raison de leur taille importante, certains vecteurs de clé ne sont pas entièrement déchargés. Ils sont déchargés en mode Lite avec les vecteurs de clé qui ne prennent pas en charge le déchargement d'agrégation. Les vecteurs de clé ne sont pas entièrement sérialisés en mode Lite. Le déchargement de regroupement de vecteurs est désactivé lorsque les vecteurs de clé sont déchargés en mode Lite.
Pour plus d'informations sur le fonctionnement de l'agrégation dans Oracle Database, reportez-vous à Optimisation de l'agrégation dans le guide Oracle Database In-Memory.
A propos des statistiques de Cloud SQL
Oracle Cloud SQL offre un certain nombre de statistiques qui peuvent fournir des données pour les analyses de performances.
Cinq statistiques clés relatives aux cellules XT et aux index de stockage
Si une requête est déchargeable, les statistiques relatives aux cellules XT suivantes peuvent vous aider à déterminer le type d'économie d'E/S que vous pouvez attendre du déchargement et de l'analyse intelligente.
-
granules de cellule XT demandés pour le déchargement de prédicat
Le nombre de granules demandés dépend de plusieurs facteurs, y compris la taille du bloc HDFS, la capacité de fractionnement d'une source de données Hadoop et l'efficacité de l'élimination d'une partition Hive.
-
octets de granule de cellule XT demandés pour le déchargement de prédicat
Nombre d'octets demandés pour l'analyse. Il s'agit de la taille des données sur Hadoop à examiner après l'élimination d'une partition Hive et avant l'évaluation d'un index de stockage.
-
octets d'interconnexion de cellule renvoyés par l'analyse intelligente XT
Nombre d'octets d'E/S renvoyés par une analyse intelligente XT à Oracle Database.
-
nouvelles tentatives de déchargement de prédicat de granule de cellule XT
Nombre de fois où un processus Cloud SQL en cours d'exécution sur un DataNode n'a pas pu effectuer l'action demandée. Cloud SQL effectue automatiquement une nouvelle tentative pour les demandes en échec sur d'autres DataNodes comportant une réplique des données. La valeur du nombre de nouvelles tentatives doit être égale à zéro.
-
octets d'E/S de granule de cellule XT économisés par l'index de stockage
Nombre d'octets filtrés par les index de stockage au niveau de la cellule de stockage. Il s'agit de données qui n'ont pas été analysées, d'après les informations fournies par les index de stockage.
Vous pouvez consulter ces statistiques avant et après l'exécution des requêtes comme suit. Cet exemple montre des valeurs NULL, avant l'exécution d'une requête.
SQL> SELECT sn.name,ms.value
FROM V$MYSTAT ms, V$STATNAME sn
WHERE ms.STATISTIC#=sn.STATISTIC# AND sn.name LIKE '%XT%';
NAME VALUE
----------------------------------------------------- -----
cell XT granules requested for predicate offload 0
cell XT granule bytes requested for predicate offload 0
cell interconnect bytes returned by XT smart scan 0
cell XT granule predicate offload retries 0
cell XT granule IO bytes saved by storage index 0
Vous pouvez consulter tout ou partie de ces statistiques après l'exécution d'une requête pour tester l'efficacité de celle-ci, comme illustré ci-dessous :
SQL> SELECT n.name, round(s.value/1024/1024)
FROM v$mystat s, v$statname n
WHERE s.statistic# IN (462,463)
AND s.statistic# = n.statistic#;
cell XT granule bytes requested for predicate offload 32768
cell interconnect bytes returned by XT smart scan 32
Cinq statistiques relatives au déchargement d'agrégation
Les statistiques suivantes peuvent vous aider à analyser les performances du déchargement d'agrégation.
-
opérations de regroupement de vecteurs envoyées à la cellule
Nombre de fois où des agrégations ont pu être déchargées vers la cellule.
-
opérations de regroupement de vecteurs non envoyées à la cellule en raison de la cardinalité
Nombre d'analyses qui n'ont pas été déchargées en raison d'une maquette fonctionnelle volumineuse.
-
lignes de regroupement de vecteurs traitées sur la cellule
Nombre de lignes qui ont été agrégées sur la cellule.
-
lignes de regroupement de vecteurs renvoyées par la cellule
Nombre de lignes agrégées qui ont été renvoyées par la cellule.
-
rowsets de regroupement de vecteurs traités sur la cellule
Nombre de rowsets qui ont été agrégés sur la cellule.
Vous pouvez consulter ces statistiques en exécutant les requêtes comme suit :
SQL> SELECT count(*) FROM bdsql_parq.web_sales;
COUNT(*)
----------
287301291
SQL> SELECT substr(n.name, 0,60) name, u.value
FROM v$statname n, v$mystat u
WHERE ((n.name LIKE 'key vector%') OR
(n.name LIKE 'vector group by%') OR
(n.name LIKE 'vector encoded%') OR
(n.name LIKE '%XT%') OR
(n.name LIKE 'IM %' AND n.name NOT LIKE '%spare%'))
AND u.sid=userenv('SID')
AND n.STATISTIC# = u.STATISTIC#
AND u.value > 0;
NAME VALUE
----------------------------------------------------- -----
cell XT granules requested for predicate offload 808
cell XT granule bytes requested for predicate offload 2.5833E+10
cell interconnect bytes returned by XT smart scan 6903552
vector group by operations sent to cell 1
vector group by rows processed on cell 287301291
vector group by rows returned by cell 808
Neuf statistiques relatives aux vecteurs de clé
Les statistiques suivantes peuvent vous aider à analyser l'efficacité des vecteurs de clé envoyés à la cellule.
-
vecteurs de clé envoyés à la cellule
Nombre de vecteurs de clé qui ont été déchargés vers la cellule.
-
vecteur de clé filtré sur la cellule
Nombre de lignes qui ont été filtrées par un vecteur de clé sur la cellule.
-
vecteur de clé sondé sur la cellule
Nombre de lignes qui ont été testées par un vecteur de clé sur la cellule.
-
lignes de vecteur de clé traitées par la valeur
Nombre de clés de jointure qui ont été traitées à l'aide de leur valeur.
-
lignes de vecteur de clé traitées par le code
Nombre de clés de jointure qui ont été traitées à l'aide du code de dictionnaire.
-
lignes de vecteur de clé filtrées
Nombre de clés de jointure qui ont été ignorées en raison de bits ignorés.
-
sérialisations de vecteur de clé en mode Lite pour la cellule
Nombre de fois où un vecteur de clé n'a pas été encodé à cause du format ou de la taille.
-
vecteurs de clé envoyés à la cellule en mode Lite en raison du quota
Nombre de vecteurs de clé qui ont été déchargés vers la cellule pour le filtrage non exact en raison du quota de métadonnées de 1 Mo.
-
filtres efilter de vecteur de clé créés
Aucun vecteur de clé n'a pas été envoyé à une cellule, mais un filtre efilter (semblable à un filtre de Bloom) l'a été.
Vous pouvez consulter ces statistiques en exécutant les requêtes comme suit :
SELECT substr(n.name, 0,60) name, u.value
FROM v$statname n, v$mystat u
WHERE ((n.name LIKE 'key vector%') OR
(n.name LIKE 'vector group by%') OR
(n.name LIKE 'vector encoded%') OR
(n.name LIKE '%XT%'))
AND u.sid=userenv('SID')
AND n.STATISTIC# = u.STATISTIC#
NAME VALUE
----------------------------------------------------- -----
cell XT granules requested for predicate offload 250
cell XT granule bytes requested for predicate offload 61,112,831,993
cell interconnect bytes returned by XT smart scan 193,282,128
key vector rows processed by value 14,156,958
key vector rows filtered 9,620,606
key vector filtered on cell 273,144,333
key vector probed on cell 287,301,291
key vectors sent to cell 1
key vectors sent to cell in lite mode due to quota 1
key vector serializations in lite mode for cell 1
key vector efilters created 1
Le blog dédié au démarrage rapide de Big Data SQL, publié dans The Data Warehouse Insider, explique comment utiliser ces statistiques pour analyser les performances de Big Data SQL. Etant donné que Cloud SQL et Big Data SQL partagent la même technologie sous-jacente, les mêmes règles d'optimisation s'appliquent. Reportez-vous à la partie 2, à la partie 7 et à la partie 10.