编写SQL查询的方式会影响性能吗?

时间:2009-04-20 05:10:21

标签: sql linq

说我有一张桌子

Id int
Region int
Name nvarchar

select * from table1 where region = 1 and name = 'test'

select * from table1 where name = 'test' and region = 1

性能会有差异吗? 假设没有索引

和LINQ一样吗?

4 个答案:

答案 0 :(得分:7)

因为你的限定词本质上实际上是相同的(无论where子句的顺序是什么并不重要),那么不,这些之间没有区别。

对于LINQ,您需要知道LINQ to SQL实际发出的查询(您可以使用SQL事件探查器查找)。有时查询将是您能想到的最简单的查询,有时候如果没有您意识到这将是一个复杂的问题,因为诸如依赖于FK或其他此类约束之类的事情。 LINQ也不会使用*来进行选择。

唯一真正知道的方法是找出两个查询的SQL Server查询执行计划。要了解有关该主题的更多信息,请访问:

SQL Server Query Execution Plan Analysis

答案 1 :(得分:3)

应该吗?不可以.SQL是一个关系代数,DBMS应该优化而不管语句中的顺序。

是吗?有可能。一些DBMS可以按照特定的顺序存储数据(例如,保持某种键),尽管它们已被告知。但是,这就是关键所在:你不能依赖它。

您可能需要在将来某个时候切换DBMS。即使更高版本的相同的 DBMS也可能会改变其行为。您唯一应该依赖的是SQL标准中的内容。

关于给出的查询:在所讨论的两个字段上没有索引或主键,您应该假设您需要针对这两种情况进行全表扫描。因此它们应该以相同的速度运行。

答案 2 :(得分:1)

我不建议使用*,因为引擎应该在执行查询之前查找表格方案。而是使用您想要的表字段来避免不必要的开销。

是的,引擎可以优化您的查询,但可以帮助他:)。

最诚挚的问候!

答案 3 :(得分:1)

对于简单查询,可能几乎没有区别,但是确实,编写查询的方式会对性能产生巨大影响。

在SQL Server中(性能问题是特定于数据库的),与在派生表的连接中执行相同操作相比,相关子查询通常性能较差。

查询中可能影响性能的其他内容包括使用SARGable 1 where子句而不是非SARGable子句,只选择您需要的字段而不使用select *(特别是在进行连接时)至少重复一个字段),使用基于集合的查询而不是游标,避免使用通配符作为类似子句中的第一个字符,然后依次使用。有非常大的书籍将章节用于更有效的方式来编写查询。

1 对于那些不知道的人来说,“SARGable”是DB2用语中的第1阶段谓词(可能还有其他DBMS')。阶段1谓词更有效,因为它们是索引的一部分,DB2首先使用它们。