2

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

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 是数字,唯一且严格递增。

4

1 回答 1

0

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

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

于 2012-10-17T12:33:01.300 回答