Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
对于多个sql order by子句,即使前面的order by证明行不相等,是否仍运行所有order by?_Sql_Sql Server_Sql Order By - Fatal编程技术网

对于多个sql order by子句,即使前面的order by证明行不相等,是否仍运行所有order by?

对于多个sql order by子句,即使前面的order by证明行不相等,是否仍运行所有order by?,sql,sql-server,sql-order-by,Sql,Sql Server,Sql Order By,在包含多个order by子句的SQL查询中,它们是否都在执行期间运行 例如: select * from my_table order by field5, field3, field2 如果执行“order by”字段5和字段3后的列表具有唯一的列表,其中只有字段5和字段3的一个组合,则在执行SQL查询期间是否仍运行“order by field2”?或者,在我的例子中,SQL Server是否足够聪明,可以看到这一点并跳过最后一步 我这样问是因为我正在编写一个存储过程,其中我有一个列表,

在包含多个order by子句的SQL查询中,它们是否都在执行期间运行

例如:

select * from my_table
order by field5, field3, field2
如果执行“order by”字段5和字段3后的列表具有唯一的列表,其中只有字段5和字段3的一个组合,则在执行SQL查询期间是否仍运行“order by field2”?或者,在我的例子中,SQL Server是否足够聪明,可以看到这一点并跳过最后一步


我这样问是因为我正在编写一个存储过程,其中我有一个列表,其中我大部分时间只需要按到或三列排序,但在某些情况下,如果需要,我希望按最后一列排序,但这将是字母数字排序,这将减慢查询速度,所以我当然希望尽可能地避免它

很可能是的,我看不出SQL Server如何知道最后一列是否有多行,而不是实际读取它们


优化这一点的更好方法是为您的
order by
中的列添加索引,并以相同的方式排序。

排序末尾的额外列对查询速度的影响可以忽略不计

如果可以,按照前面的建议创建复合索引可能不是一个坏主意:

create index my_index on my_table (field5, field3, field2);
如果内部排序实现没有使优化成为您所谈论的内容,我会感到惊讶,这就是数据结构和算法101


不过,请注意,在有些情况下,这里的索引会使情况变得更糟,例如,如果您在一个包含许多元组的表上有大量的表,并且如果您有一个包含很少列的表,那么优化器无论如何都会执行完整的表扫描,因为这样会更快。

您正在进行微优化。通过列出可能不必要的字段以按v.s排序,更好地减少一点额外开销。必须维护多个查询以列出所有可能的排序变量的开销。因为总体结果与您指定的完全一致(检查前两列足以确定行在结果集中的位置),您不太可能找到任何关于是否实际实现了此特定优化的文档。查询已在读取该行以对其进行排序。除非该行中有BLOB或类似的内容,否则无论如何都会读取整个内容。索引当然是智能的,非常适合优化像我这样的查询。但我更喜欢关于sql server是如何实现的哲学角…如果它将跳过最后一个顺序,那么可能不需要索引。或者,建议使用复杂索引是否暗示所有排序都以任何方式执行?我假设,除非由field2区分的行集的基数很高,否则最后一列n应该是不相关的,因为数据库将检索数据块而不是单独的行,因此已经具有完成排序所需的信息。但是,一旦单独考虑,这可能会产生难以预测的不良副作用。如果需要引用表,则可能会在排序期间生成锁为了确保一致性,出于这些原因,我将使用完整的索引,而不考虑简单的算法细节。