Side 1Copyright © 2007 JaKoFi. All rights reserved. DB2 Performance: Optimering af SQL læsninger mod DB2 med AllFusion Gen Jan Erik Jensen, JaKoFi
Side 2Copyright © 2007 JaKoFi. All rights reserved. Formål med gennemgangen At give en forståelse for DB2’s virkemåde ved udførsel af læsninger for derved at forstå hvordan performance kan påvirkes positivt.
Side 3Copyright © 2007 JaKoFi. All rights reserved. Optimering af SQL læsninger mod DB2 Præsentationens indhold Muligheder for optimering ”Undlad” SQL'et Indekser Ændret datamodellering Gennemgang af teknikken bag tabeller og indekser Principperne bag DB2's valg af accessveje til dataene Indholdet af DB2's explaintabel Måleværktøjer til måling af DB2 performance Arbejdsprocessen ved performanceoptimering af DB2 Snydetricks
Side 4Copyright © 2007 JaKoFi. All rights reserved. Indholdet af et READ / SUMMARIZE EACH statement READ EACH entity entity SORTED ASCENDING entity attribute WHERE DESIRED entity attribute IS EQUAL TO local-view attribute AND DESIRED entity attribute IS EQUAL TO local-view attribute AND DESIRED entity is_related_to DESIRED entity SUMMARIZE EACH GROUP OF entity entity WITH THE SAME entity attribute PLACING entity attribute INTO local-view attribute PLACING GROUP count(OCCURRENCES) INTO local-view attribute WHERE DESIRED entity attribute IS EQUAL TO local-view attribute AND DESIRED entity attribute IS EQUAL TO local-view attribute AND DESIRED entity is_related_to DESIRED entity
Side 5Copyright © 2007 JaKoFi. All rights reserved. Indholdet af en SQL læsning SELECT kolonne, kolonne, … FROM tabel, tabel, … WHERE kolonne = :hostvariabel AND kolonne = :hostvariabel, … GROUP BY kolonne, kolonne, … HAVING … ORDER BY kolonne, kolonne, … OPTIMIZE FOR xxx ROWS Der angives hvad der ønskes læst – ikke hvordan det fysisk forventes hentet. <- Viewenes attributter <- Entiteternes tabeller <- Statementets where-kriterie <- Summarize’s ”with the same” <- Sorted by på read each <- Statementets optimize markering
Side 6Copyright © 2007 JaKoFi. All rights reserved. Eksempel på en forespørgsel Data: Kunder (kundenr, kundenavn, leveringsadresse (vejnavn, husnummer, postnummer, postdistrikt), faktureringsadresse) Ordrer (ordrenr, ordredato, leveringsdato, status (U = udestående, L = leveret), kundenr, ordretotal) Ønsket resultat: En liste med alle udestående ordrer for ordrer bestilt til levering i marts 2007 og bestilt af kunder med postnummer 1780 i deres leveringsadresse.
Side 7Copyright © 2007 JaKoFi. All rights reserved. Eksempel på en konkret SQL læsning SELECT kunde.kundenr, ordre.ordrenr, ordre.leveringsdato, ordre.ordretotal FROM ordre, kunde WHERE kunde.levering_postnr = 1780 AND kunde.kundenr = ordre.kundenr AND ordre.leveringsdato between ’ ’ and ’ ’ AND ordre.status = ’U’ ORDER BY kunde.kundenr, ordre.ordrenr DB2 vælger selv hvordan læsningen fysisk udføres og resultatet sammenstykkes.
Side 8Copyright © 2007 JaKoFi. All rights reserved. Indekser En sorteret liste af nogle udvalgte kolonner fra en tabel defineret i en bestemt rækkefølge og sorteret stigende eller faldende. Indekset giver en hurtig (indekseret) tilgang til dataene, hvis de benyttes i den rækkefølge de indgår i indekset. En tabel kan have mange indekser. DB2 vedligeholder automatisk indekserne når rækker indsættes, opdateres eller slettes fra en tabel.
Side 9Copyright © 2007 JaKoFi. All rights reserved. Eksempel på indekser til kunde og ordre eksemplet Kunde: 1: Kundenr 2: Kundenavn, levering_postnr Ordre: 1: Ordrenr 2: Kundenr, Ordrenr 3: Leveringsdato
Side 10Copyright © 2007 JaKoFi. All rights reserved. Eksempel på indekser på ordre tabellen OrdrenrRowid …… …… KundenrOrdrenrRowid ……… ……… Lev.datoRowid …… …… OrdrenrKundenrOrdredatoLev.datoStatus… ……………… U… ……………… Rowid 278 Tabellen Indekserne
Side 11Copyright © 2007 JaKoFi. All rights reserved. Fysisk lagring af data på ordre tabellen OrdrenrKundenrKundenavnLev.dato… …………… Hansen … …………… …………… …………… …………… …………… …………… …………… …………… Rowid Data Page 21 Tabellen Data Page 22 Data Page Tabellen er sorteret efter clusteringindekset
Side 12Copyright © 2007 JaKoFi. All rights reserved. Fysisk lagring af data på ordre indekset KundenrOrdrenrRowid ……… ……… ……… ……… ……… … Index Page KundenrOrdrenrRowid ……… ……… ……… ……… Index Page KundenrOrdrenrIndex Pg ……… … … ……… ……… ……… Index Page Indekser er lagret som en træstruktur (typisk med niveauer) Index Row
Side 13Copyright © 2007 JaKoFi. All rights reserved. Fysisk lagring af data på indekser og tabeller Index Page Index Page Index Page Index Page Index Page Index Page Index Page Index Page Index Page Index Page Index Page Index Page Index Page Index Page Data Page 4/32K Data Row Data Page 4/32K Data Row Data Page 4/32K Data Row Data Page 4/32K Data Row Clustering- indeks
Side 14Copyright © 2007 JaKoFi. All rights reserved. DB2’s valg af accessveje DB2 vælger accessvej ud fra: Indekserne på tabellerne som læses Reduktionsfaktoren for de enkelte kolonner i indekset Sorterings- eller grupperingsrækkefølgen i læsningen (hvis angivet) Antallet af rækker i tabellen (table space scan på små tabeller) Hvis DB2 kan nøjes med at læse indekset (indexonly), så gør den det Hvis der læses flere tabeller i læsningen, så sker det (oftest) en af gangen Reduktionsfaktoren for kolonner: Angiver mængden af forskellige værdier og dermed hvor meget angivelse af kolonnen forventeligt vil reducere den samlede mængde rækker fra tabellen med.
Side 15Copyright © 2007 JaKoFi. All rights reserved. Eksempel på DB2’s valg af accessveje SQL’et SELECT kunde.kundenr, ordre.ordrenr, ordre.leveringsdato, ordre.ordretotal FROM ordre, kunde WHERE kunde.levering_postnr = 1780 AND kunde.kundenr = ordre.kundenr AND ordre.leveringsdato between ’ ’ and ’ ’ AND ordre.status = ’U’ ORDER BY kunde.kundenr, ordre.ordrenr Indekserne Kunde: 1: Kundenr 2: Kundenavn, levering_postnr Ordre: 1: Ordrenr 2: Kundenr, Ordrenr 3: Leveringsdato DB2’s valg af indeks Ordre indeks nummer 3 er det eneste indeks, som giver en reduktion i mængden af læste records. For hver læst ordre (med status U) vil den tilhørende kunde kunne hentes via kunde indeks nummer 1 for at kontrollere leveringspostnummeret (1780). Resultatet skal efterfølgende sorteres.
Side 16Copyright © 2007 JaKoFi. All rights reserved. Mål for optimeringen af SQL læsningerne Reducer mængden af fysisk I/O (”getpages”) – både index pages og data pages. Reducer mængden af behandlede rækker Færre getpages giver mindre ventetid (på grund af fysiske læsninger og på grund af låste rækker) og dermed kortere svartid Færre behandlede rækker giver mindre CPU forbrug og dermed kortere svartid og billigere drift Begge dele giver større evne til at håndtere flere samtidige transaktioner og dermed færre deadlocks og timeouts
Side 17Copyright © 2007 JaKoFi. All rights reserved. Indhold af DB2’s explain-tabel For hver DBRM/Package og hvert SQL statement findes information om: De enkelte trin i læsningen Hvilke indeks der blev anvendt (hvis nogen) Hvordan tabellen/indekset blev læst Om der blev udført sortering i læsningen Explain-tabellen får sit indhold af DB2’s Optimizer ved Bind eller Rebind
Side 18Copyright © 2007 JaKoFi. All rights reserved. Udtræk af information fra DB2’s explain-tabel SQL til udtræk fra explain-tabellen (PLAN_TABLE): SELECT * FROM ENVP.PLAN_TABLE PTA WHERE PROGNAME LIKE 'KUNDE%' AND BIND_TIME = ( SELECT MAX(BIND_TIME) FROM PROD.PLAN_TABLE PTB WHERE PTB.PROGNAME = PTA.PROGNAME ) ORDER BY PROGNAME, QUERYNO, TIMESTAMP, QBLOCKNO, PLANNO, MIXOPSEQ
Side 19Copyright © 2007 JaKoFi. All rights reserved. Eksempel på indhold af DB2’s explain-tabel Gennemgang af regnearket med udtræk fra explain-tabellen Eksempel på udtræk fra explain-tabellen
Side 20Copyright © 2007 JaKoFi. All rights reserved. Måleværktøjer - Detector, Strobe eller Omegamon Kan typisk give her-og-nu information om DB2 performance og ressourceforbrug Præsenterer blandt andet DB2’s egne performancemålinger Giver et rigtig godt indtryk af, hvor problemerne findes Giver information om den fysiske tilgang til dataene Eksempel på output fra Detector
Side 21Copyright © 2007 JaKoFi. All rights reserved. Arbejdsprocessen ved optimering Find en konkret DBRM/Package som ser ud til at have problemer (via måleværktøjer som Detector, Strobe eller Omegamon) Kig på accessveje ifølge explain-tabellen Undersøg indekserne på de læste tabeller Kig på SQL’et og vurder om DB2’s valg af accessvej ser fornuftig ud Vurder om: SQL’et kan ændres (eventuelt splittes op eller på anden måde forenkles) eller eventuelt er fejlbehæftet DB2 burde vælge andre indekser og eventuelt skal forsøges tvunget dertil (med ændret SQL) Der mangler eller er defineret forkerte indekser på tabellen Der eventuelt er behov for ændret datamodellering
Side 22Copyright © 2007 JaKoFi. All rights reserved. Arbejdsprocessen ved nyudvikling/redesign Foretag datamodellering af dataene (nogenlunde på 3. normalform) Lav analyse af den forventede access til dataene Foretag denormalisering af data (men kun hvis behovet er åbenlyst på designtidspunktet) Design indekserne ud fra: Analysen af den forventede access Krav til dataintegritet (typisk entydighed på den brugervendte nøgle) Krav på baggrund af RI (indekser på fremmednøgler) Behov for at kunne joine mellem tabeller Behovet for at kunne udsøge rækker fra tabellen (til søgefunktioner i dialogen) Hold løbende øje med at der findes indekser, som understøtter læsningerne i det SQL, som efterfølgende laves.
Side 23Copyright © 2007 JaKoFi. All rights reserved. Snydetricks til at gennemtvinge ændret access READ EACH entity entity SORTED ASCENDING entity attribute WHERE entity attribute + 0 IS EQUAL TO local-view attribute AND concat(entity attribute,””) IS EQUAL TO local-view attribute AND entity is_related_to entity READ EACH entity entity SORTED ASCENDING entity attribute WHERE (entity attribute IS EQUAL TO local-view attribute OR 0 = 1) AND entity attribute IS EQUAL TO local-view attribute AND entity is_related_to entity Metode (numeriske felter) + 0 DAYS (datoer) Concat (tekstfelter) Metode 2 Tilføj OR 0 = 1 for at undgå brug af indeks
Side 24Copyright © 2007 JaKoFi. All rights reserved. Den samlede værktøjskasse Måleværktøj: Detector, Strobe eller Omegamon Analyseværktøj: Explain-tabellen Teoriapparatet: DB2’s valg af dataaccess og reduktion af mængden af getpages
Side 25Copyright © 2007 JaKoFi. All rights reserved. Spørgsmål? Jeg kan kontaktes via: