Welcome to Sign in | Help
in Search

Slow query

Last post 11-17-2008, 11:19 AM by ssandu. 9 replies.
Sort Posts: Previous Next
  •  11-14-2008, 10:34 AM 6155

    Slow query

    Salut
    Am urmatoarea SP
    CREATE PROCEDURE [dbo].[inventar]
     @comp int, @gestiune varchar(30), @data DATETIME
    WITH RECOMPILE
    AS
    WITH Preturi (cod, pret) AS
    (
        SELECT cod, pret 
        FROM stocuri AS c1
        WHERE pk_key =
        (select max(pk_key) as pk_key from cont as c2
            where c2.cod = c1.cod AND c2.data <= @data) AND c1.compart = @comp
    )
    SELECT c1.cod AS Codul,
        c1.cont AS Contul, c1.um AS UM, c1.sold AS Sold,
        SUBSTRING(c1.cod,3,4) AS grupa, Preturi.pret, ROUND(Preturi.pret * c1.sold, 2) AS valoare
            FROM depozit c1
        INNER JOIN Preturi ON c1.cod = Preturi.cod
            WHERE (c1.sold <> 0) AND (c1.compart = @comp)
        and (c1.gestiune = @gestiune) AND (c1.pk_key =
            (SELECT MAX(pk_key) AS pk_key
            FROM depozit c2
            WHERE (c2.cod = c1.cod) AND c2.data <= @data AND c2.gestiune = c1.gestiune))
            ORDER BY c1.cod, c1.cont

    Indexes
    Pe stocuri
    pk_key Clustered
    compart
    data (incl pk_key, cod)

    Pe depozit
    pk_key Clustered
    cod
    cod,gestiune,data
    depozit,cod,pk_key (incl cont, um, sold) -> recomandat de SQL Server

    Pe langa acesti indecsi mai exista si altii dar nu cred ca au relevanta in acest caz (sau are!?).
    Problema e ca ruleaza cam greu ptr. unele compartimente si gestiuni (cele cu foarte multe repere cam 1:30 min)  si da timeout la incarcarea unui DataSet (nu as vrea sa modific Timeout la conexiune ptr ca nu rezolva problema).
    Credeti ca se mai poate umbla la aceasta procedura ?
    Va multumesc.


    Sorin Sandu
  •  11-14-2008, 11:27 AM 6157 in reply to 6155

    Re: Slow query

    Încearcă să publici planul de execuţie grafic (nu în format text).
    Încearcă să scapi de subinterogările
    = (select max(pk_key) as pk_key from cont as c2  where c2.cod = c1.cod AND c2.data <= @data)
    c1.pk_key = (SELECT MAX(pk_key) AS pk_key FROM depozit c2 WHERE (c2.cod = c1.cod) AND c2.data <= @data AND c2.gestiune = c1.gestiune))

  •  11-14-2008, 12:56 PM 6158 in reply to 6157

    Re: Slow query

    Subinterogarile returneaza ultima inregistrare din tabel de aceea am nevoie de ele.
    Exista alt mod de a face asta ?

    Sorin Sandu
  •  11-14-2008, 4:55 PM 6171 in reply to 6158

    Re: Slow query

    ssandu:
    Subinterogarile returneaza ultima inregistrare din tabel de aceea am nevoie de ele.
    Exista alt mod de a face asta ?

    Un join cu RANK( ... over pk desc) = 1 in conditia de join.

    Dar faptul ca query-ul tau interogheaza MAX(primary key) este o indicatie clara ca sau query-ul este eronat sau data modelul este complet aiurea.

    http://rusanu.com
  •  11-17-2008, 9:49 AM 6174 in reply to 6171

    Re: Slow query

    Rulat ca simplu select (nu ca procedura stocata dureaza 2 sec.) !!!!

    Sorin Sandu
  •  11-17-2008, 9:59 AM 6175 in reply to 6174

    Re: Slow query

    ssandu:
    Rulat ca simplu select (nu ca procedura stocata dureaza 2 sec.) !!!!

    ??? Pe aceeasi BD ?

    Ignat Andrei
    http://serviciipeweb.ro/iafblog
  •  11-17-2008, 10:18 AM 6176 in reply to 6175

    Re: Slow query

    Exact
    Incerc sa-mi explic fenomenul.
    Oricum chiar daca scot SP si pun selectul incarcarea unui Dataset (sau DataReader) dureaza la fel de mult.
    Aici e problema !

    Sorin Sandu
  •  11-17-2008, 10:37 AM 6177 in reply to 6176

    Re: Slow query

    Dacă execuţia procedurii stocate are o durată mult mai mare decât cea a scriptului atunci încearcă:
    DBCC DROPCLEANBUFFERS
    DBCC FREEPROCCACHE
    GO


    ... deşi pare a fi puţin probabil ("... Oricum chiar daca scot SP si pun selectul incarcarea unui Dataset (sau DataReader) dureaza la fel de mult")



  •  11-17-2008, 11:13 AM 6178 in reply to 6155

    Re: Slow query

    Inainte sa intru mai adanc in detalii 2 lucruri nu le inteleg aici:

    Cum poate ca in primul select cheia primara din tabela stocuri sa fie aceeasi ca din tabela cont. Oricum ar fi relatia a doua parte c1.compart = @comp nu isi are rostul pentru ca deja faci pk = ceva, si asta iti da doar o inregistrare: poate conditia trebuie pusa in subquery sau poate pk_key nu e de fapt cheie primara sau poate nu am inteles nimic inca :).

    Aceeasi problem cu conditia (c1.compart = @comp) e si pentru al doilea select, doar ca aici e aceeasi tabela.

    Fara nici o legatura cu performanta, primul lucru care l-as schimba ar fi aliasurile, din c1 si c2 in niste nume sugestive pentru tabelele care le reprezinta. Cred ca vezi si tu ca e greu de urmarit asa. Ar mai fi si niste chestii foarte mici de performanta, dar mai intai lamureste-ma cu astea.

    Mersi.

     

  •  11-17-2008, 11:19 AM 6179 in reply to 6178

    Re: Slow query

    Cred ca am rezolvat problema.
    Cand am transformat in select @comp l-am facut char(2) nu int cum era in procedura.
    Modificand parametrul procedurii in char(2) merge la 1 sec.
    Multumesc ptr. sugestii.

    Sorin Sandu
View as RSS news feed in XML
Powered by Community Server (Commercial Edition), by Telligent Systems