sql中的查询语法有什么区别

时间:2016-12-09 13:10:42

标签: sql-server performance tsql

我想知道SQL中不同查询语法的性能。

我可以执行以下查询:

1 - 使用EXEC

DECLARE @sql varchar(max)
SET @sql = ' SELECT * from tableName'
EXEC (@sql)

2 - 简单陈述

SELECT * from tableName

从2以上的选项中,哪个在性能方面或在其他方面哪个更好??

提前致谢。

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;

请注意,执行计划几乎相同(标量运算符无关紧要):

execution plans

该计划中最昂贵的部分是TOP N排序。但是,这是必需的,因为没有可用于处理排序的索引。现在让我们将@sortBySomeCol更改为0并再次运行查询。这是新计划:

enter image description here

动态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)

第一个例子是dynamic SQL。第二个是静态的。

来自MSDN

  

虽然静态SQL在许多情况下运行良好,但是有一类应用程序无法提前确定数据访问。

静态需要更少的输入。因此,我建议您尽可能使用它。