我想知道SQL中不同查询语法的性能。
我可以执行以下查询:
1 - 使用EXEC
DECLARE @sql varchar(max)
SET @sql = ' SELECT * from tableName'
EXEC (@sql)
2 - 简单陈述
SELECT * from tableName
从2以上的选项中,哪个在性能方面或在其他方面哪个更好??
提前致谢。
答案 0 :(得分:1)
“在性能方面哪个更好” 简短的回答是,取决于。
在您发布的示例中,没有区别,因为两个查询都非常简单,并且在执行时会生成相同的执行计划。有些情况下,动态SQL可以帮助提高性能。使用此示例数据:
CREATE TABLE ##test (id int identity PRIMARY KEY, someCol int NOT NULL)
INSERT ##test (someCol)
SELECT TOP(10000) abs(checksum(newid())%1000000) FROM sys.all_columns a, sys.all_columns b;
假设我们需要开发一个查询,从## test返回TOP 100记录,其中someCol< = 100000.还需要接受一个名为@sortBySomeCol的参数;如果它是1那么查询应该返回最低 100条记录(按SomeCol排序),否则任何记录,其中someCol小于/等于100000就可以了。
以下是使用和不使用动态SQL的解决方案:
DECLARE @sortBySomeCol bit = 1;
-- Dynamic SQL version
DECLARE @sql varchar(max)
SET @sql =
'SELECT TOP (100) *
FROM ##test
WHERE someCol <= 100000
'+CASE @sortBySomeCol WHEN 1 THEN 'ORDER BY someCol;' ELSE ';' END;
EXEC (@sql);
-- Alternative method
SELECT TOP (100) *
FROM ##test
WHERE someCol <= 100000
ORDER BY CASE @sortBySomeCol WHEN 1 THEN someCol END;
请注意,执行计划几乎相同(标量运算符无关紧要):
该计划中最昂贵的部分是TOP N排序。但是,这是必需的,因为没有可用于处理排序的索引。现在让我们将@sortBySomeCol更改为0并再次运行查询。这是新计划:
动态SQL解决方案不包括TOP N排序,但第二个解决方案即使不需要排序也可以。
值得注意的是,您可以通过包含OPTION(RECOMPILE)或执行以下操作来改进第二个查询:
IF @sortBySomeCol = 1
SELECT TOP (100) *
FROM ##test
WHERE someCol <= 100000
ORDER BY CASE @sortBySomeCol WHEN 1 THEN someCol END
ELSE
SELECT TOP (100) *
FROM ##test
WHERE someCol <= 100000;
同样,这取决于你在做什么。
答案 1 :(得分:0)