Optimere stored procedure kald?

Tags:    mssql stored-procedure

Jeg har et view i en ms-sql database hvor to af kolonnerne bliver beregnet ved stored procedure kald. Problemet er, at det tager uhyggelig lang tid:

Mit sql-script:

Fold kodeboks ind/udSQL kode 


Og den ene - HISTORICAL_BALANCE_HOURS - af de to stored procedures herunder (de er magen til hinanden, men summerer på to forskellige felter). Den laver en sum over x antal rows og returnerer resultatet.


Fold kodeboks ind/udSQL kode 


Problemet er, at den skal kalde de to stored procedures for mere end 120.000 rows og det tager LANG tid - så lang tid, at jeg får en time-out i mit C# program.

Kan ovenstående optimeres på en eller anden måde og kan man give mere "power" til disse stored procedure kald? Jeg har forsøgt alt fra regenerering af indexes og hvad jeg ellers har kunnet google.

(spørgsmålet er også på en anden hjemmeside - så får jeg svar der, skrives det selvfølgelig ind her i tråden)



6 svar postet i denne tråd vises herunder
3 indlæg har modtaget i alt 12 karma
Sorter efter stemmer Sorter efter dato
Fold kodeboks ind/udSQL kode 


Hvorfor vil du beregne de to kolonner i funktioner?



Stored procedures er også meget anvendt i SQL-Server, men i dit eksempel bruger du funktioner og ikke stored procedures. ;)

Hvis du har brug for flere kolonner fra din tabel joiner du bare på den igen.

Fold kodeboks ind/udSQL kode 




Er det dette du prøver at gøre?

Fold kodeboks ind/udSQL kode 




Fold kodeboks ind/udSQL kode 


Hvorfor vil du beregne de to kolonner i funktioner?


Det er konverteret fra en Oracle database, og der er stored procedures meget anvendt (det er det i hvertfald i denne database :-) ) og jeg kan godt se pointen i dit eksempel, men jeg kan ikke umiddelbart gruppere på transaction_id, da jeg har mange andre kolonner med i min select som jeg ikke tog med i mit eksempel for overskuelighedens skyld. Jeg tror at flere rækker vil gå tabt - måske. Men jeg vil arbejde lidt videre med dit eksempel, så tak for det.



Stored procedures er også meget anvendt i SQL-Server, men i dit eksempel bruger du funktioner og ikke stored procedures. ;)

Hvis du har brug for flere kolonner fra din tabel joiner du bare på den igen.

Fold kodeboks ind/udSQL kode 


Kigger jeg i management studio ligger de nu under stored procedures og ikke functions - men hvad ved jeg :-)

Hvis dit eksempel skal bygges ind i dette sql-script, kan det så lade sig gøre?

Fold kodeboks ind/udSQL kode 


Jeg har selvfølige forsøgt, men det fejler på din sidste linje "ON h.transaction...." med at h.transaction_id ikke findes. Og den findes fint nok i historical_balance


*edit*

Nu fik jeg brygget dette sammen:

Fold kodeboks ind/udSQL kode 


Men den returnerer samme værdi for alle rækker i hg.hours og hg.days :-( og den kører lige så lang tid som mit oprindelige script.



Indlæg senest redigeret d. 07.09.2012 20:24 af Bruger #9814
Det er sgu fedt - nu tæller den rigtigt og det er hurtigt. Men for at få alle de rigtige transaktioner med skal jeg lige have de to andre betingelser med:

dbo.APP_USER AS a INNER JOIN
dbo.WAGE_PERIOD AS wp ON wp.ID = ht.WAGE_PERIOD_ID ON a.ID = ht.APP_USER_ID

Men jeg kan ikke gennemskue deres placering i scriptet... Jeg skal vist have læst op på ON begrebet, da jeg ikke helt forstår det.

MEN TUSIND TAK! Du har været en stor hjælp.





t