Welcome to Sign in | Help
in Search

Select ultimele valori

Last post 04-16-2008, 4:06 PM by ssandu. 10 replies.
Sort Posts: Previous Next
  •  04-16-2008, 12:47 PM 4654

    Select ultimele valori

    Salut
    Am o tabela pk_key(int), cod(char),sold(numeric), data(smalldatetime) din care sa extrag ultimele inregistrari la o anumita data la care soldul sa fie diferit de 0.
    Selectul pe care il am acum este
    SELECT cod, sold, SUBSTRING(cod,3,4) as grupa FROM tabel t1
    WHERE sold <> 0 and SUBSTRING(cod,1,2) = @comp and pk_key =
    (SELECT MAX(pk_key) as pk_key FROM tabel t2 WHERE t1.cod = t2.cod AND t2.data <= data)
    ORDER by cod
    Problema este ca la un numar mare de inregistrari returnate selectul dureaza cam 16 secunde.
    Pot face ceva sa mearga mai repede ?
    Am indecsi pe cod, data, cod+data, pk_key(clustered).
    Multumesc.
    Sorin Sandu
  •  04-16-2008, 1:00 PM 4655 in reply to 4654

    Re: Select ultimele valori

    1. Despre ce numar de inregistrari vorbim , pentru cele 16 secunde?
    2. indecsi sunt si pe t1 si pe t2 ?
    3.  Vad ca folosesti destul de des parti din cod (SUBSTRING(cod,1,2) , SUBSTRING(cod,3,4) )
    Daca ai posibilitatea, denormalizeaz-o pe cele 2 valori ...sau pune alte 2 cimpuri


    Ignat Andrei
    http://serviciipeweb.ro/iafblog
  •  04-16-2008, 1:01 PM 4656 in reply to 4654

    Re: Select ultimele valori

    Ce indecsi exista pe tabel? Sunt ei "de folos" in cazul tau? Incearca sa rulezi scriptul in QA cu "include actual execution plan".

    Vezi si BOL SQL 2005 ---> Analyzing a Query

  •  04-16-2008, 1:25 PM 4657 in reply to 4656

    Re: Select ultimele valori

    Sunt aproximativ 300000 de inregistrari.
    Indecsi sunt pe tabel (este vorba de un singur tabel) : cod, data, cod+data, pk_key (primar. clustered)
    Numai daca nu gasesc o alta solutie o sa mai fac 2 campuri.
    In execution plan am un Index Scan de 74% pe  indexul primar (pk_key)  pentru expresia  SUBSTRING(cod,1,2)=@comp si un Index Seek pe indexul de data.

    Sorin Sandu
  •  04-16-2008, 2:19 PM 4658 in reply to 4657

    Re: Select ultimele valori

    ssandu:

    In execution plan am un Index Scan de 74% pe  indexul primar (pk_key)  pentru expresia  SUBSTRING(cod,1,2)=@comp si un Index Seek pe indexul de data.

    Ai putea, deci , sa optimizezi index scan ... sa il transformi intr-un seek.
    Alta idee : daca transformi
    SELECT MAX(pk_key) as pk_key FROM tabel t2 WHERE t1.cod = t2.cod AND t2.data <= data
    intr-un view de genul
    select cod, MAX(pk_key) from tabel group by cod
    si faci inner join cu select-ul initial  -ar merge mai repede?



    Ignat Andrei
    http://serviciipeweb.ro/iafblog
  •  04-16-2008, 2:44 PM 4659 in reply to 4658

    Re: Select ultimele valori

    ignatandrei:

    Ai putea, deci , sa optimizezi index scan ... sa il transformi intr-un seek.

    Poti sa-mi explici cum sa fac asta ?

    Sorin Sandu
  •  04-16-2008, 2:54 PM 4660 in reply to 4657

    Re: Select ultimele valori

    Incearca si sa inlocuiesti subquery-ul cu un JOIN.

  •  04-16-2008, 3:22 PM 4661 in reply to 4660

    Re: Select ultimele valori

    Am reusit pana la urma sa reduc la 3 sec
    with tmp(pk_key, cod)
    As
    (
        select max(pk_key) as pk_key cod from tabel where data <= @data group by cod
    )
    select pk_key, cod, sold, substring(cod,3,4) as grupa
    from tabel t1 join tmp on t1.pk_key = tmp.pk_key
    where t1.sold <> 0 and substring(t1.cod,1,2) = @comp
    order by cod

    Sorin Sandu
  •  04-16-2008, 3:46 PM 4662 in reply to 4661

    Re: Select ultimele valori

    ssandu:
    substring(t1.cod,1,2) = @comp
    inlocuit cu LIKE @comp reduce timpul sub o secunda.

    Sorin Sandu
  •  04-16-2008, 3:54 PM 4663 in reply to 4662

    Re: Select ultimele valori

    Pentru un "exact match" este OK un "=". Daca vrei sa cauti cu LIKE, obtii o buna performanta in acest caz:

    SELECT...WHERE cod LIKE @comp, unde @comp este de forma 'searchterm%' - deci cu "%" la "coada" Smile si coloana "cod" este indexata.

  •  04-16-2008, 4:06 PM 4664 in reply to 4663

    Re: Select ultimele valori

    eu intr-adevar am nevoie de exact match dar avand in vedere ca @comp are intotdeauna 2 caractere nu mai am nevoie de '%'.
    Chestia este ca merge mai repede cu LIKE (acum foloseste un Index Seek in loc de Scan).
    Multumesc ptr. raspunsuri.

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