如何优化耗时太长的sproc rowcounts?

时间:2011-07-26 23:44:39

标签: tsql sql-server-2008 optimization stored-procedures

在SQL Server 2008R2 sproc中,我有以下代码来计算动态查询返回的记录总数:

        -- count the actual number of results
        DECLARE @rowcount TABLE (Value int);
        INSERT INTO @rowcount
        EXEC('SELECT COUNT(*) ' + @sqlBody);
        SELECT @varcharActualNumResults = VALUE FROM @rowcount;

动态查询分为三个部分:@sqlTop,@ ssqlBody和@sqlBottom。

我想知道@sqlBody实际返回了多少条记录,但实际执行的是串联的@sqlTop + @sqlBody + @sqlBottom。

问题是上述查询需要24136毫秒(大约24秒),其中实际记录数约为18,000。

另一个问题出现在我想要获取整个查询的rowcount:

         EXEC (@sqlTop + @sqlBody + @sqlBottom)
         SET @NumberOfResultsReturned = @@ROWCOUNT;

此执行大约需要两秒钟。

以下是一个示例查询:

SELECT TOP(10) Title
FROM ItemData 
WHERE  ( 
           FREETEXT(Title, '"windshield"')  
           OR 
           (   [Title] LIKE '%mazda 6%' )  
       )   
AND  ( WebsiteID=1 )  
ORDER BY DateAdded DESC 

@sqlBody包含FROM和ORDER BY之前的所有内容。

如何优化?

更新

在我的sproc中,我定义了临时表,然后尝试通过EXEC命令填充它。但是,在EXEC命令行中,我收到一个错误,指示必须定义临时表:

DECLARE @Temp_Results TABLE (ItemListID BIGINT, Title VARCHAR(255) )
EXEC ('INSERT INTO @Temp_Results (ItemListID, Title) (' + @sqlTop + @sqlBody + ')')

如果我取出exec命令并执行SQL它可以正常工作。我怎么能绕过这个?

2 个答案:

答案 0 :(得分:1)

在您的更新中,您创建了表变量,而不是临时表。表变量(与所有其他变量一样)在嵌套作用域中不可用。临时表是。你可以尝试:

CREATE TABLE #Temp_Results (ItemListID BIGINT, Title VARCHAR(255) )
EXEC ('INSERT INTO #Temp_Results (ItemListID, Title) (' + @sqlTop + @sqlBody + ')')

答案 1 :(得分:0)

我现在理解你的问题,我认为最好的方法是不使用动态查询。但是,如果你必须使用动态查询,这里有一些方法来加快它。

  1. 确保哪里的所有项目都有索引。

  2. 将您的计数添加到EXEC中,以便通过一次exec调用返回行计数。例如,在动态查询中,将减少的结果放在临时表中,然后计算该表,然后从该表中进行选择。