选择查询优化

时间:2012-06-28 11:25:26

标签: database sql-server-2008 query-optimization

我有一个包含ID,日期和其他列的大表。 ID已编入索引且为顺序。

我想在特定日期之后选择所有行。鉴于ID是顺序的,如果行按ID按降序排序,则一旦第一行未通过日期测试,就不需要继续检查。如何利用索引来优化这个?

2 个答案:

答案 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)

如果没有实际索引日期,我认为没有一个好的“合法”方式。

但是,你可以尝试这样的事情:

  • 向DBMS发出以下查询:SELECT * FROM YOUR_TABLE ORDER BY ID DESC
  • 开始在客户端应用程序中获取行。
  • 在您提取时,请检查日期。
  • 当日期超过限制时,停止提取(并关闭光标)。

这个想法是DBMS有时不必在开始将部分结果发送到客户端之前完成整个查询。在这种情况下,希望DBMS将对ID执行索引扫描(由于ORDER BY ID DESC),并且您将能够在发生时获得结果然后停止它甚至在它完成之前。

注意:如果您的DBMS为您提供了在快速获取第一行与快速获得整个结果之间取得平衡的选项,请选择第一个选项(例如Oracle下的/*+ FIRST_ROWS */提示)。

当然,对实际数据量执行度量,以确保这在您的特定情况下确实有效。