Welcome to Sign in | Help
in Search

select care merge f greu cu parametru - sql server 2005

Last post 05-08-2009, 1:15 PM by Alex. 12 replies.
Sort Posts: Previous Next
  •  05-06-2009, 5:50 PM 7097

    select care merge f greu cu parametru - sql server 2005

    Salut,

    am si eu o nelamurire

    de ce selectul urmator merge f bine cateva secunde

    select ClientId, Dept, (-1)*sum(Soldl) as Sold 
    from table where Bdata = '20090331' and left(AccSint,4) in ('2021','2031','2042','2052','2061','2091','2312','2811','2821') 
    group by ClientId, Dept

    iar daca am

    declare @data varchar(8)

    set @data = '20090331'

    select ClientId, Dept, (-1)*sum(Soldl) as Sold 
    from table where Bdata = @data
    and left(AccSint,4) in ('2021','2031','2042','2052','2061','2091','2312','2811','2821') 
    group by ClientId, Dept

    merge f greu...zeci de minute

    multumesc

    alex.

  •  05-06-2009, 6:14 PM 7098 in reply to 7097

    Re: select care merge f greu cu parametru - sql server 2005

    Ce tip de data are Bdata?
  •  05-06-2009, 7:11 PM 7099 in reply to 7097

    Re: select care merge f greu cu parametru - sql server 2005

    Vezi: http://www.sqlmag.com/Article/ArticleID/94369/sql_server_94369.html

    (si alte multe articole despre "parameter sniffing")

    Razvan

  •  05-06-2009, 11:32 PM 7101 in reply to 7099

    Re: select care merge f greu cu parametru - sql server 2005

    În ceea ce priveşte OPTIMIZE FOR sintaxa din SQL 2005 este
      | OPTIMIZE FOR ( @variable_name = literal_constant [ , ...n ] ) 
    cu alte cuvinte, se pot specifica mai multe valori "semnificative".

    În SQL 2008 în sintaxa a fost introdusă şi opţiunea OPTIMIZE FOR UNKNOWN:
      | OPTIMIZE FOR ( @variable_name { UNKNOWN | = literal_constant } [ , ...n ] )


  •  05-07-2009, 6:57 AM 7102 in reply to 7097

    Re: select care merge f greu cu parametru - sql server 2005

    Acuma nu stiu exact cum arata tabelele tale, dar daca ar fi sa ghicesc as zice ca e pentru ca declari parametrul ca varchar(8). Query-ul tau este echivalent cu:

    select ClientId, Dept, (-1)*sum(Soldl) as Sold 
    from table where cast(Bdata as varchar(8)) = @data
    and left(AccSint,4) in ('2021','2031','2042','2052','2061','2091','2312','2811','2821') 
    group by ClientId, Dept

    si va genera un plan care scaneaza tabela si converteste fiecare BData. Priml plan folosete un seek, al doilea un scan, de unde diferenta. Pentru a fixa problema declare @data ca datetime.

    http://rusanu.com
  •  05-07-2009, 8:39 AM 7103 in reply to 7102

    Re: select care merge f greu cu parametru - sql server 2005

    Bdata in tabela este varchar(8) si nu o pot modifica

    am testat si cu

    declare @data varchar(8)

    set @data = '20090331'

    si cu

     declare @data datetime

    set @data = '20090331'

    si cu

    select ClientId, Dept, (-1)*sum(Soldl) as Sold 
    from table where cast(Bdata as varchar(8)) = @data
    and left(AccSint,4) in ('2021','2031','2042','2052','2061','2091','2312','2811','2821') 
    group by ClientId, Dept

    si la fel de prost merge

  •  05-07-2009, 8:56 AM 7104 in reply to 7103

    Re: select care merge f greu cu parametru - sql server 2005

    incearca si varianta

    declare @data char(8)

    sau pune-i o conditie suplimentara de genul length(bdata)=8

    Si ca sa fie testul complet, cum se modifica timpii de executie daca scoti din query partea cu left(accsint,4) ?



  •  05-07-2009, 9:16 AM 7105 in reply to 7104

    Re: select care merge f greu cu parametru - sql server 2005

    si cu char(8) tot greu si cu len(Bdata) = 8 la fel

    si daca scot partea cu left(accsint,4) tot greu merge...am stat 10 min si nu am mai avut rabdate sa astept....

    daca scot parametrul adica Bdata = '20090331' si nu Bdata = @data dureaza 4 secunde

  •  05-07-2009, 9:33 AM 7106 in reply to 7105

    Re: select care merge f greu cu parametru - sql server 2005

    un lucru f important pe care am uitat sa-l precizez si-mi cer scuze este ca

    tabela este catre un linked server

    daca rulez scriptul direct pe server>>databaseul unde se afla tabela merge f bine adica

    declare @Data varchar(8)

    set @Data = '20090331'

    select ClientId, Dept, (-1) * sum(Soldl) as Sold

    from tabela

    where Bdata = @Data

    and left(AccSint,4) in ('2021','2031','2042','2052','2061','2091','2312','2811','2821')

    group by ClientId, Dept

     

    daca rulez scriptul prin linked server atunci merge f greu (dar daca inlocuiesc @data cu '20090331' merge ok)

    declare @Data varchar(8)

    set @Data = '20090331'

    select ClientId, Dept, (-1) * sum(Soldl) as Sold

    from server.db.dbo.tabela

    where Bdata = @Data

    and left(AccSint,4) in ('2021','2031','2042','2052','2061','2091','2312','2811','2821')

    group by ClientId, Dept

    multumesc.

  •  05-07-2009, 11:07 AM 7108 in reply to 7106

    Re: select care merge f greu cu parametru - sql server 2005

    Incearca si cu o procedura stocata avand ca parametru data respectiva, macar asa de amorul artei.

    http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=119740
  •  05-07-2009, 12:14 PM 7110 in reply to 7108

    Re: select care merge f greu cu parametru - sql server 2005

    si cu procedura la fel :(
  •  05-07-2009, 2:48 PM 7112 in reply to 7110

    Re: select care merge f greu cu parametru - sql server 2005

    Alex:
    si cu procedura la fel :(

    Ai folosit OPTIMIZE FOR ... ?
    Unde ai definit procedura stocata ?
    [1] În baza de date de pe server-ul linked sau [2] in baza de date unde apelezi server.dbo.tabela ?
    Daca ai implementat procedura conform [2] atunci implementează procedura conform [1].
    Dacă nici aşa atunci foloseşte o variabilă locală în locul parametrului astfel (recomandarea nu-mi aparţine):


    CREATE PROCEDURE proceduraPesteluiPeLinked
    declare @p_data varchar(8)
    AS

    DECLARE @data VARCHAR(8)
    SET @data = @p_data

    select ClientId, Dept, (-1)*sum(Soldl) as Sold
    from table where Bdata = @data
    and left(AccSint,4) in ('2021','2031','2042','2052','2061','2091','2312','2811','2821')
    group by ClientId, Dept



  •  05-08-2009, 1:15 PM 7130 in reply to 7112

    Re: select care merge f greu cu parametru - sql server 2005

    am mutat procedura pe serverul linked si merge mai bine.....multumesc

    alex.

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