database - 此优化是否始终有效

标签 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。

添加:顺便说一句,IndexedID 是数字、唯一且严格递增的。

最佳答案

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

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

关于database - 此优化是否始终有效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12933223/

相关文章:

optimization - ARM NEON : How to implement a 256bytes Look Up table

grails - grails 索引页的最佳实践

c - 值得使用 mod 来替换循环索引的 if 语句

mysql - IntelliJ IDEA 中的数据库 View 不显示连接的所有数据库

MongoDB 错误 : couldn't connect to server . .. 在 createPrivateMap 中打开/创建失败

java - 如何快速将大型 txt 文件加载到 BigInteger 中?

java - 线程中的异常 "main"java.lang.IndexOutOfBoundsException : Index: 0, 大小 : 0?

MySQL:截断表与从表中删除

database - Flex 中可以有多个 labelField 吗?

sql - 如何使用窗口函数优化 SQL 查询