Une approche pour l`optimisation des requêtes dirigée par la

Transcription

Une approche pour l`optimisation des requêtes dirigée par la
Une approche pour l’optimisation des requêtes dirigée
par la réutilisation des plans d’exécution
Lamia SADEG
Ladjel BELLATRECHE
Laboratoire mathématiques appliquées
Ecole Militaire Polytechnique
Bordj El Bahri, Algérie
[email protected]
LISI
ENSMA
Université de Poitiers, France
[email protected]
Résumé— L’optimisation des requêtes constitue un volet
très important dans le domaine des bases de données, et
ce depuis plus d’une trentaine d’années. Etant un
problème NP–Complet, engendrant une lenteur dans la
phase d’optimisation pour des requêtes complexes, une
panoplie de solutions ont été proposées, mais aucune
solution globale satisfaisante n’existe à ce jour. Afin de
pallier à ce problème, une solution serait de décharger
l’optimiseur en réutilisant les plans qu’il aurait générés
pour des requêtes futures sur la base d’une fonction de
similarité, ce qui accélérera le processus d’optimisation.
Dans notre travail, la requête est modélisée sous forme
d’un graphe étiqueté, ce qui transforme le problème
d’appariement de requêtes en un problème
d’isomorphisme des graphes. Le graphe d’une nouvelle
requête sera comparé aux graphes résultants des plans
d’optimisation passés – afin de ne prendre en compte
que l’information utile –, en utilisant un modèle de coût.
Les tests effectués ont donné des résultats satisfaisants
en termes de temps et de qualité d’optimisation.
alloué à l’optimisation de requêtes, les SGBD actuels se
limitent à chercher un plan d’exécution dit satisfaisant et
donc non nécessairement optimal. Ainsi, l’efficacité du plan
dépend de la charge sur l’optimiseur au moment de
l’optimisation. Afin de pallier à ce problème, une solution
serait de décharger l’optimiseur en réutilisant des plans qu’il
aurait générés antérieurement sur la base d’une fonction de
similarité. Cela lui permettrait de travailler à son plus haut
niveau en proposant des plans de qualité, ce qui se
répercutera positivement lors de leur réutilisation pour des
requêtes non encore optimisées. Cette solution a déjà été
adoptée par quelques optimiseurs commerciaux (à l’exemple
d’Oracle), mais dans le cadre restreint de la similarité
syntaxique qui reste bien rigide. Ce problème a été
récemment abordé dans [9, 16] où les auteurs ne se basent
plus sur la ressemblance syntaxique mais plutôt sur d’autres
métriques incluant des informations se rapportant aussi bien
à la requête qu’aux tables impliquées, le tout formant des
vecteurs de requêtes.
Mots-clés; optimisation des requêtes; modèle de coût;
réutilisation des plans dexécution.
I.
Dans notre travail, nous abordons le problème de la
représentation, l’extraction et l’utilisation de l’information
nécessaire à la comparaison des requêtes. Pour ce faire, nous
agissons sur trois volets :
•
La représentation des requêtes par un graphe. Cette
représentation est très utilisée, notamment dans
l’optimisation des requêtes complexes [18] ainsi que
dans la phase de réécriture de requêtes [8]. Les
graphes ont pour avantage d’offrir une représentation
plus compacte et plus expressive de la requête.
•
L’extraction de l’information nécessaire à partir du
plan d’exécution des requêtes optimisées. Ceci
permet de ne comparer les requêtes que sur la base
des structures d’optimisation réellement utilisées lors
de l’exécution des requêtes précédentes.
•
L’utilisation d’un modèle de coût permettant
d’établir la similarité entre les requêtes.
INTRODUCTION
L’optimisation des requêtes est un volet très important
dans le domaine des bases de données. Elle constitue une
étape inévitable dans le processus précédant l’exécution
d’une requête. Elle vise à ordonnancer de façon optimale les
actions impliquées dans une requête, en incluant les
structures d’optimisation requises pour une exécution en un
temps minimum. Cet ordonnancement, dit plan d’exécution,
est accompli en pratique par un module appelé optimiseur de
requêtes, lequel constitue l’élément essentiel de compétitivité
entre les SGBD actuels. De part son importance et son
indispensabilité, ce problème d’optimisation a intéressé une
panoplie de chercheurs depuis plus d’une trentaine d’années,
particulièrement depuis que Ibaraki et Kameda [11] ont
montré la NP-complétude de ce problème dans le cas de
jointures par boucles imbriquées.
Malheureusement, les solutions proposées jusqu’ici
présentent des insuffisances et ne s’appliquent généralement
pas à tous les types de requêtes. Afin de diminuer le temps
Ainsi, le problème crucial de la détermination de la
similarité entre les requêtes se transforme en un problème
d’isomorphisme de graphes.
Nous avons effectué des tests et les résultats obtenus ont
été comparés à ceux de l’optimiseur d’Oracle 11g.
II.
ETAT DE L’ART SUR L’OPTIMISATION DES REQUETES
L’optimisation des requêtes constitue l’un des aspects les
plus importants dans le domaine des bases de données, d’où
l’intérêt des chercheurs pour ce domaine, et ce depuis les
années 70. Plusieurs travaux de recherche ont proposé
diverses solutions s’inspirant, entre autre, de l’intelligence
artificielle, la théorie des graphes, etc. Il y a eu également
l’apparition de plusieurs surveys développés principalement
par les pionniers du domaine [17, 15, 12, 3].
A. Introduction au problème d’optimisation des requêtes
La nature déclarative des langages d’interrogation des
bases de données, – c.-à-d. que ces langages ne fournissent
aucune restriction à propos des chemins d’accès aux données
–, ainsi que l’évolution des structures d’optimisation,
conduisent à l’existence d’une multitude d’alternatives, pour
exécuter une requête aussi simple soit elle. Ces alternatives
sont toutes équivalentes en termes de résultat final, mais
peuvent avoir des coûts très différents. Ces coûts se
traduisent par les ressources qu’elles utilisent pour exécuter
la requête, d’où la nécessité d’optimiser les requêtes.
Cependant, l’augmentation de la complexité des requêtes et
du nombre de requêtes à traiter simultanément rend la tâche
d’optimisation très coûteuse en temps [13]. D’où le
problème d’optimisation des requêtes (Query Optimization
Problem -QOP-).
B. Déscription des différents modèles d’optimisation des
requêtes
Il existe essentiellement deux modes d’optimisation, le
premier à base de règles et le second à base de coûts. Le
premier bien qu’il soit facile à mettre en œuvre, reste
cependant très simpliste et donc peu fiable. Le second en
l’occurrence est beaucoup plus fiable, mais il est lent.
Suite à cela un troisième mode a été proposé ces
dernières années. Il se base sur l’exploitation des plans
d’exécution antérieurs afin de prédire les plans futurs (sur la
base d’une fonction de similarité). Quelques SGBD l’ont
déjà adopté mais sous des formes simples (à l’exemple
d’Oracle qui l’utilise dans un cadre très restreint qui est celui
de la similarité syntaxique).
1) Mode d’optimisation à base de règles
Dans cette approche (considérée comme la plus
ancienne), un ensemble de règles prédéfinies est appliqué par
l’optimiseur afin de générer un plan d’exécution, considéré
comme intéressant pour une requête donnée. Ces règles,
triées par ordre de priorité, indiquent les chemins d’accès et
les méthodes de jointure à utiliser selon les structures
d’optimisation disponibles.
Bien que ce type d’optimisation soit facile à mettre en
œuvre, il néglige cependant tous les paramètres physiques de
la base de données (taille des tables, facteurs de sélectivité
des prédicats de sélection et de jointure, etc.).
2) Mode d’optimisation à base de coût
Dans cette technique, un modèle mathématique est utilisé
afin d’estimer le coût de chaque plan. La solution optimale
est le plan ayant le coût minimum. Cette optimisation est
plus rigoureuse car elle prend en compte les données
physiques de la base.
Cette technique est celle utilisée actuellement par tous les
SGBD. Ce qui diffère, se sont les mécanismes utilisés pour
estimer le coût d’un plan d’exécution. Ces procédés sont
maintenus secrets par les concepteurs des SGBD, car se sont
eux qui déterminent la qualité de l’optimiseur de requêtes,
qui constitue l'élément de compétitivité entre les différents
SGBD.
Néanmoins l’optimisation à bases de coûts présente
quelques défauts, qui sont les suivants :
•
La nécessité d’avoir des statistiques fraîches sur la
base de données, et le coût de leur mise à jour.
•
Dans le cas où les plans candidats pour l’exécution
sont nombreux, l’optimiseur est contraint à
sélectionner un plan sous-optimal afin de respecter le
temps de réponse.
3) Mode d’optimisation basé sur la réutilisation des
plans d’exécution
Cette dernière technique est la plus récente. Elle se base
sur la réutilisation des plans d’exécution antérieurs, afin
d’anticiper la sélection des plans futurs en utilisant des
fonctions de similarité.
Cette technique n’est pas considérée comme une
technique d’optimisation de requêtes à part entière, mais elle
constitue une valeur ajoutée à l’optimiseur, car dans le cas
d’absence de similarité, on fait appel à l’optimiseur
classique. Cependant cette approche a pour avantage de
décharger l’optimiseur classique, et de lui permettre ainsi de
travailler dans son plus haut niveau, et par conséquent de
fournir des plans d’exécution de qualité. Ce qui se
répercutera positivement sur les plans des requêtes futures.
III.
TRAVAUX EN ANTERIEURS
Les méthodes basées sur la réutilisation des plans
d’exécution, ont pour but d’alléger la tâche de l’optimiseur
de requêtes, et d’accélérer ainsi le processus d’optimisation,
et par conséquent le temps de réponse. La diminution de la
charge sur l’optimiseur lui permettra également de travailler
dans son plus haut niveau, et d’offrir ainsi des plans de
qualité. Ces plans seront par la suite utilisés pour des
requêtes futures.
Il est à signaler que ce type d’optimisation constitue une
valeur ajoutée à l’optimiseur de requêtes en augmentant ses
performances, et non un modèle d’optimisation à part
entière.
Vu l’originalité de cette approche, plusieurs méthodes
basées sur la réutilisation des plans d’exécution ont été
proposées. Ces méthodes utilisent le même principe sous
des heuristiques différentes.
Elles s’inscrivent
essentiellement dans le domaine de l’optimisation multiple,
et celui de l’optimisation paramétrique. Dans lesquels les
requêtes sont modélisées sous forme d’arbres [10, 14] ou de
graphes [4, 2, 18]. La modélisation sous forme d’arbres fut
abandonnée, car elle s’est avérée trop restrictive (voir
exemple [2]). Les graphes quant à eux, se sont adaptés
naturellement à la structure même de la requête, ce qui fait
qu’ils soient largement utilisés pour représenter les requêtes,
et sont appelés Query Graph.
L’approche que nous avons proposée est basée
essentiellement sur deux méthodes récemment proposées
[16, 18].
La première [16] dans laquelle un outil appelé PLASTIC
(PLAn Selection Through Incremental Clustering) a été
proposé, dont le principe est d’établir des similarités entre les
requêtes en les représentant sous forme de vecteurs contenant
des attributs significatifs, tels que les tailles des tables, leur
nombre, etc. Ces vecteurs seront utilisés dans une fonction
de distance, grâce à laquelle les requêtes jugées similaires
(ayant le même plan d’exécution) seront regroupées dans des
clusters construits de façon incrémentale. Dès qu’une
nouvelle requête arrive elle sera assignée au cluster le plus
adéquat, et de ce fait s’exécutera sous le plan de ce cluster.
Bien que cette méthode soit riche, et couvre de façon
complète le processus d’optimisation des requêtes, réutilisant
les plans d’exécution, elle est cependant de complexité
exponentielle O(N!) – N étant le nombre de tables
impliquées dans la requête –, ce qui ne résout pas le
problème de la lenteur du processus d’optimisation. De plus,
elle ne prend pas en considération les coûts engendrés par les
jointures, ce qui peut entrainer des erreurs dans le calcul de
coût des requêtes impliquant ces opérations.
La seconde méthode [18] se base aussi sur la réutilisation
des plans d’exécution, mais s’inscrit dans un cadre
totalement différent, qui est celui de la détection de sous
requêtes similaires dans une requête complexe. Dans cette
approche, la requête est modélisée sous forme d’un graphe
étiqueté avec les informations essentielles requises pour
l’établissement de la similarité.
Une heuristique de
recherche des paires de sous requêtes similaires a été
proposée, elle a pour avantage d’être de complexité
polynomiale O(N4). Cependant cette méthode présente
quelques insuffisances qui sont: la recherche par paire de
sous requêtes similaires, la non garantie de trouver les sous
requêtes maximales, son applicabilité au cas restreint des
requêtes complexes possédant des sous requêtes similaires.
IV.
APPROCHE PROPOSEE
A. Domaine de requêtes considérées
Dans notre approche, nous traitons les requêtes simples
conjonctives comprenant les opérations de jointures et de
sélection.
Les requêtes considérées sont de la forme :
select * from R1, R2,… where jointure1, jointure2,…,
selection1, selection2,…
Les prédicats de jointure et de sélection considérés sont
de la forme R.a ø C ou R1.a1 ø R2.a2, où ø est dans {=, <, ≤,
>, ≥} et ø’ dans {=}; R, R1, R2 sont des tables de la base de
données, a, a1, a2 sont des colonnes sur ces tables
respectivement, et C une constante dans le domaine de R.a.
B. Modélisation des requêtes
Les requêtes sont modélisées sous forme de graphes
étiquetés non orientés.
1) Construction des graphes
Les graphes utilisés pour modéliser les requêtes sont
construits comme suit :
•
Chaque nœud du graphe correspond à une table de la
requête.
•
Chaque arête (Ni, Ni’), désigne l’existence d’une
relation de jointure entre les tables représentées par
les nœuds Ni, Ni’.
2) Etiquetage des graphes
Afin d’établir la comparaison entre les requêtes, nous
avons rajouté aux graphes précédents des informations. Ces
informations comprennent:
•
L’existence ou non d’index dans les opérations de
jointures et de sélection.
•
Les différents facteurs de sélectivité engendrés par
les opérations de jointure et de sélection. Ces
facteurs sont calculés à partir de formules simples
qui supposent que les données sont distribuées
suivant une loi uniforme [17].
Dans notre approche l’étiquetage se fait sur les nœuds et
les arêtes comme suit :
a) Etiquetage des nœuds
Sur les nœuds on retrouve les informations suivantes:
•
att_sel (Ni). Cet attribut est mis à 1 si la table
représentée par le nœud Ni possède au moins un
index sur l’un de ces attributs impliqués dans les
sélections.
•
fact_sel (Ni). Cet attribut représente le facteur de
sélectivité engendré par toutes les sélections
effectuées sur la table représentée par le nœud Ni.
b) Etiquetage des arêtes
Sur les arêtes on retrouve les informations suivantes :
•
att_join (Ni, Ni’). C’est un couple dans lequel
chaque attribut est mis à 1 si la table représentée par
son nœud possède un index sur l’attribut de jointure
correspondant à l’arête (Ni, Ni’).
•
fact_join (Ni, Ni’). Cet attribut représente le facteur
de sélectivité engendré par toutes les jointures entre
les tables représentées par les nœuds Ni, Ni’, ainsi
que toutes les sélections y ont été effectuées.
C. Etablissemnt de la similarité
La comparaison entre deux requêtes Q1, Q2 est établie
suivant le pseudo algorithme suivant :
Nouvelle
Requête
Construire son graphe
non étiqueté
Etablir de l’isomorphisme avec les
graphes non étiquetés d’anciennes
requêtes
Bool Comparaison (Q1,Q2)
Construction des graphes G1, G2 /* G1 est le graphe de
la requête optimisée et G2 est le graphe de la requête
à optimiser /*
Soit A= {C1, C2,…, Cn} // Les différentes
combinaisons assurant l’isomorphisme entre G1 et G2
non étiquetés.
Si A ≠ ø
Etablir de
l’isomorphisme avec
les graphes non
étiquetés d’anciennes
requêtes
Alors si ∃ Ck dans A tel que /* k dans {1,.., n}
Pour toute paire de nœuds Ni de G1 et Nj de G2 :
att_sel(Ni) ≤ att_sel(Ni’)
N
o
et|fact_sel(Ni) – fact_sel(Ni’)|/MAX((fact_sel(Ni),
fact_sel(Ni’)) < s
Faire appel à l’optimiseur
classique
O
Sauvegarder le nouveau
graphe dans un nouveau
cluster
et Pour toute paire d’arêtes similaires (Ni, Ni’) de
G1 et (Nj, Nj’) de G2 :
att_join (Ni, Ni’) ≤ att_join (Nj, Nj’)
Etiqueter du graphe
et |fact_join (Ni, Ni’) – fact_join (Nj, Nj’)|/
MAX ((fact_join (Ni, Ni’),fact_join (Nj, Nj’)) < s’
Alors similarité (Q1, Q2)=Vrai
Sinon similarité (Q1, Q2)=Faux
Etablir de
l’isomorphisme avec
les graphes non
étiquetés d’anciennes
requêtes
Finsi
Sinon similarité (Q1, Q2)=Faux
Finsi
Figure 1. Pseudo algorithme pour l’établissement de la similarité
Appliquer le même
plan d’exécution
que la requête
correspondante
s et s’ sont des seuils pouvant être déterminés
expérimentalement.
D. Architecture du système
Les requêtes déjà optimisées sont stockées dans des
clusters. Chaque cluster contient les requêtes dont les
graphes non étiquetés sont isomorphes (figure 2).
Lorsqu’une nouvelle requête arrive, on lui construit en
premier lieu son graphe non étiqueté qui sera comparé aux
graphes représentant les clusters. Cette première étape a
pour but de diminuer le nombre de comparaisons et d’arrêter
le processus de comparaison tôt dans le cas où aucune
requête similaire n’est stockée. Si aucune similarité n’est
trouvée, un graphe étiqueté de cette requête est établi et sera
sauvegardé dans un nouveau cluster qui sera représenté par
son graphe non étiqueté. Dans le cas contraire, un graphe
étiqueté de cette requête est construit et sera comparé aux
requêtes appartenant au cluster correspondant. S’il y a une
similarité, le plan de la requête similaire sera appliqué à la
nouvelle requête, sinon le graphe étiqueté de la nouvelle
requête sera stocké dans le cluster correspondant et servira à
enrichir l’ensemble des graphes utiles à la comparaison.
O
N
Faire appel à l’optimiseur
classique
Sauvegarder le nouveau
graphe dans le cluster
correspondant
Figure 2.
V.
Architecture du système proposé
TESTS ET RESULTATS
A. Outils utilisés
Afin d’effectuer les tests, nous avons utilisé les outils
suivants :
•
L’optimiseur d’Oracle 11g pour valider notre
approche.
•
La librairie VFLIB version 2 [6] pour la construction
et l’établissement de l’isomorphisme. Cette libraire
utilise
comme
algorithme
d’isomorphisme
l’algorithme VF. Cet algorithme est de complexité
temporelle allant de O(N²) à O(N!N) [5] suivant les
types des graphes, où N est le nombre de nœuds.
Cette complexité est celle de notre algorithme, car
toutes les autres fonctions de l’algorithme sont de
complexité polynomiale.
•
Visual C++ version 9 pour implémenter notre
algorithme.
•
Une machine ayant un processeur core 2 duo, avec 2
GB de RAM.
B. Tests effectués
Nous avons effectué des tests sur le benchmark APB1 [1]
qui contient au total 55 requêtes. Ces requêtes ont été
transformées en la forme considérée. Les informations
nécessaires sur le Benchmark APB1, ainsi que la façon dont
il a été exploité sont résumées dans le tableau suivant :
TABLE I.
CARACTERISTIQUES DES REQUETES DU BENCHMARK APB1
Nombre de
jointures
Nombre
requêtes
de
Nombre de requêtes pour
l’apprentissage
1
31
7
2
11
3
3
6
1
4
7
2
Figure 3. Temps d'optimisation moyen (secondes) d'Oracle et de notre
outil (seuil 0.3) suivant le nombre de jointures
Remarques.
•
Pour nos tests les seuils s et s’ ont été fixés à 0.3.
•
Vu la taille réduite de l’ensemble d’apprentissage,
nous avons choisi les requêtes qui le composent les
plus hétérogènes possibles, pour qu’il soit
suffisamment représentatif de l’ensemble de requêtes
considéré.
C. Résultats obtenus
Pour valider notre approche, deux paramètres ont été pris
en considération, à savoir :
•
Le temps d’optimisation.
•
Le taux de prédictions conformes à celles d’Oracle.
Les résultats relatifs au premier paramètre sont résumés
dans les graphes suivants :
Figure 4. Temps d’optimisation moyen en secondes d’Oracle et de notre
outil (seuil 0.3) pour toutes les requêtes du benchmark APB1
Les résultats obtenus se présentent comme suit :
•
Notre outil est en moyenne plus de 12 fois plus
rapide que l’optimiseur d’Oracle 11g.
•
Près de 70% de nos prédictions sont conformes à
celles d’Oracle. Les prédictions non conformes sont
toutes de type faux négatif c.-à-d. que notre outil
suppose que deux requêtes ne sont pas similaires
alors qu’Oracle leur sélectionne le même plan
d’exécution (ce résultat peut être amélioré en
augmentant les seuils mais cela risque de générer des
erreurs du type inverse).
VI.
CONCLUSION
Nous avons présenté une approche d’optimisation de
requêtes basées sur la réutilisation des plans d’exécution.
Cette façon de faire a pour but principal de décharger
l’optimiseur de requêtes et de lui permettre ainsi de travailler
dans son plus haut niveau, sans oublier le but principal de
cette approche qui est celui de réduire le temps
d’optimisation en réutilisant des plans déjà générés.
Dans notre approche, la requête est modélisée sous forme
d’un graphe souvent appelé Query Graph, sur lequel sont
greffées les informations nécessaires décrivant la requête.
Ces informations concernent les facteurs de sélectivité ainsi
que la disponibilité des index. Les requêtes considérées sont
des requêtes simples contenant les opérations de jointures et
de sélection.
L’utilisation des graphes à transformé le problème de
comparaison des requêtes en un problème d’isomorphisme
de graphes. Pour établir l’isomorphisme nous avons utilisé
l’algorithme VF considéré comme l’un des plus performants
[7].
Les tests effectués sur le Benchmark APB1, avec un seuil
de 0.3, ont donné des résultats satisfaisants, à savoir que
notre outil est en moyenne plus de 12 fois plus rapide que
l’optimiseur d’Oracle 11g, avec près de 70% de bonnes
prédictions.
Il reste cependant à introduire les opérations de
projections, ainsi que la prise en compte d’autres structures
d’optimisation que les index, comme les vues matérialisées.
REFERENCES
[1]
[2]
APB1 OLAP Council, “APB-1 olap benchmark, release II,”
http://www.olapcouncil.org/research/bmarkly.htm.
U.S. Chakravarthy and J. Minker, “Multiple Query Processing in
Deductive Databases using Query Graphs, ” VLDB Conference,
pages 384-391, 1986.
[3]
[4]
[5]
[6]
[7]
[8]
S. Chaudhuri, “An overview of query optimization in relational
systems,” In Proceedings of the Seventeenth ACM SIGACTSIGMOD-SIGART Symposium on Principles of Database Systems.
ACM Press, pages 34 –43, 1998.
F.C.F. Chen and M. H. Dunham, “Common subexpression processing
in multiple-query processing,” IEEE Transactions on Knowledge and
Data Engineering, Vol 10, No 3, pages 493–499, 1998.
L.P. Cordella, P. Foggia, C. Sansone, M. Vento, “Performance
evaluation of the VF Graph Matching Algoritmh, ” Proc. of the 10th
ICIAP, IEEE Computer Society Press, pages 1172–1177, 1999.
P. Foggia, “The vflib graph matching library, ” version 2.0. 2001.
http://amalfi.dis.unina.it/graph/db/vflib-2.0/doc/vflib.html.
P. Foggia, C. Sansone, M. Vento, “A performance comparison of five
algorithms for graph isomorphism, ” Proceedings of the 3rd IAPRTC15 Workshop on Graph based Representation (GbR2001), Italy,
2001.
G. Gardarin, “Bases de données,” Eyrolles Ed., pages 301–349, 2005.
[9]
[10]
[11]
[12]
[13]
[14]
[15]
[16]
[17]
[18]
A. Ghosh, J. Parikh, V. Sengar and J. Haritsa, “Plan Selection based
on Query Clustering,” Proc. of 28th Intl. Conf. on Very Large Data
Bases (VLDB), pages 179–190, Hong Kong, China, August 2002.
P.A.V. HALL, “Common suhexpression identification in general
algebraic systems,” Tech. Rep. UKSC 0060, IBM United Kingdom
Scientific Centre, Nov. 1974.
T. Ibaraki and T. Kameda, “On the optimal nesting order for
computing n-relational joins,” ACM-TODS, pages 482–502,
September 1984.
Y. Ioannidis, “Query Optimization,” ACM Computing Surveys,
symposium issue on the 50th Anniversary of ACM, Vol. 28, No. 1,
pages 121–123, March 1996.
Y. Ioannidis and Y. Kang. “Randomized algorithms for optimizing
large join queries,” In Proc. ACM-SIGMOD Conference on the
Management of Data, pages 312–321, Atlantic City, NJ, May 1990.
M. Jarke, “Common subexpression isolation in multiple query
optimization,” Querz Processing in Database Systems, pages 191–
205, 1984.
M. Jarke and J. Koch, “Query optimization in database systems,”
ACM Computer Surveys, Vol 16, pages111–152, 1984.
P. Sarda and J. Haritsa, “Green Query Optimization: Taming Query
Optimization Overheads through Plan Recycling,” Proc. of 30th Intl.
Conf. on Very Large Data Bases (VLDB), pages 1333–1336,
Toronto, Canada, September 2004.
P. Selinger, M. Astrahan, D. Chamberlin, R. Lorie, T. Price, “Access
path selection in relational database systems,” In: Proc. Of SIGMOD.
pages 23–34, Boston, Mass., USA, 1979.
Q. Zhu, Y. Tao, and C. Zuzarte, “Optimizing complex queries based
on similarities of subqueries,” Information Systems, Vol 8, No 3,
pages 350–373, 2005.