在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它可以正常工作。我怎么能绕过这个?
答案 0 :(得分:1)
在您的更新中,您创建了表变量,而不是临时表。表变量(与所有其他变量一样)在嵌套作用域中不可用。临时表是。你可以尝试:
CREATE TABLE #Temp_Results (ItemListID BIGINT, Title VARCHAR(255) )
EXEC ('INSERT INTO #Temp_Results (ItemListID, Title) (' + @sqlTop + @sqlBody + ')')
答案 1 :(得分:0)
我现在理解你的问题,我认为最好的方法是不使用动态查询。但是,如果你必须使用动态查询,这里有一些方法来加快它。
确保哪里的所有项目都有索引。
将您的计数添加到EXEC中,以便通过一次exec调用返回行计数。例如,在动态查询中,将减少的结果放在临时表中,然后计算该表,然后从该表中进行选择。