|
select care merge f greu cu parametru - sql server 2005
Last post 05-08-2009, 1:15 PM by Alex. 12 replies.
-
05-06-2009, 5:50 PM |
-
Alex
-
-
-
Joined on 10-25-2006
-
Bucuresti
-
sysadmin
-
-
|
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 |
|
Re: select care merge f greu cu parametru - sql server 2005
Ce tip de data are Bdata?
|
|
-
-
05-06-2009, 11:32 PM |
-
B_gd_n[ ]Sahlean
-
-
-
Joined on 07-17-2007
-
Bucuresti
-
sysadmin
-
-
|
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 |
-
rremus
-
-
-
Joined on 11-16-2006
-
-
sysadmin
-
-
|
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 |
-
Alex
-
-
-
Joined on 10-25-2006
-
Bucuresti
-
sysadmin
-
-
|
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 |
|
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 |
-
Alex
-
-
-
Joined on 10-25-2006
-
Bucuresti
-
sysadmin
-
-
|
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 |
-
Alex
-
-
-
Joined on 10-25-2006
-
Bucuresti
-
sysadmin
-
-
|
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 |
|
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 |
-
Alex
-
-
-
Joined on 10-25-2006
-
Bucuresti
-
sysadmin
-
-
|
Re: select care merge f greu cu parametru - sql server 2005
si cu procedura la fel :(
|
|
-
05-07-2009, 2:48 PM |
-
B_gd_n[ ]Sahlean
-
-
-
Joined on 07-17-2007
-
Bucuresti
-
sysadmin
-
-
|
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 |
-
Alex
-
-
-
Joined on 10-25-2006
-
Bucuresti
-
sysadmin
-
-
|
Re: select care merge f greu cu parametru - sql server 2005
am mutat procedura pe serverul linked si merge mai bine.....multumesc
alex.
|
|
|
|
|