我有一个带有 ID、日期和其他一些列的大表。ID 是索引和顺序的。
我想在某个日期之后选择所有行。鉴于 ID 是连续的,如果行按 ID 降序排列,一旦第一行未通过日期测试,则无需进行检查。如何利用索引来优化它?
我有一个带有 ID、日期和其他一些列的大表。ID 是索引和顺序的。
我想在某个日期之后选择所有行。鉴于 ID 是连续的,如果行按 ID 降序排列,一旦第一行未通过日期测试,则无需进行检查。如何利用索引来优化它?
你可以这样做:
With FirstFailDate AS
(
-- You start by selecting the first fail date
SELECT TOP 1 * FROM YOUR_TABLE WHERE /* DATE TEST FAILING */ ORDER BY ID DESC
)
SELECT *
FROM YOUR_TABLE t
-- Then, you join your table with the first fail date, and get all the records
-- that are before this date (by ID)
JOIN FirstFailDate f
ON f.ID > t.ID
如果没有实际索引日期,我认为没有一个好的“合法”方法可以做到这一点。
但是,您可以尝试这样的事情:
SELECT * FROM YOUR_TABLE ORDER BY ID DESC
。这个想法是 DBMS 有时不必在开始将部分结果发送到客户端之前完成整个查询。在这种情况下,希望 DBMS 将对 ID 执行索引扫描(由于ORDER BY ID DESC
),您将能够在它发生时获得结果,然后在它完成之前停止它。
注意:如果您的 DBMS 为您提供了在快速获取第一行与快速获取整个结果之间取得平衡的选项,请选择第一个选项(例如/*+ FIRST_ROWS */
Oracle 下的提示)。
当然,对真实数量的数据进行测量,以确保这在您的特定情况下确实有效。