/ Forside / Teknologi / Udvikling / SQL / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
SQL
#NavnPoint
pmbruun 1704
niller 962
fehaar 730
Interkril.. 701
ellebye 510
pawel 510
rpje 405
pete 350
gibson 320
10  smorch 260
Skulle det ikke være meget hurtigere at br~
Fra : OZ


Dato : 05-02-02 12:44

Hej NG

Når jeg sidder og tester i Query analyzer, syntes jeg ofte at et direkte SQL
kald er hurtigere end via en SP!!
Jeg har ellers fået indtryk af at det var hurtigst og bedst at bruge SP, men
hastigheden syntes jeg ikke altid lever op til det...

Et eksempel:

Simpel select kald:
SELECT " FROM NEWS WHERE CATEGORY = 1 ORDER BY NEWSDATE tager ca. 0,00865
retunerer 2000 poster

SP kald:
exec category_select @category=1 tager 0,260 og retunerer det samme antal
poster

Hmmmmm, mig ikke forstå er der nogen der kan forklare mig hvorfor???


Med venlig hilsen

Oz

____________________________________________
Udvikler på MS SQL 7 på en windows 2000 pro maskine



 
 
Thomas Purkaer (07-02-2002)
Kommentar
Fra : Thomas Purkaer


Dato : 07-02-02 17:46

"OZ" <gonzo@strike-team.com> skrev i en meddelelse
news:a3ogce$ka7$1@sunsite.dk...

> Simpel select kald:
> SELECT " FROM NEWS WHERE CATEGORY = 1 ORDER BY NEWSDATE tager ca. 0,00865
> retunerer 2000 poster
>
> SP kald:
> exec category_select @category=1 tager 0,260 og retunerer det samme antal
> poster

Kunne det være at de SP kald var sat til at lave outputtet i grids? det
sløver en del er min erfaring i hvert fald.

Jeg har kodet et avanceret stykke SQL fra ASP script om til en SP hvilket
nedsatte tiden med cirka 10 min.

/Thomas



OZ (08-02-2002)
Kommentar
Fra : OZ


Dato : 08-02-02 09:52


"Thomas Purkaer" <thomas@mobilli.dk> skrev:


> Kunne det være at de SP kald var sat til at lave outputtet i grids? det
> sløver en del er min erfaring i hvert fald.

Ja det har jeg gjort, men det sløver ikke i hvertfald ikke på min server...


> Jeg har kodet et avanceret stykke SQL fra ASP script om til en SP hvilket
> nedsatte tiden med cirka 10 min.

Det er nok her hunden er begravet at SP sikkert er bedst til tunge SQL
opgaver, hvor en simpel select jo ikke er så svær....

Men tk for inputtet..

oz









Barnabas (07-02-2002)
Kommentar
Fra : Barnabas


Dato : 07-02-02 18:20

Nej det er egentlig ikke så underligt. Hvis du bare skal selecte (hente
data) er en sp rent overhead.

Forestil dig i stedet du skal ændre noget i en batch kørsel, hvor du har en
cursor og skal løbe n antal rækker igennem, lave nogle ændringer (ud over
det der kan lade sig gøre i alm sql) og gemme dem igen.

Hvis du gjorde det uden sp, skulle du have alle data fra db til din app og
tilbage i db igen. Med en sp kunne du så bare sende eks. et keyrange med ind
og lade databasen tygge på opdateringen.



OZ (08-02-2002)
Kommentar
Fra : OZ


Dato : 08-02-02 09:53


"Barnabas" <barnabasdk@yahoo.com> skrev:

> Nej det er egentlig ikke så underligt. Hvis du bare skal selecte (hente
> data) er en sp rent overhead.

Dvs. du mener altså at det ikke kan betale sig at anvende simple Selects i
en SP men du ville så hellere kalde dem direkte eller hvordan skal jeg
forstå dig her?

> Forestil dig i stedet du skal ændre noget i en batch kørsel, hvor du har
en
> cursor og skal løbe n antal rækker igennem, lave nogle ændringer (ud over
> det der kan lade sig gøre i alm sql) og gemme dem igen.
>
> Hvis du gjorde det uden sp, skulle du have alle data fra db til din app og
> tilbage i db igen. Med en sp kunne du så bare sende eks. et keyrange med
ind
> og lade databasen tygge på opdateringen.

Jeg ser din pointe, men vil det sige at det ikke er klogt at anvende simple
selects via en SP eller giver det stabilitet?

Oz





Kristian Damm Jensen (08-02-2002)
Kommentar
Fra : Kristian Damm Jensen


Dato : 08-02-02 13:07

Barnabas wrote:
>
> Nej det er egentlig ikke så underligt. Hvis du bare skal selecte (hente
> data) er en sp rent overhead.

Ikke korrekt. Enhver DB-forespørgsel kræver at der dannes en query-plan.
Når forespørgslen ligger i en SP, dannes denne query-plan første gang
SPen køres, og lagres derefter sammen med SPen, med det resultat at du
sparer tid til dannelsen af en query-plan ved senere udførelser.

<snip>

--
Kristian Damm Jensen | Feed the hungry at www.thehungersite.com
kristian-damm.jensen@cgey.dk | Two wrongs doesn't make a right,
ICQ# 146728724 | but three lefts do.


OZ (08-02-2002)
Kommentar
Fra : OZ


Dato : 08-02-02 18:40


"Kristian Damm Jensen" <kristian-damm.jensenRE@MOVEcgey.com> skrev:

> Ikke korrekt. Enhver DB-forespørgsel kræver at der dannes en query-plan.
> Når forespørgslen ligger i en SP, dannes denne query-plan første gang
> SPen køres, og lagres derefter sammen med SPen, med det resultat at du
> sparer tid til dannelsen af en query-plan ved senere udførelser.

Det er jo derfor jeg er forvirret, jeg syntes også det burde være
hurtigere..... Men-
Hvordan forklarer du så, at det går langsommere at bruge en SP der
indeholder en simpel select VS et direkte simpel select kald??

Jeg er bare nysgerrig..


Oz



Kristian Damm Jensen (13-02-2002)
Kommentar
Fra : Kristian Damm Jensen


Dato : 13-02-02 07:47



OZ wrote:
>
> "Kristian Damm Jensen" <kristian-damm.jensenRE@MOVEcgey.com> skrev:
>
> > Ikke korrekt. Enhver DB-forespørgsel kræver at der dannes en query-plan.
> > Når forespørgslen ligger i en SP, dannes denne query-plan første gang
> > SPen køres, og lagres derefter sammen med SPen, med det resultat at du
> > sparer tid til dannelsen af en query-plan ved senere udførelser.
>
> Det er jo derfor jeg er forvirret, jeg syntes også det burde være
> hurtigere..... Men-
> Hvordan forklarer du så, at det går langsommere at bruge en SP der
> indeholder en simpel select VS et direkte simpel select kald??
>
> Jeg er bare nysgerrig..

Også mig.

Det var sådan set derfor jeg ikke svarede på den oprindelige
forespørgsel - jeg kunne ikke komme med nogen god forklaring.

Men det ses af og til, at der bliver lavet en dårlige query-plan, når
den skal laves generisk (...where felt = @vaerdi) frem for specifik (...
where felt = 5). Uden en nærmere analyse, er det svært at sige hvorfor.

En forklaring kan være at query-planen bliver lavet på baggrund af de
data, der er til rådighed på det tidspunkt. Jeg taler her om såvel
parametre til proceduren som statistics i basen.

Hvis disse ligger på en måde, så det fx ikke kan betale sig at bruge
index, vil alle efterfølgende kørsler af den samme procedure heller ikke
bruge index. I så tilfælde skal man (1) køre en update statistics på de
relevante tabeller (2) køre en sp_recompile på SPen (eller er det
overflødigt efter (1)? Det kan jeg ikke huske.) (3) sørge for at vælge
en værdi til den første kørsel, der sikrer sig at index kan betale sig
(og ikke en værdi, der dækker over 20-50% af rækkerne i tabellen).

Men der kan være mange andre grunde, og det vil som sagt kræve en
nærmere analyse, at sige, hvad der er galt i dit tilfælde.

--
Kristian Damm Jensen | Feed the hungry at www.thehungersite.com
kristian-damm.jensen@cgey.dk | Two wrongs doesn't make a right,
ICQ# 146728724 | but three lefts do.



OZ (13-02-2002)
Kommentar
Fra : OZ


Dato : 13-02-02 17:05


"Kristian Damm Jensen" <kristian-damm.jensenRE@MOVEcgey.com> skrev:


> Også mig.
>
> Det var sådan set derfor jeg ikke svarede på den oprindelige
> forespørgsel - jeg kunne ikke komme med nogen god forklaring.
>
> Men det ses af og til, at der bliver lavet en dårlige query-plan, når
> den skal laves generisk (...where felt = @vaerdi) frem for specifik (...
> where felt = 5). Uden en nærmere analyse, er det svært at sige hvorfor.
>
> En forklaring kan være at query-planen bliver lavet på baggrund af de
> data, der er til rådighed på det tidspunkt. Jeg taler her om såvel
> parametre til proceduren som statistics i basen.
>
> Hvis disse ligger på en måde, så det fx ikke kan betale sig at bruge
> index, vil alle efterfølgende kørsler af den samme procedure heller ikke
> bruge index. I så tilfælde skal man (1) køre en update statistics på de
> relevante tabeller (2) køre en sp_recompile på SPen (eller er det
> overflødigt efter (1)? Det kan jeg ikke huske.) (3) sørge for at vælge
> en værdi til den første kørsel, der sikrer sig at index kan betale sig
> (og ikke en værdi, der dækker over 20-50% af rækkerne i tabellen).
>
> Men der kan være mange andre grunde, og det vil som sagt kræve en
> nærmere analyse, at sige, hvad der er galt i dit tilfælde.


Tak for dit fine svar, det giver mening for mig..

oz



Barnabas (14-02-2002)
Kommentar
Fra : Barnabas


Dato : 14-02-02 00:22

> Ikke korrekt. Enhver DB-forespørgsel kræver at der dannes en query-plan.
> Når forespørgslen ligger i en SP, dannes denne query-plan første gang
> SPen køres, og lagres derefter sammen med SPen, med det resultat at du
> sparer tid til dannelsen af en query-plan ved senere udførelser.

Rigtigt nok, men ordentlige databaser implementerer en sql cache, der netop
forhindrer dette. Desuden kan du speede denne process op på oracle ved at
give nogle ordentlige optimizer hints til dit query.

Hvis det eneste der ændrer sig er parametrene skal en prepared statement
gerne undgå ovennævnte.

Desuden er der helt andre problemer med sp's, de er normalt ikke ret
flytbare mellem databaser og forskellige systemer. Så brug dem hvor det ikke
kan undgås, ellers lad være.



Peter Lykkegaard (14-02-2002)
Kommentar
Fra : Peter Lykkegaard


Dato : 14-02-02 08:42


"Barnabas" <deletebarnabasdk@yahoo.com> wrote in message
news:3c6af439$0$18436$ba624c82@nntp02.dk.telia.net...

> Desuden er der helt andre problemer med sp's, de er normalt ikke ret
> flytbare mellem databaser og forskellige systemer. Så brug dem hvor det
ikke
> kan undgås, ellers lad være.
>
Det er korrekt at sp's ikke kan flyttes mellem forskellige rdbms, men det er
vel ikke til hinder for at implementere vha sp's
I min verden vil din betragtning være af rent akademisk interesse

Implementerer man mere generelle løsninger hvor man ikke kender
slutbrugerens platform, så stiller sagen sig naturligvis anderledes

mvh/Peter Lykkegaard



Kristian Damm Jensen (14-02-2002)
Kommentar
Fra : Kristian Damm Jensen


Dato : 14-02-02 12:12



Barnabas wrote:
>
> > Ikke korrekt. Enhver DB-forespørgsel kræver at der dannes en query-plan.
> > Når forespørgslen ligger i en SP, dannes denne query-plan første gang
> > SPen køres, og lagres derefter sammen med SPen, med det resultat at du
> > sparer tid til dannelsen af en query-plan ved senere udførelser.
>
> Rigtigt nok, men ordentlige databaser implementerer en sql cache, der netop
> forhindrer dette.

Forhindrer hvad? At der dannes en query-plan? Eller at den bliver gemt?
Eller?

> Desuden kan du speede denne process op på oracle ved at
> give nogle ordentlige optimizer hints til dit query.
>
> Hvis det eneste der ændrer sig er parametrene skal en prepared statement
> gerne undgå ovennævnte.
>
> Desuden er der helt andre problemer med sp's, de er normalt ikke ret
> flytbare mellem databaser og forskellige systemer.

Men en query fyldt med optimize-hints er?

> Så brug dem hvor det ikke kan undgås, ellers lad være.

Det er naturligvis et spørgsmål om, hvilket miljø man arbejder i, og
hvor stor sandsynligheden er for at man får behov for at portere sit
produkt.

Det er korrekt at SPer skrives i et sprog, der er proprietært for den
enkelte database, hvilket begrænser deres anvendelighed. Men sprogene
ligner faktisk hinanden en del, og en flytning vil være overkommelig i
mange tilfælde.



--
Kristian Damm Jensen | Feed the hungry at www.thehungersite.com
kristian-damm.jensen@cgey.dk | Two wrongs doesn't make a right,
ICQ# 146728724 | but three lefts do.


Søg
Reklame
Statistik
Spørgsmål : 177552
Tips : 31968
Nyheder : 719565
Indlæg : 6408849
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste