Sql 按索引列排序

Sql 按索引列排序,sql,sql-server,performance,indexing,sql-order-by,Sql,Sql Server,Performance,Indexing,Sql Order By,我不清楚以下几点: 假设我有一个表a,并且我在X列上创建了一个索引 如果我确实根据将对结果进行排序的列进行选择,对吗? 但是,如果出于某种原因,我执行了一个select,然后执行了一个X(例如,我不知道该列已被索引)排序,SQL server会执行顺序访问还是使用索引?如果在select查询中未指定ORDER by,然后就没有任何类型的保证性/确定性排序了 数据将被返回-但不能保证有任何订单(或者下次查询时将以相同的顺序返回) 因此,如果你需要一个订单,那么你必须在选择中指定一个订单——就这么简

我不清楚以下几点:
假设我有一个表
a
,并且我在
X列上创建了一个索引
如果我确实根据将对结果进行排序的列进行选择,对吗?

但是,如果出于某种原因,我执行了一个select,然后执行了一个X
(例如,我不知道该列已被索引)排序,SQL server会执行顺序访问还是使用索引?

如果在
select
查询中未指定
ORDER by
,然后就没有任何类型的保证性/确定性排序了

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

因此,如果你需要一个订单,那么你必须在
选择中指定一个
订单
——就这么简单

是的,如果有一个索引,并且它是合理的,那么SQL Server查询优化器将确实使用该索引。但是其中有很多if和But——它可能——也可能不——使用索引——这完全取决于优化器的决定(这取决于很多因素——这里列出的因素太多)


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

如果在
SELECT
查询中没有指定
ORDER BY
,那么就没有任何类型的保证性/确定性排序

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

因此,如果你需要一个订单,那么你必须在
选择中指定一个
订单
——就这么简单

是的,如果有一个索引,并且它是合理的,那么SQL Server查询优化器将确实使用该索引。但是其中有很多if和But——它可能——也可能不——使用索引——这完全取决于优化器的决定(这取决于很多因素——这里列出的因素太多)


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

RDM是否将使用索引取决于SQL查询中的谓词、表中有哪些其他索引以及优化者如何选择执行查询

所以如果你有 选择A,X 从T 其中A=某个_值 按X订购

A上有一个索引,然后RDM可以(重点是may)选择通过该索引而不是T上的索引访问数据。这意味着SELECT后面会有一个排序


与大多数数据库问题一样,答案是“这取决于”RDMS是否使用索引取决于SQL查询中的谓词、表中有哪些其他索引以及优化者选择如何执行查询

所以如果你有 选择A,X 从T 其中A=某个_值 按X订购

A上有一个索引,然后RDM可以(重点是may)选择通过该索引而不是T上的索引访问数据。这意味着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; 
SELECT * FROM comments WHERE created>sysday-7 ORDER BY created DESC;
Oracle将执行完全索引扫描(仅索引数据),但Postgresql将执行完全表扫描

SELECT created FROM comments ORDER BY created; 
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将执行索引范围扫描并从表中读取数据。

如果选择中没有ORDER BY,则没有任何类型的确定顺序

SELECT created FROM comments WHERE created>sysday-7  ORDER BY created;
索引加排序是一个相当复杂的故事。它取决于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; 
SELECT * FROM comments WHERE created>sysday-7 ORDER BY created DESC;
Oracle将执行完全索引扫描(仅索引数据),但Postgresql将执行完全表扫描

SELECT created FROM comments ORDER BY created; 
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将执行索引范围扫描并从表中读取数据。

您所说的“SQL server”是什么意思。Microsoft SQL Server或@iddqd:任何sql server实现“sql server”是什么意思。Microsoft SQL Server或@iddqd:任何sql server实现,但索引不创建一个
B-Tree
?那么日期不是按顺序访问的吗?@Cratylus:当然-索引创建一个B-Tree-但这并不意味着任何使用该列的选择都会按任何方式排序…真的吗?我想是这样的。也许是实现细节?没有保证任何订单-除非您使用
order BY
明确要求。习惯一下。@Cratylus-例如,SQL Server可能会按索引键顺序扫描索引,而不是按索引键顺序扫描。或者使用旋转木马扫描功能。但是索引不是创建了一个
B-Tree
?那么日期不是按顺序访问的吗?@Cratylus:sure-索引创建了一个B-Tree-但这并不意味着任何使用该列的选择都会按顺序进行
SELECT created FROM comments WHERE created>sysday-7  ORDER BY created;