按索引列排序

时间:2013-02-25 12:09:54

标签: sql sql-server performance indexing sql-order-by

我不清楚以下内容:
假设我有一个表A,我在列X上创建了一个索引 如果我根据列进行选择,结果将被排序,对吗? 但是,如果由于某种原因我做了一个select后跟一个ORDER BY X(例如我不知道该列被索引),SQL服务器会执行排序执行顺序访问还是会去使用索引?

3 个答案:

答案 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将执行索引范围扫描并从表中读取数据。