【问题标题】:which query runs faster on below listed SQL queries哪个查询在下面列出的 SQL 查询中运行得更快
【发布时间】:2020-01-16 10:07:03
【问题描述】:
员工表
select * from Employee where Salary=60000 and FirstName = 'Mark'
select * from Employee where FirstName = 'Mark' and Salary = 60000
在上述子句条件颠倒的查询中,我想知道哪个查询运行得更快。
我。如果表除了主键之外没有任何索引,那么哪个查询运行得更快?
二、它取决于搜索的数据类型吗?像第一个 int(salary) 和下一个是 varchar(name) ?如果我们反转,性能会改变吗?
【问题讨论】:
标签:
sql
sql-server
database
sql-server-2016
【解决方案1】:
SQL 是一种声明性 语言,而不是一种过程 语言。
也就是说,SELECT 查询描述了结果集的外观。它没有定义用于满足查询的逐步操作。被执行的是执行计划。这是由优化器在编译阶段之后产生的(一些数据库引擎甚至可以在查询开始运行后调整执行计划)。
所以,您的问题是关于优化器的作用。出于所有实际目的,优化器将生成相同的执行计划,使用相同的索引、分区、表统计信息等。
在一种情况下,理论上性能可能存在微小差异。例如,如果所有薪水都是 60000,那么首先进行比较比第二次进行更糟糕——因为 SQL Server 会短路 AND 计算,所以它会在第一个“假”处停止。
我不能 100% 确定 SQL Server 优化器是否有足够的信息来安排比较,同时考虑到列中值的分布和比较的复杂性,以生成最佳排序(它会做这用于更昂贵的比较)。但是,对基本类型的比较非常快,因此即使反转它们也会对性能产生非常小的影响。
【解决方案2】:
- 与实际执行计划相等
- 从统计 io 是相等的
- 统计时间相等
我更喜欢先使用查询