Welcome to Sign in | Help
in Search

querry execution plan for nested if in sp

Last post 04-02-2012, 9:44 AM by tebbaerty. 4 replies.
Sort Posts: Previous Next
  •  02-23-2012, 3:50 PM 9128

    querry execution plan for nested if in sp

    Salut,

    Cateodata o procedura cu foarte multe nested if-uri (~40) da timeout. Cumva execution plan-ul se recompileaza de fiecare data cand o ia pe alta ramura de if ? Nu am gasit ceva concludent, unii spuneau ca da, altii ca nu.

    Am facut o procedura cu mai multe nested if-uri, am pus un profiler si am observat ca nu se recompileaza procedura. De asemenea m-am uitat pe planul de executie si am vazut ca sunt prinse if-urile in plan. Deci nu vad nici o explicatie logica pentru care execution planul se va recompila de fiecare data cand se duce pe o alta ramura de if. Mai ales ca msdn spune clar care sunt conditiile pentru a se recompila (http://msdn.microsoft.com/en-us/library/ms181055.aspx sectiunea Recompiling Execution Plans ).

    As dori sa stiu si parerea voastra ?

    PS: desigur ca daca fac un querry dinamic, sau sparg procedura in mai multe proceduri simple, sau mut logica de if-uri in cod si pe partea de sql raman doar cele ~40 de proc as rezolva problema, insa sunt curios ce se intampla exact pentru a stii clar ce problema rezolv.
  •  02-23-2012, 10:24 PM 9131 in reply to 9128

    Re: querry execution plan for nested if in sp

    Trimite procedura, structura tabelelor si date de test.
  •  02-24-2012, 12:43 PM 9132 in reply to 9131

    Re: querry execution plan for nested if in sp

    cea pe care am creat-o eu de test ? sau pe cea reala. Din pacate pe cea reala nu o pot trimite din motive de securitate :(.

    Se pare ca de fapt problema mea nu este acel nested if cum am crezut initial, ci faptul ca pe unele if-uri se facea un select dintr-o tabela pe care existau coloane ntext. Acestea generau un numar foarte mare de lob logical reads (~30k-60k).

    In cazul in care mai are cineva aceasta problema aici e rezolvarea mea :
    Am convertit coloana la nvarchar(max) / varchar(max) si am facut un update de genul "update table set col = col" pe coloanele care erau ntext inainte. Update-ul este necesar pentru a muta datele din lob in page file-uri (se vor muta doar cele care au dimensiunea sub 4k sau 8k nu mai stiu sigur).

    Acum ca am rezolvat problema cred de fapt ca nested-if-urile nu influenteaza in mod negativ execution planul :).

    Mersi
  •  04-01-2012, 8:11 PM 9189 in reply to 9132

    Re: querry execution plan for nested if in sp

    tocmai saptamana asta citeam o carte in legatura cu performanta in sql server. execution planurile a sp-urilor nu sunt recompilate in functie de parametrii. Ai putea eventual sa incerci sa fortezi sa se compileze de fiecare data execution plan-ul la fiecare apel al sp-ului.
    prin modificare de la nvarchar la varchar ai redus doar numarul de readuri (nvarchar ocupa dublu cat varchar-ul)
  •  04-02-2012, 9:44 AM 9191 in reply to 9189

    Re: querry execution plan for nested if in sp

    stiu ca execution planul nu se compileaza in functie de valoarea parametrilor, dar totusi cred ca nu are o penalitate de performanta imensa (atat timp cat ai grija si la parameter sniffing).

    Recompilarea procedurii la fiecare apel ar fi o solutie, dar nu o consider viabila pentru ca din cate imi aduc aminte compilarea si caching-ul procedurii se face in mod serializat, iar mai multe threaduri care vor apela aceeasi procedura vor trebui sa fie sincronizate intr ele.
View as RSS news feed in XML
Powered by Community Server (Commercial Edition), by Telligent Systems