Méthodes et exemples de réécriture de requête
Au cours de l'étape de réécriture de requête, le compilateur de requête transforme les instructions SQL et XQuery en formulaires qui peuvent être optimisés plus facilement, ce qui peut améliorer les plans d'accès possibles. La réécriture des requêtes est particulièrement importante pour les requêtes très complexes, y compris celles qui comportent de nombreuses sous-requêtes ou de nombreuses jointures. Les outils de génération de requêtes créent souvent ces types de requêtes très complexes.
Pour influencer le nombre de règles de réécriture de requête appliquées à une instruction SQL ou XQuery, modifiez la classe d'optimisation. Pour afficher certains des résultats du processus de réécriture de requête, utilisez la fonction Explain.
- Fusion d'opérationPour construire une requête de sorte qu'elle ait le moins d'opérations, en particulier les opérations SELECT, le compilateur SQL et XQuery réécrit les requêtes pour fusionner les opérations de requête. Les exemples suivants illustrent certaines des opérations qui peuvent être fusionnées:
- Exemple-fusionne les vues
Une instruction SELECT qui utilise des vues peut restreindre l'ordre de jointure de la table et peut également introduire une jointure redondante des tables. Si les vues sont fusionnées lors de la réécriture de la requête, ces restrictions peuvent être levées.
- Exemple-Sous-requête pour joindre des transformations
Si une instruction SELECT contient une sous-requête, la sélection du traitement de l'ordre des tables peut être restreinte.
- Exemple-Elimination de jointure redondante
Lors de la réécriture de requête, des jointures redondantes peuvent être supprimées pour simplifier l'instruction SELECT.
- Exemple-Agrégation partagée
Lorsqu'une requête utilise des fonctions différentes, la réécriture peut réduire le nombre de calculs à effectuer.
- Exemple-fusionne les vues
- Mouvement de l'opérationPour construire une requête avec le nombre minimal d'opérations et de prédicats, le compilateur réécrit la requête pour déplacer les opérations de requête. Les exemples suivants illustrent certaines des opérations pouvant être déplacées:
- Exemple-Elimination DISTINCT
Lors de la réécriture de requête, l'optimiseur peut déplacer le point auquel l'opération DISTINCT est effectuée, afin de réduire le coût de cette opération. Dans certains cas, l'opération DISTINCT peut être complètement supprimée.
- Exemple-Prédicat général-Pushdown
Lors de la réécriture de requête, l'optimiseur peut modifier l'ordre dans lequel les prédicats sont appliqués, afin que des prédicats plus sélectifs soient appliqués à la requête le plus tôt possible.
- Exemple-Décorrelation
Dans un environnement de base de données partitionnée, le déplacement des ensembles de résultats entre les partitions de base de données est coûteux. La réduction de la taille de ce qui doit être diffusé sur d'autres partitions de base de données ou la réduction du nombre de diffusions, ou les deux, est un objectif du processus de réécriture de requête.
- Exemple-Elimination DISTINCT
- Conversion des prédicatsLe compilateur SQL et XQuery réécrit les requêtes pour convertir les prédicats existants dans des formes plus optimales. Les exemples suivants illustrent certains des prédicats qui peuvent être traduits:
- Exemple-Ajout de prédicats implicites
Lors de la réécriture de requête, des prédicats peuvent être ajoutés à une requête pour permettre à l'optimiseur de prendre en compte des jointures de table supplémentaires lors de la sélection du meilleur plan d'accès pour la requête.
- Exemple-transformations OR vers IN
Lors de la réécriture de requête, un prédicat OR peut être converti en prédicat IN pour un plan d'accès plus efficace. Le compilateur SQL et XQuery peut également convertir un prédicat IN en prédicat OR si cette transformation crée un plan d'accès plus efficace.
- Exemple-Ajout de prédicats implicites