Welcome to Sign in | Help

Re: Optimizare SQL

  •  04-03-2009, 7:08 PM

    Re: Optimizare SQL

    ovello:
    Am urmatorul SQL:


    select  left(fc.cont,1) as clasa,left(fc.cont,2) as subcls,
        isnull((
       
        SELECT sum(debit-credit) as sold
        FROM A_lstFisaCont
        where cont=fc.cont and
        ((datainr is not null and (fc.datainr>datainr or (fc.datainr=datainr and fc.nds>=nds))) or datainr is null) and
        coduser=1

        ),0) as sold, fc.debit-fc.credit-fc.sid+fc.sic as sSold,fc.debit-fc.sid as sdebit,fc.credit-fc.sic as scredit

    from A_lstFisaCont FC
    where fc.coduser=1
    order by fc.cont,fc.datainr,fc.NDS



    Daca tabela A_lstFisaContcontine 50.000 de inregistrari, SQL-ul returneaza inregistrarile dupa aproximativ 4 minute (sau mai mult, in functie de cat de incarcat mi-e procesorul de la celelalte aplicatii deschise), ceea ce e foarte mult. Am calculator performant, nu asta este important; important este ca trebuie sa fac ca rezultatul generat sa iasa mai repede, fie prin rescrierea SQL-ului, fie prin regandirea algoritmului de calcul al campului Sold (aici e problema). Am incercat sa pun indecsi pe tabela, am folosit inclusiv Index Tuning Wizard, dar fara succes.

    M-am gandit si la ideea de a crea coloana Sold in tabela A_lstFisaCont, sa ordonez inregistrarile asa cum am eu nevoie (Cont, DataInr, NDS) si sa parcurg aceasta tabela cu un cursor facand update pe coloana Sold inregistrare curenta = Sold din inregistrarea de deasupra + debit - credit. Din cate am inteles, insa, cursorul este foarte lent si nu ma ajuta.

    Ce solutii posibile am la problema mea?


    Multumesc anticipat,
    Ovidiu

    var datacontext=new SomedataContext()
    var query=from cont in datacontext.FIsacont
    let sold=(mdatacontext.FisaCont.where(x=>x.cont==cont.cont && Sqlmethods.DateDiff(x.DataInnr,cont.Datanr) ...&& x.coduser==1).sum(x=>x.debit-x.Credit)
    where fc.coduser==1
    order by cont.cont,cont.datainr,cont.NDS
    select new {clasa=cont.cont(subbstring(0,1),subclasa=cont.cont(subbstring(0,2),sold??0,ssold=cont.debit-cont-credit...}

    foreach(var item in query)
    Console.writeln(item)
    Nu emai eleganta soltia asta :))?

    Secolul XXI ori va fi religios ori nu va fi deloc
View Complete Thread
Powered by Community Server (Commercial Edition), by Telligent Systems