2013-02-25 119 views
0

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

+0

你是什么意思的“SQL服务器”。 Microsoft SQL Server或...? – iddqd 2013-02-25 12:18:05

+0

@iddqd:任何sql服务器实现 – Cratylus 2013-02-25 12:19:53

回答

5

如果你没有在你的SELECT查询指定ORDER BY,那么就没有保证/不确定性任何种类的顺序。

的数据将被退回 - 但没有任何订单的保证(或者说,它会在你查询它相同的顺序下一次被退回)

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

是的 - 如果有一个索引,如果它有意义 - 那么SQL Server查询优化器将确实使用该索引。但是有很多ifs但是涉及 - 它可能 - 也可能不 - 使用索引 - 完全由优化器决定(这取决于很多因素 - 这里列出的许多因素) 。

这特别适用于SQL Server,我清楚地知道 - 我不知道其他RDBMS如何处理这种情况

+0

但索引没有创建一个'B-Tree'?那么是不是按顺序访问的日期? – Cratylus 2013-02-25 12:20:35

+0

@Cratylus:肯定的 - 索引创建一个B树 - 但是,这并不意味着任何选择使用该列会以任何方式进行排序..... – 2013-02-25 12:21:09

+0

我真的认为这did.Perhaps它是实现细节? – Cratylus 2013-02-25 12:26:34

0

无论是否RDMS将使用索引与否取决于谓词您的SQL查询,其他指标都在桌子上和优化器如何选择执行查询..

所以,如果你有 选择,X FROM T 其中A = SOME_VALUE ORDER BY X

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

与大多数数据库的问题,答案是“这取决于”

0

没有ORDER BY在SELECT,那么就没有任何形式的确定性排序。

索引加排序是相当复杂的故事。它依赖于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将执行索引范围扫描和从表中读出的数据。