Automatisch optimaliseren van SQL
Auteur: Rick F. van der Lans
Geschreven: februari 1999
Gepubliceerd in: CM Corporate.Net, nummer 126

Het is een bekend fenomeen in datawarehouse-omgevingen: queries die online ingevoerd worden en uren duren voordat een antwoord op het scherm verschijnt. Zonder dat de gebruiker zich hiervan bewust is, wordt door het OLAP-tool zijn of haar ogenschijnlijk simpele vraag (het waren tenslotte slechts drie buttonklikken) achter de schermen leiden tot zeer complexe SQL-instructies. Met deze instructie worden vele tabellen gejoined en worden ingewikkelde berekeningen uitgevoerd. De Amerikanen hebben voor dit soort instructies zeer 'lovende' namen: 'the query from hell', 'the runaway query' of 'the query that dims the light'.
Voor elke gebruiker die op het antwoord zit te wachten, is een instructie die meer dan één minuut duurt uiteraard onacceptabel. Maar wat kunnen we eraan doen? Uiteraard bestaan er diverse trucs en technieken om SQL-instructies te versnellen, waaronder het toevoegen van indexen, het denormaliseren en partitioneren van tabellen. Veel van deze technieken werken alleen als de instructies vooraf bekend zijn. Bij een gebruiker die een OLAP-tool gebruikt, is dit echter niet altijd het geval. Deze gebruikers kunnen in principe elke dag een andere verzameling vragen stellen.
Eén van de optimalisatietechnieken is het herformuleren van instructies. Specialisten in SQL zijn hiermee bekend. Twee instructies die dezelfde antwoorden geven, maar anders geformuleerd zijn, kunnen zeer uiteenlopende performances hebben. Door bijvoorbeeld een join te vervangen door een subquery (of andersom), kan de performance met een factor honderd verbeterd worden. Maar de techniek van herformuleren heeft alleen zin als een instructie minstens twee keer wordt uitgevoerd (om een voor de hand liggende reden) en als de gebruiker de herformulering kan uitvoeren. Indien het OLAP-tool volledig achter de schermen de SQL-instructies genereert en afvuurt op de databaseserver, is er geen ruimte voor de gebruiker om een gegenereerde en slecht geformuleerde instructie te verbeteren.
Voor veel datawarehouses is dit een serieus probleem. Om dit specifieke probleem op te lossen zijn er nu speciale producten op de markt verschenen, waaronder Cyrano Insight, Teleran System en SQL Optimizer van Sylvain Faust. Alle drie de producten worden tussen het OLAP-tool en de databaseserver geïnstalleerd. Instructies gegenereerd vanuit het OLAP-tool worden onderschept voordat ze naar de databaseserver worden gestuurd. Vervolgens controleren ze de kwaliteit van de instructies en indien noodzakelijk worden ze door middel van herformulering geoptimaliseerd. De geoptimaliseerde instructie wordt naar de databaseserver doorgestuurd. In feite hebben de gebruiker en de databaseserver geen weet van deze tussenpartij.
Herformulering geschiedt op basis van kennis over de optimizer van de databaseserver, de hoeveelheid gegevens in de tabellen, de verdelingen van waarden in kolommen, enzovoorts. De producten van Teleran en Sylvain Faust gaan nog een stap verder. Resultaten worden soms vastgehouden die dan worden herbruikt bij volgende instructies.
Alle beheerders van datawarehouses waar gebruikers online gegevens mogen bevragen en waarvan de vragen van te voren onbekend zijn, adviseer ik deze producten eens te bestuderen. Vergeet niet, het verschil tussen een efficiënt en een slecht geformuleerde SQL-instructie kan enorm zijn; het kan letterlijk uren bedragen. Een return-on-investment is dan snel bereikt.