我正在尝试为我的数据库类证明一个陈述。我已经说过,与不使用位图索引相比,使用位图索引可以在列仅包含枚举值(如性别)的表上更快地执行 WHERE 查询。
除此之外,我们尝试证明它对包含大量不同随机值的列的表没有帮助。
我们在 Oracle SQLDeveloper 中创建了两个表,如上文所述,以 10000 行的形式填充了上述信息。 Oracle 的版本是 v11。
我们使用一个过程将信息存储在表中。虽然枚举值随机设置为“S”、“M”或“L”,但另一个表的值是完全随机的(数字和字母)。
首先,我们运行语句:
set timing on
SELECT * FROM INDEXTEST2 WHERE GENDER = 'M' AND MARRIED = 'N' AND CHILDREN = 'Y'
重复运行此脚本最终耗时 00.016 秒。在此之后,我们通过右键单击表创建了一个索引,然后创建了一个索引。我们选择了所有列并检查了 Bitmap
。之后,我们再次运行查询几次,只是遇到相同的速度:大约 00.015 秒。我们还尝试删除索引,但没有结果。我们是否遗漏了什么,或者我们是否正确地完成了所有操作,而您只是看不出速度上的差异?
最佳答案
尝试选择较少的行(相对于表格中的所有行)。如果查询选择表中的大部分行,Oracle 的查询优化器可能(正确地)决定只进行全表扫描实际上更快 - 如果它必须加载表堆的大部分或所有 block ,它也可以直接这样做。
除此之外,您的测试集太小了。尝试设置足够大(添加几个零)以使执行时间超出秒表的分辨率(在 Windows 机器上通常为 16 毫秒)。更好的是,选择一个不完全适合缓存的大小。
但即使你做了所有这些,你仍然可能会得到一些奇怪的结果,因为 Oracle 的整体“聪明”。例如,Oracle 11g 引入了 query result cache这会完全扭曲重复查询的执行时间。
关于database - 数据库中的位图索引不能加快查询速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14260162/