2011-02-04 119 views
-1

下面的查詢需要大量的時間,像80分鐘返回1400個結果,任何建議如何調整這個微調TSQL SQL服務器

exec sp_executesql N'set ARITHIGNORE ON; 
SELECT TOP (@solutionid) 
     b.[solutionid],MAX(b.title) title, 
     MIN(a.[Status]) [Status], 
     MIN(a.[Audience]) Audience, 
     MAX(b.productname) ProductName, 
     MIN(CAST(DateCreated as datetime)) DateCreated , 
     MIN(CAST(DateLastModified as datetime)) DateModified, 
     [pc_pres_text]=REPLACE(REPLACE(REPLACE((SELECT [pc_pres_text] as [data()] 
FROM [dbo.view] a 
WHERE a.[solutionid]=b.[solutionid] 
FOR XML PATH('''')), ''&lt;'',''<''),''&gt;'',''>'') ,''&amp;'',''&''), 
     ''http://support/supp=''+b.[solutionid] PrimusUrl 
FROM [view] b 
INNER JOIN [table] a ON b.solutionid=a.solutionid 
WHERE ((@Audience IS NULL AND [Audience] IS NULL) OR [Audience] LIKE @Audience) AND [DateCreated] > @DateCreated AND 
     ((@Status IS NULL AND [Status] IS NULL) OR [Status] = @Status) 
GROUP BY b.[solutionid] 
ORDER BY b.[solutionid]',N'@Audience nvarchar(10),@DateCreated datetime,@Status nvarchar(9),@solutionid bigint', 
@Audience=N'test%',@DateCreated='2000-01-01 00:00:00',@Status=N'test',@solutionid=500000 
+2

能否請您添加表結構,並最終現有的索引? –

+0

要增加的另一件事是實際處理的數據量。我們在談論成千上萬的記錄還是數百萬?最後,你可以針對查詢運行任何種類的查詢調優工具嗎? – NotMe

+0

是否索引了solutionid? dbo.view中有多少行? – chmullig

回答

1

如果您傳遞參數@audience和@status則沒有需要測試一個空的條件,但這不會對性能有太大的作用。如果你不輸出到XML,你仍然有性能問題?包括提示(nolock)或可能(holdlock)。不知道你可以(holdlock)在視圖上 - 你可能需要將它分解爲(holdlock)表。爲什麼在DateCreated和DateLastModified上進行強制轉換 - 它們是SQL中的文本字段嗎?如果它們是文本並且將投射到日期時間那麼爲什麼不將它們存儲爲日期時間?

0

首先,BalamBalam建議使用nolock。如果使用得當,這確實可以極大地提高性能,但可能會導致髒讀取並導致不一致的結果。簡而言之,nolock可能是有用的,但應謹慎使用並充分理解其涉及的風險。

接下來,我一定會看看你的索引。缺少的索引功能可以給你一個關於特別要看的東西的好主意,但是我會確保所有的solutionId列索引。

最後,有一些表現一般的想法,可能是有用的,你這個優化:http://www.sqlservercentral.com/articles/Performance/71001/

+0

我完全同意nolock不要掉以輕心。但是運行80分鐘並返回1400結果的查詢是候選人。無論如何,數據是80分鐘陳舊。一般情況下,如果您確實需要鎖定一個鎖,那麼應該將查詢範圍限制爲只需要「乾淨」的數據塊。在另一個極端,我懷疑持鎖是這種情況的正確答案,但需要考慮。 – Paparazzi

+0

是的,我認爲這可能是nolock的候選人,但任何使用nolock的人都需要理解隨之而來的風險。 – TimothyAWiseman