我不清楚以下内容:
假设我有一个表A
,我在列X
上创建了一个索引
如果我根据列进行选择,结果将被排序,对吗?
但是,如果由于某种原因我做了一个select后跟一个ORDER BY X
(例如我不知道该列被索引),SQL服务器会执行排序执行顺序访问还是会去使用索引?
答案 0 :(得分:5)
如果您未在ORDER BY
查询中指定SELECT
,那么无保证/无确定性任何类型的排序。
将返回数据 - 但不保证任何订单(或者下次查询时会以相同的顺序返回)
因此,如果您需要订单 - 那么必须在ORDER BY
中指定SELECT
- 就像那样。
是的 - 如果有一个索引,如果它有意义 - 那么SQL Server查询优化器确实会使用该索引。但是有很多 ifs 和 buts 涉及 - 它可能 - 或者可能不会 - 使用索引 - 这完全由优化器来决定(这取决于一个很多因素 - 这里列出的太多了。)
(这特别适用于我熟悉的SQL Server - 我不知道其他RDBMS如何处理这种情况)
答案 1 :(得分:0)
RDMS是否将使用索引取决于SQL查询中的谓词,表中的其他索引以及优化程序如何选择执行查询。
所以,如果你有 选择A,X 从T 在哪里A = some_value 订购X
然后在A上有一个索引然后RDMS可以(强调MAY)选择通过该索引而不是T上的索引访问数据。这意味着SELECT将跟随排序。
与大多数数据库问题一样,答案是“取决于”
答案 2 :(得分:0)
在SELECT中没有ORDER BY,就没有任何确定性排序。
索引加排序是一个相当复杂的故事。它取决于RDBMS,RDBMS版本和表中的数据。
1 000 000 rows in table
comment table
i - int, unique number from sequence/auto_increment etc.
created - long, indexed
updated - long, indexed
title - varchar(50) - indexed
body - text
选择
SELECT id FROM comments;
Oracle,MySQL,Postgresql完全随机返回记录。你可以有秩序的错觉。但经过一些行政工作真空,表分析,优化表;一切都可以改变
SELECT * FROM comments ORDER BY created DESC;
Postgresql和Oracle将执行全表扫描。
SELECT created FROM comments ORDER BY created;
Oracle将执行完整索引扫描(仅索引数据),但Postgresql将执行全表扫描。
SELECT * FROM comments WHERE created>sysday-7 ORDER BY created DESC;
Postgresql和Oracle将执行索引范围扫描并从表中读取数据。
SELECT created FROM comments WHERE created>sysday-7 ORDER BY created;
Oracle将执行索引范围扫描(不从表中读取),但Postgresql将执行索引范围扫描并从表中读取数据。