我有一个包含ID,日期和其他列的大表。 ID已编入索引且为顺序。
我想在特定日期之后选择所有行。鉴于ID是顺序的,如果行按ID按降序排序,则一旦第一行未通过日期测试,就不需要继续检查。如何利用索引来优化这个?
答案 0 :(得分:3)
你可以这样做:
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
答案 1 :(得分:1)
如果没有实际索引日期,我认为没有一个好的“合法”方式。
但是,你可以尝试这样的事情:
SELECT * FROM YOUR_TABLE ORDER BY ID DESC
。这个想法是DBMS有时不必在开始将部分结果发送到客户端之前完成整个查询。在这种情况下,希望DBMS将对ID执行索引扫描(由于ORDER BY ID DESC
),并且您将能够在发生时获得结果然后停止它甚至在它完成之前。
注意:如果您的DBMS为您提供了在快速获取第一行与快速获得整个结果之间取得平衡的选项,请选择第一个选项(例如Oracle下的/*+ FIRST_ROWS */
提示)。
当然,对实际数据量执行度量,以确保这在您的特定情况下确实有效。