数据库大师曾建议重构查询:这是否优化总是工作
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之一。
增加:顺便说一句IndexedID是数字,唯一并严格增加。
除非'IndexedID'和'UnIndexedDate'相关,否则它会改变结果。你的表格定义是什么? 'UnIndexedDate'是否包含在'IndexedID'的辅助列中?如果没有,我不会看到重写会如何改进,因为建立“MIN”和“MAX”要么需要2次扫描,要么可能有很多查找。 –
你能提供两个版本的执行计划吗? – Thilo
@MartinSmith:+1只有当IndexedId的排序方式与UnindexedDate完全相同时,它才会起作用。 (如果UnindexedDate真的没有索引,我不会看到这样做会更快。似乎它应该在IndexedId的复合索引中,以使其工作)。 – Thilo