Prettylib-tuoteratkaisut - Wiki

Performance optimization and tuning

Huom: Tämä artikkeli käsittelee edistyneempiä optimointeja SQL Server tietokannassa, joita ei normaaliolosuhteissa ole tarpeen tehdä.

Cachen tyhjentäminen

Ei tarvitse käynnistää SQL Serveriä uudelleen, että saa cachen osalta (esim. benchmarkkeja varten) tyhjennettyä.

dbcc dropcleanbuffers


Wait-statistiikan tyhjentäminen

dbcc SQLPERF('sys.dm_os_wait_stats',clear)

Execution plan

Execution plan proceduurille luodaan ensimmäistä kertaa plan cachen tyhjentämisen jälkeen uudelleen. Ongelma tästä voi syntyä sellaisessa tilanteessa, että procedurelta kysytään tietoa, joka poikkeaa tavanomaisesta.

Esimerkiksi proceduurilta kysytään jotain, joka palauttaa vain muutaman rivin vaikka normaalisti palautetaan tuhansia/kymmeniätuhansia rivejä. Tällöin execution planiksi voi optimoijan takia tulla jotain, joka poikkeaa hyvin paljon normaalista. Esim. pyydetään jotain, joka löytyy indeksistä vain muutaman kerran; tällöin voidaan tehdä index seek, mutta pyydettässä jotain, jota on taulussa esim 90% arvoista kannattaisi tehdä samantien table scan.


Erilaisia hyödyllisiä funktioita tai system view

Katso books onlinesta esimerkit ja varsinainen käyttö.


indeksin statistiikkaa

sys.dm_db_index_operational_stats

Tiedoston statistiikkaa

Hyödyllinen esim. tempdb:n vahtimiseen. Voi tarkkailla milloin mennään tempdb:n puolelle ja milloin ei.

DECLARE @db_id int;
SET @db_id = DB_ID(N'tempdb');
SELECT * from sys.dm_io_virtual_file_stats(@db_id, NULL)


Kyselyjen muistin vahtiminen

HUOM: katso nimenomaan paljonko varattu ja paljonko oikeasti käytetty. Jos varattu ja käytetty on samat, mennään tempdb:n puolelle == hidasta

select granted_memory_kb, used_memory_kb, max_used_memory_kb from sys.dm_exec_query_memory_grants where session_id = XX

Kyselyjen vahtiminen

Katso erityisesti wait_type

SELECT s2.dbid, s2.text, s1.*  

FROM sys.dm_exec_requests AS s1 
CROSS APPLY sys.dm_exec_sql_text(sql_handle) AS s2  
ORDER BY s1.sql_handle

Profiler

Profilerissa voi/kannattaa tarkkailla tiettyjä varoituksia liittyen esim. sorttauksen menemiseen tempdb:n puolelle.

Profilerista valitaan pelkästään "Events -> Warnings & errors -> Sort"

Kyselyt

Kyselyistä saa helposti IO tietoja laittamalla kyselyä ennen query ikkunassa tämän. Näkyy "messages" ikkunassa luvut ja kirjoitukset:

SET STATISTICS IO ON

SET STATISTICS TIME ON

Kyselyn statuksen vahtiminen (WAIT_TYPE)

Tee jostain kyselystä looppi ja toisessa query ikkunassa tarkkaile kyselyn statusta.

Esimerkki query ikkunaan 1:

WHILE 1=1
BEGIN
SELECT Id FROM JOKUTAULU WHERE xField>1000
END


Kysely query ikkunaan 2, jota suoritetaan useita kertoja ja katsotaan wait_type (katso toisen query ikkkunan session id ensin (näkyy query ikkunan "tabissä" ja korvaa se kohtaan XX):

SELECT status, wait_type FROM sys.dm_exec_requests WHERE session_id = XX 


Mikäli status pysyy "runnable" tyyppisenä, on IO:n puolesta kaikki ok. Mikäli status on "waiting" ja wait_type = "IO_COMPLETION" voi kyseessä olla tempdb:n tallennettavat tulokset (sorttaus sieltä).

Selvittämiseen käytetään artikkelissa aiemmin mainittua tempdb:n tiedoston statistiikkaa (kuinka paljon kyselyn aikana tallennettiin ja luettiin tempdb:stä)