【问题标题】:What is difference between query syntax in sqlsql中的查询语法有什么区别
【发布时间】:2016-12-09 13:10:42
【问题描述】:

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

我可以像这样执行查询:

1 - 使用 EXEC

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

2 - 简单陈述

SELECT * from tableName

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

提前致谢。

【问题讨论】:

  • 我投了反对票,因为:首先,您应该能够自己测试性能影响。 (我想没有性能差异。)其次你的“其他方面” - 你是什么意思?我应该谈论一条线还是三条线?或者你应该如何标记变量?或者如果“选择*”是个好习惯?我认为这不是一个有用的问题。
  • 这里,为了简单起见,我使用简单的查询。实际上,需要暴露多个表和特定列的连接。
  • 根据使用的语法重新标记为sql-server。如果您使用不同的东西,请为您的 DBMS 添加正确的标签。
  • @Naresh 即使有更复杂的查询,我猜(没有任何测试)这两个变体之间没有性能影响。但是你为什么不自己测试呢?
  • @a_horse_with_no_name :谢谢。我正在使用 Sql Server。

标签: sql-server performance tsql


【解决方案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 where someCol 最低 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;

同样,这取决于您在做什么。

【讨论】:

    【解决方案2】:

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

    来自MSDN

    虽然静态SQL在很多情况下都可以很好的工作,但是有一类应用是不能提前确定数据访问的。

    静态需要更少的输入。出于这个原因,我建议您尽可能使用它。

    【讨论】:

      猜你喜欢
      • 2023-03-19
      • 2012-11-21
      • 1970-01-01
      • 2020-03-22
      • 2012-04-19
      • 1970-01-01
      • 2020-02-09
      • 1970-01-01
      相关资源
      最近更新 更多