如何在 SQL 中不使用“ORDER BY”进行升序排序

Posted

技术标签:

【中文标题】如何在 SQL 中不使用“ORDER BY”进行升序排序【英文标题】:How to Sort Ascending Without "ORDER BY " in SQL 【发布时间】:2021-02-23 05:25:53 【问题描述】:

很高兴认识你

另一个程序正在使用该 SQL 加载数据, 但 DB Server 超过 1TB。

最后一个 SQL 语句使用“ORDER BY”加载时间太长 SQL中没有“ORDER BY”的情况下如何按时间戳升序排序?

SELECT timestamp
, node
, effect_ion
, effect_value
, priority

FROM   "--(*vendor(PML),product(LogServer) Global Event Log @Global *)--"

WHERE   (timestamp >= DATEADD(DD,-6,GETDATE()))
And
(priority BETWEEN  '253' AND '255')


ORDER BY timestamp DESC

【问题讨论】:

请添加您的 DBMS 标签。 GETDATE() 你需要在你的表上为时间戳列创建一个集群索引 @TimBiegeleisen 是的,但是 OP 在回答 SQL 问题时应该遵循“好的”模式,尤其是在优化主题方面 【参考方案1】:

你问:

如何在SQL中不带“ORDER BY”的时间戳按升序排序?

你没有。但是,您可以尝试添加以下索引,如果使用它,可能会让 SQL 更快地执行 ORDER BY 排序:

CREATE INDEX idx ON yourTable (priority, timestamp);

【讨论】:

适用于哪个数据库?在 Oracle 中它不会被使用。 @astentx OP 使用的语法显然是 SQL Server。至于它是否会使用这个索引,这将取决于数据和其他一些东西。当然,有些数据库可以使用这个索引。 OP 是索引的新手,你的答案应该更详细,如果可能的话应该有一些参考链接。 @Singh 不,对索引如何工作的完整背景解释过于宽泛,如果我的答案确实需要,那么问题可能应该被关闭,因为过于宽泛。 同意没有一个单一的圣杯可以涵盖有关索引的所有内容,但如果您能有一个简短的解释和一些关键字(如 INDEX、CLUSTERED 等)以及至少一个参考链接,那就更好了OP 可以从哪里开始探索索引。【参考方案2】:

CLUSTER INDEXES:聚集索引定义了数据在表中物理存储的顺序。

因此,您可以根据特定列定义数据的存储顺序。

默认情况下,PRIMARY KEY 创建一个 INDEX,使数据按 Id (PK) 列的 ASC 顺序存储。但事实证明,这不能保证任何排序顺序(cmets 中的参考链接)。

MS DOC for creation

CREATE CLUSTERED INDEX <index_name>
ON <table_name>(<column_name> ASC/DESC)

为了检查您可以使用的表的索引

EXEC sp_helpindex table_name

PS:请在创建 INDEXES 之前阅读更多内容/与团队中的某个人讨论,因为它会影响查询的性能。

【讨论】:

聚集索引保证任何排序顺序。 据我所知(不是那么远),该表最多可以有一个聚集索引,并且“聚集索引定义了数据在表中物理存储的顺序。”如果 ^ 信息有误,能否说明不保证排序的原因。 唯一保证特定排序顺序的方法是使用ORDER BY。见here或here或here @Singh,这里有更多关于为什么ORDER BY is required的信息。 如果任何链接失效,答案(例如问题)应该仍然有用且相关。这是非常不鼓励仅链接帖子的原因之一。此外,答案应尝试解释内容为何解决 OP 的问题。也许首先关注你自己的答案。

以上是关于如何在 SQL 中不使用“ORDER BY”进行升序排序的主要内容,如果未能解决你的问题,请参考以下文章

SQL语句中,如果有group by 和order by两个语句,是先分组还是先排序?

SQL语句中,如果有group by 和order by两个语句,是先分组还是先排序?

Oracle在查询Sql中不使用order by,导致数据量足够大的时候同样的sql查询的结果顺序不同?

order by 在 POSTGRESQL 中的 partition by 子句中不起作用?

有没有办法在聚合调用中不使用 ORDER BY 对 postgresql 自定义聚合中的行进行预排序?

SQL如何使用order by语句查询数据表的多字段