Fetstil Fetstil Kursiv Understrykning linje färgläggning tabellverk Punktlista Nummerlista Vänster Centrerat högerställt Utfyllt Länk Bild htmlmode
  • Forum & Blog
    • Forum - översikt
      • .Net
        • asp.net generellt
        • c#
        • vb.net
        • f#
        • silverlight
        • microsoft surface
        • visual studio .net
      • databaser
        • sql-server
        • databaser
        • access
        • mysql
      • mjukvara klient
        • datorer och komponenter
        • nätverk, lan/wan
        • operativsystem
        • programvaror
        • säkerhet, inställningar
        • windows server
        • allmänt
        • crystal reports
        • exchange/outlook
        • microsoft office
      • mjukvara server
        • active directory
        • biztalk
        • exchange
        • linux
        • sharepoint
        • webbservers
        • sql server
      • appar (win/mobil)
      • programspråk
        • c++
        • delphi
        • java
        • quick basic
        • visual basic
      • scripting
        • asp 3.0
        • flash actionscript
        • html css
        • javascript
        • php
        • regular expresssion
        • xml
      • spel och grafik
        • DirectX
        • Spel och grafik
      • ledning
        • Arkitektur
        • Systemutveckling
        • krav och test
        • projektledning
        • ledningsfrågor
      • vb-sektioner
        • activeX
        • windows api
        • elektronik
        • internet
        • komponenter
        • nätverk
        • operativsystem
      • övriga forum
        • arbete karriär
        • erbjuda uppdrag och tjänster
        • juridiska frågor
        • köp och sälj
        • matematik och fysik
        • intern information
        • skrivklåda
        • webb-operatörer
    • Posta inlägg i forumet
    • Chatta med andra
  • Konto
    • Medlemssida
    • Byta lösenord
    • Bli bonsumedlem
    • iMail
  • Material
    • Tips & tricks
    • Artiklar
    • Programarkiv
  • JOBB
  • Student
    • Studentlicenser
  • KONTAKT
    • Om pellesoft
    • Grundare
    • Kontakta oss
    • Annonsering
    • Partners
    • Felanmälan
  • Logga in

Hem / Forum översikt / inlägg

Posta nytt inlägg


Prestandaproblem i vy : SQL optimering

Postades av 2005-01-25 23:32:39 - Per Hultqvist, i forum sql-server/msde, Tråden har 9 Kommentarer och lästs av 998 personer

Prestandaproblem i SQL-sats

Jag har en ganska komplex vy som jag behöver hjälp med att optimera. Det är framförallt fem kolumner av två olika typer som ställer till det för mig. När jag kommenterar bort dessa fem fält så går det minst tio ggr snabbare.

1) För varje rad i vyn skall måste jag hämta två fält från den SENASTE posten i en loggtabell (som har ett fält TaskID som är kopplat till fältet ID i tabellen Task) :


Log-tabellen
-------------
TaskID
LogDate
LogComment



Taskview
-------------

CREATE VIEW TaskView
AS
SELECT bla,bla,bla,

(SELECT TOP 1 [Log].LogDate
FROM [Log] WHERE [Log].TaskID=Task.[ID]
ORDER BY LogDate DESC) AS LastChangeDate,

(SELECT TOP 1 [Log].LogComment
FROM [Log] WHERE [Log].TaskID=Task.[ID]
ORDER BY LogDate DESC) AS LastChange

FROM Task

Det här är ju inte alls bra och det slöar ner exekveringen ordentlig, det inser jag och det har jag verifierat att så är fallet. Jag vet att det finns bättre sätt att lösa det med joins (eller derived tables eller nåt sådant) men jag kan inte få det att fungera.

2) För varje rad i tabellen Task vill jag dessutom tre gånger hämta antalet poster i andra tabeller som är kopplade till den aktuella raden.

CREATE VIEW TaskView
AS
SELECT bla,bla,bla,

dbo.GetMessageCount(Task.MailBoxID) as MessageCount,
dbo.GetDocumentCount(Task.ID) as DocumentCount ,
dbo.GetConnectionCount(Task.ID) as ConnectionCount

FROM Task

Här har jag alltså gjort tre UDF:er som alla tre är triviala, typ

SELECT Count([ID]) FROM Rel_TaskDocument WHERE TaskID=@TaskID

Jag hade ju kunnat göra även dessa som subqueries men jag inbillade mig att det skulle vara snabbare om de var UDF:er. Har dock inte testat detta. Det slog mig nu när jag skriver detta att jag faktiskt inte behöver veta det exakta antalet, bara en 1:a om det existerar poster och en 0:a om det inte finns några. En omskrivning med EXISTS() skulle ju alltså antagligen hjälpa här. Kanske :

(CASE EXISTS(SELECT [TaskID] FROM Rel_TaskDocument WHERE TaskID=Task.[ID]) THEN 1 ELSE 0 END) AS DocumentCount

eller något liknande? Men är det snabbare?

Jag överväger att ta bort dessa och lägga till tre bit-fält i tabellen och uppdatera dessa i mina SP:s eller med triggers, när någon lägger till ett dokument eller meddelande...känns inte rätt, men prestandan är ett problem nu.

Totalt alltså ca 10 ggr så slött p g a dessa fem kolumner jag vill ha med mig tillbaka. Några tips?


Svara

Sv: Prestandaproblem i vy : SQL optimering

Postades av 2005-01-26 09:11:35 - Christoffer Hedgate

Du bör undvika UDFer och att köra sql-satser en gång för varje rad. Jag hade utgått från något liknande nedanstående SQL-sats, beroende på fullständigt schema och indexering.

<code>
SELECT t.*
, l.LogDate
, l.LogComment
, CASE WHEN rtd.TaskID IS NULL THEN 0 ELSE 1 END AS DocumentExists
FROM Task AS t
INNER JOIN (
SELECT TaskID, MAX(LogDate) AS LogDate
FROM [Log]
GROUP BY TaskID
) AS lmax ON t.[ID] = lmax.TaskID
INNER JOIN [Log] l ON lmax.TaskID = l.TaskID AND lmax.LogDate = l.LogDate
LEFT OUTER JOIN (
SELECT DISTINCT TaskID
FROM Rel_TaskDocument
) AS rtd ON t.[ID] = rtd.TaskID
</code>


Svara

Sv:Prestandaproblem i vy : SQL optimering

Postades av 2005-01-26 13:26:14 - Per Hultqvist

Tack för det svaret. Skall testa detta ikväll när jag kommer hem...Jag återkommer med resultatet...


Svara

Sv: Prestandaproblem i vy : SQL optimering

Postades av 2005-01-26 19:19:42 - Per Hultqvist

Tack för hjälpen än en gång. Läsningen av 3000 poster sjönk från 20 sekunder till 4 sekunder efter att ha lagt in den ena av dina lösningar. Lösningen för LogDate och LogComment tog längre(!) tid än den tidigare plus att den returnerade fel antal rader och det lyckades jag inte fixa till, så jag valde en annan lösning (jag bröt nog mot en normaliseringsregel eller möjligen två :-). Men det var det värt...måste släppa versionen idag :-)


Svara

Sv:Prestandaproblem i vy : SQL optimering

Postades av 2005-01-27 08:40:29 - Christoffer Hedgate

4 sekunder är ju fortfarande ganska mycket. Känns som att det borde gå att se över indexeringen en del för att få bättre svarstid.


Svara

Sv: Prestandaproblem i vy : SQL optimering

Postades av 2005-01-27 13:01:24 - Per Hultqvist

Är det mycket även om det handlar om minst 10 joins, ett par sammansatta fält och 3000 poster? Visserligen är de flesta joinar enkla, det ligger ProjectID,StatusID o s v i tabellen och jag joinar för att få ProjectName, StatusName o s v.

Du säger att jag borde se över indexeringen. Om jag har en typisk ProjectID/ProjectName-join mot Projecttabellen; då får jag väl ett klustrat index automatiskt på ID-kolumnen i Projekt-tabellen eftersom den är primarykey? Ska man utöver det har ett index på Task-tabellen som innehåller ProjectID? Och samma sak för alla andra "foreign keys"? Det blir ju väldigt många index på den tabellen då...

Jag skulle gärna lära mig mer om hur man optimerar t ex genom att analysera execution-plans. Speciellt nu när versionen är släppt och jag i lugn och ro kan ta tag i det. Problemet (förutom tidsaspekten) är att jag inte hittat någon riktigt bra källa...Har du någon bra artikel eller site som tar upp detta?


Svara

Sv:Prestandaproblem i vy : SQL optimering

Postades av 2005-01-27 14:05:25 - Christoffer Hedgate

Återkommer med svar angående index-frågorna, har inte tid just nu.

>Jag skulle gärna lära mig mer om hur man optimerar t ex genom att analysera execution-plans. Speciellt nu när versionen är släppt och jag i lugn och ro kan ta tag i det. Problemet (förutom tidsaspekten) är att jag inte hittat någon riktigt bra källa...Har du någon bra artikel eller site som tar upp detta?

Reklam för min kurs:
http://thinkdo.org/blogs/chris/archive/2005/01/04/158.aspx

Annars finns det tonvis med artiklar som tar upp sådant. Den bästa resursen (i mina ögon) är http://www.sql-server-performance.com/


Svara

Sv: Prestandaproblem i vy : SQL optimering

Postades av 2005-01-27 16:15:12 - Mikael Wedham

Testa att lägga det klustrade indexet på din foreign key istället. Det brukar hjälpa rätt bra.

/micke


Svara

Sv:Prestandaproblem i vy : SQL optimering

Postades av 2005-01-28 08:29:20 - Christoffer Hedgate

För den frågan jag skrev ovan bör du t ex ha ett icke-klustrat index på [Log] (TaskID, LogDate).


Svara

Sv: Prestandaproblem i vy : SQL optimering

Postades av 2005-01-30 00:45:16 - Per Hultqvist

Tack för all hjälp!


Svara

Nyligen

  • 14:24 CBD regelbundet?
  • 14:23 CBD regelbundet?
  • 14:22 Har du märkt några verkliga fördel
  • 09:09 Vill du köpa medicinska tester?
  • 12:47 Vem beviljar assistansen – kommune
  • 14:17 Någon med erfarenhet av hemstädnin
  • 14:14 Bör man använda sig av en båtförme
  • 14:12 Finns det någon intressant hundblo

Sidor

  • Hem
  • Bli bonusmedlem
  • Läs artiklar
  • Chatta med andra
  • Sök och erbjud jobb
  • Kontakta oss
  • Studentlicenser
  • Skriv en artikel

Statistik

Antal besökare:
Antal medlemmar:
Antal inlägg:
Online:
På chatten:
4 569 619
27 953
271 709
569
0

Kontakta oss

Frågor runt konsultation, rådgivning, uppdrag, rekrytering, annonsering och övriga ärenden. Ring: 0730-88 22 24 | pelle@pellesoft.se

© 1986-2013 PelleSoft AB. Last Build 4.1.7169.18070 (2019-08-18 10:02:21) 4.0.30319.42000
  • Om
  • Kontakta
  • Regler
  • Cookies