0

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

4

3 回答 3

5

如果您没有ORDER BYSELECT查询中指定 an ,那么就没有任何类型的保证/没有确定性排序。

数据将被返回 - 但不能保证任何顺序(或者下次查询时它会以相同的顺序返回)

因此,如果您需要一个订单- 那么您必须ORDER BY在您的- 中指定一个SELECT- 就这么简单。

是的——如果有一个索引,并且有意义的话——那么 SQL Server 查询优化器确实会使用那个索引。但是涉及到很多ifsbuts - 它可能 - 或可能不 - 使用索引 - 这完全取决于优化器来决定(这取决于很多因素 - 太多无法在此处列出)。

这特别适用于我熟悉的 SQL Server - 我不知道其他 RDBMS 如何处理这种情况

于 2013-02-25T12:15:04.393 回答
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 将执行索引范围扫描并从表中读取数据。

于 2013-02-25T12:49:22.170 回答
0

RDMS 是否使用索引取决于 SQL 查询中的谓词、表上还有哪些其他索引以及优化器选择执行查询的方式。

因此,如果您有 SELECT A, X FROM T WHERE A = some_value ORDER BY X

并且 A 上有一个索引,然后 RDMS 可能(强调 MAY)选择通过该索引而不是 T 上的索引来访问数据。这意味着 SELECT 之后将进行排序。

与大多数数据库问题一样,答案是“视情况而定”

于 2013-02-25T12:25:21.167 回答