说我有一张桌子
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一样吗?
答案 0 :(得分:7)
因为你的限定词本质上实际上是相同的(无论where子句的顺序是什么并不重要),那么不,这些之间没有区别。
对于LINQ,您需要知道LINQ to SQL实际发出的查询(您可以使用SQL事件探查器查找)。有时查询将是您能想到的最简单的查询,有时候如果没有您意识到这将是一个复杂的问题,因为诸如依赖于FK或其他此类约束之类的事情。 LINQ也不会使用*来进行选择。
唯一真正知道的方法是找出两个查询的SQL Server查询执行计划。要了解有关该主题的更多信息,请访问:
答案 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首先使用它们。