如何在 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 子句中不起作用?