1

我正在通过ORM访问数据库(主要是MS SQL Server,Postgre),并通过代码定义属性(如字段/列是否应该有索引)。我想如果一个列将通过ORDER BY进行排序,它应该有一个索引,否则每次都需要全表扫描(例如,如果你想获得按日期排序的前5个记录)。在关系数据库中,查询中要排序的所有列是否都有索引?

正如我在代码中定义这些索引(在Entity Framework POCO实体上,作为.NET属性),我可以在运行时访问这些元数据。当在网格中显示数据时,我打算只制作那些具有索引属性的可排序列(通过单击列标题)。我的想法是否正确,或者可能存在一些合理的条件,可以在非索引列上进行分类,反之亦然(索引列分类没有多大意义?)

总之,它是否好假设只有那些列可以在UI中进行排序,并在数据库级别应用相应的索引?

或者,对于更常见的问题来说:应该排序的列总是有某种索引?

回答

0

order by没有强制索引在列上,但如果没有索引,那么它最终会做一个比索引排序的文件排序,因此如果您打算在WHERE/JOIN ON/HAVING/ORDER BY中使用这些列索引。

您可以生成查询执行计划,看看版本之间的差异(收录在非索引)

1

无论您需要的指数取决于你比起来怎么经常更改你多久查询有序序列这可能会影响有序的序列。

每当您进行影响有序序列的更改时,您的数据库必须重新排序已排序的索引。因此,如果您将比查询做出更多更改,那么索引的排序次数将比使用排序结果的次数多。

此外,它取决于谁愿意等待结果:进行需要重新索引的更改或执行查询的人。

如果索引是在更改完成后由单独的进程排序的,那么我不会感到惊讶。如果在排序未完成时完成查询,则数据库将需要先完成足够的排序才能返回查询。另一方面,如果由于较早的更改而需要的排序没有完成时发生新的更改,那么数据库可能不会完成先前的排序,但是开始排序新的情况。

所以我想这不是强制性的每个查询有一个有序的索引。要订购每一个可能的列 - 组合将会有太多的工作,但是如果一个正在等待结果的进程请求特定的排序,创建有序索引可能是明智的。

相关问题