2011-02-04 77 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