Welcome to Sign in | Help
in Search

Imbunatatire performanta

Last post 01-11-2011, 5:58 PM by rsocol. 5 replies.
Sort Posts: Previous Next
  •  01-11-2011, 12:09 PM 8594

    Imbunatatire performanta

    Buna
    Am 3 tabele cu urmatoarea configuratie

    tbl1 - aproximativ 1.000.000 inregistrari
    column1 - PK, int
    column2 - varchar(10)
    column3 - FK, int
    column4 - int
    column5 - FK, int
    column6 - int

    tbl2 - aproximativ 200.000 inregistrari
    column1 - PK, int
    column2 - FK, int
    column3 - FK, int
    column4 - int
    column5 - decimal
    column6 - int
    column7 - int

    tbl3 - sub 100 inregistrari
    column1 - PK, int
    column2 - varchar(10)

    si am urmatorul select:
    SELECT t3.column2
    FROM tbl2 t2
    INNER JOIN tbl1 t1 ON t2.column1 = t1.column4
    INNER JOIN tbl3 t3 ON t2.column3 = t3.column1
    WHERE tbl1.column2 = @Valoare

    Intrebarea mea este cum pot imbunatatii structura tabelelor astfel incat durata de executie a acestui querry sa fie mai mic.
    Ce indexi ar trebui sa am in fiecare tabel?
    Momentan timpul de executie este de 2 secunde.


    Mai o intrebare ... de ce daca aceasta interogare este rulata din Microsoft SQl Management Studio dureaza foarte putin (0 ms), iar daca este rulata din aplicatie dureaza pana la 2 secunde.
  •  01-11-2011, 1:31 PM 8595 in reply to 8594

    Re: Imbunatatire performanta

    În tbl1, ar trebui să fie un index pe column4 (singura coloană folosită în query). În tbl3 ar trebui să fie suficient indexul clustered pe column1, index care se crează implicit odată cu PK-ul. În tbl2 aş face un index compus pe column1 şi column3 (în ordinea asta).

    Cu aceşti indecşi eu aş spera ca planul de execuţie care ar rezulta să fie un merge join (sau hash join) între tbl1 şi tbl2 (cu index scan-uri pe indecşii respectivi), urmat de un nested loops join cu clustered index seek in tbl3.

    N-am înţeles care era treaba cu WHERE-ul... avea vreo legătură cu tbl1, tbl2, tbl3?

    Răzvan
  •  01-11-2011, 1:47 PM 8596 in reply to 8595

    Re: Imbunatatire performanta

    Vezi si planul de executie.
    In SQL 2008 planul poate include si sugestii de indexare ("missing indexes").
    Pentru SQL 2005 vezi http://www.sql-server-performance.com/articles/per/Identify_Missing_Indexes_Using_SQL_Server_DMVs_p1.aspx
  •  01-11-2011, 1:47 PM 8597 in reply to 8595

    Re: Imbunatatire performanta

    partea cu Where mi-a scapat .... de fapt where e in continuare la acele select si era de genul where tbl1.column2=@valoare
  •  01-11-2011, 4:33 PM 8598 in reply to 8597

    Re: Imbunatatire performanta

    Tuning advisor-ul este o alta posibilitate. Scuze pentru omisiune.
  •  01-11-2011, 5:58 PM 8599 in reply to 8597

    Re: Imbunatatire performanta

    Conditia "where tbl1.column2=@valoare" poate schimba mult planul de execuţie. În acest caz, ar fi util şi un index (non clustered, unic dacă e cazul) pe column2 în tbl1. De asemenea, ar putea fi necesare nişte hint-uri pentru a forţa join-urile să se facă într-o anumită ordine sau cu o anumită metodă, dar asta depinde de distribuţia datelor din tabele.

    Răzvan
View as RSS news feed in XML
Powered by Community Server (Commercial Edition), by Telligent Systems