这种优化是否始终有效

时间:2012-10-17 11:23:53

标签: database optimization indexing sql-server-2000

数据库专家建议重构查询:

SELECT * FROM MyTable 
WHERE UnIndexedDate 
BETWEEN '2012-08-01' AND '2012-09-01'

SELECT * FROM MyTable
WHERE IndexedID 
BETWEEN (SELECT MIN(IndexedID) FROM MyTable WHERE UnIndexedDate BETWEEN '2012-08-01' AND  '2012-08-30')
AND (SELECT MAX(IndexedID) FROM MyTable WHERE UnIndexedDate BETWEEN '2012-08-01' AND  '2012-08-30')

请注意,该表未在UnIndexedDate列上编制索引,但已在IndexedID列上编入索引。该表中有数百万条记录。

它显然确实提高了查询的速度,我怀疑这是因为子查询只执行一次,甚至可能在某种程度上更有效,因为它们涉及索引字段。

我的问题是,这是否适用于大多数数据库或仅适用于此处的SQL2000。

已添加: BTW IndexedID是数字,唯一且严格增加。

1 个答案:

答案 0 :(得分:0)

只有当未编制索引的日期列与索引的id列一起增加时,您的优化才会起作用;这是DESIGN的假设,而不是它运行的平台。换句话说,听起来无索引日期与索引ID相关,因为ID是插入时插入的自动编号,未编入索引的日期是插入时间。在那个狭隘的案例中,@ MartinSmith的评论将成立;如果未编制索引的日期列和索引列没有相关性,则结果可能会有所不同。

在不查看执行计划的情况下,我敢打赌你在桌面上看到两次扫描来检索ID(一个非常狭窄和小的数据集),然后索引寻求返回实际的行。只要假定的关系成立,它就会起作用。但是,如果某人更新为日期列(并打破了日期和ID之间的关系),则结果将不再准确,因为MIN或MAX id值可能不再在该范围内。