- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我创建了一个包含两列 a 和 b 的表格。 a 列只是数字 1 到 1 亿。 b 列是介于 0 和 999 之间的随机整数。我想使用此表来检查索引如何改进计算。所以我检查了以下内容:
select count(*) from my_table where b = 332
select avg(a) from my_table where b = 387
332 和 387 只是随机整数,我想确保它没有缓存任何东西,所以我切换了它。
然后我创建了一个索引:
create bitmap index myindx1 on my_table (b);
commit;
这使计数 (*) 从 14 秒减少到 75 毫秒,成功!
但 avg(a) 表现不佳。它实际上变得更糟,从 8 秒到 10 秒。我没有对此进行多次测试,根据计划它看起来是侥幸,但至少它似乎并没有像我预期的那样做得更好。
没有索引的解释计划如下所示:
带有索引的解释计划如下所示:
所以它看起来有点帮助,但平均数字真的比计算它们要昂贵得多吗?平均数字比进行全表扫描更昂贵?我认为该索引会将我的查询削减到原始成本的一小部分,而不仅仅是节省一点时间。我还能做些什么来加快此查询的速度吗?
谢谢。
最佳答案
问题在于您设置测试的方式 - 它不切实际并且对索引不利。
首先:您的表中只有两个整数列,因此每一行都非常小。因此,Oracle 可以将很多行放入每个数据库 block 中——比如每个 block 几 千 行。
其次:您随机创建了索引数据,其值介于 0 到 999 之间。
将这两个事实放在一起,我们能猜出什么?答案:几乎每个数据库 block 都将至少有一行具有列 B
的任何给定值。
因此,无论您寻找什么 B
的值,您最终都会一次一个地读取表中的每个 block (即:“顺序读取”)。
将其与不使用索引的计划(全表扫描)进行比较,其中 Oracle 仍将读取每个 block ,但它会一次读取多个 block (即“分散读取”)。
难怪您的索引没有帮助。
如果您想要更好的测试,请将 C
列添加到您的测试表中,它只是一个包含 200-300 个字符的字符串(例如,“XXXXXXXXX...”)。这会将每个 block 的行数减少到更实际的值,您应该会从索引中看到更好的 yield 。
最后注意:使用BITMAP
索引时要非常小心。它们在发生任何类型的 DML(插入、更新、删除)的表上几乎不可用!在使用之前阅读所有关于它们的信息!
对此的澄清:
So it looks like it's helping a bit, but is it really that much more expensive to average numbers than count them? And way more expensive to average numbers than to do a full table scan?
您的索引帮助您的 COUNT(*)
查询的原因是索引本身会告诉 Oracle 有多少行满足条件 B=332
,所以它确实如此不需要读取表 block ,因此不会遇到我上面描述的问题(即逐个读取每个表 block )。
并不是说 COUNT()
比 AVG()
“快”。只是,在您的测试中,COUNT
可以仅使用索引来计算,而 AVG
需要来自表的信息。
关于database - Oracle 索引勉强加速聚合计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52284626/
这几天我一直在努力。我一直在自学 CSS,所以对菜鸟好一点。我正在创建一个推荐 slider 。推荐以 3 个 block 显示。我希望前 2 个下降,第 3 个上升。但是当 slider 激活时,无
我最近开始学习 Nodejs,现在我很困惑我的网络应用程序使用什么,html 还是 ejs (Express)。 Ejs 使用 Express 模块,而 .html 使用 HTML 模块。我的第一个问
假设我们有一个 PostgreSQL 表contacts,每条记录都有一堆带标签的电子邮件地址(标签和电子邮件对)——其中一个是“主要”。 存储方式如下: id 主键 电子邮件 文本 email_la
我成功为一种新的tesseract语言编写了traineddata文件,但是当我完成时,我继续收到以下错误: index >= 0 && index = 0 && 索引 < size_used_ :E
这个问题已经有答案了: How to deal with SettingWithCopyWarning in Pandas (21 个回答) 已关闭 4 年前。 假设我有一个像这样的数据框,第一列“密
如果我有一个位置或行/列同时用于 A 和 B 位置,请检查 B 是否与 A 成对角线? 1 2 3 4 5 6 7 8 9 例如,我如何检查 5 是否与 7 成对角线? 此外,如果我检查 4 是
MongoDB:索引 一、 创建索引 默认情况下,集合中的_id字段就是索引,我们可以通过getIndexes()方法来查看一个集合中的索引 > db.user.getIndexes() [ { "v
一、索引介绍 索引是一种用来快速查询数据的数据结构。 B+Tree就是一种常用的数据库索引数据结构,MongoDB采用B+Tree 做索引,索引创建在colletions上。 MongoDB不使用索引
我无法决定索引。 就像我有下面的查询需要太多时间来执行: select count(rn.NODE_ID) as Count, rnl.[ISO_COUNTRY_CODE] as Cou
我有这些表: CREATE TABLE `cstat` ( `id_cstat` bigint(20) NOT NULL, `lang_code` varchar(3) NOT NULL,
我正在尝试找到一种方法来提高包含 IP 范围的 mysql 表的性能(在高峰时段每秒最多有 500 个 SELECT 查询(!),所以我有点担心)。 我有一个这种结构的表: id smallint(
jquery index() 似乎无法识别元素之一,总是说“无法读取未定义的属性‘长度’”这是我的代码。mnumber 是导致问题的原因。我需要 number 和 mnumber 才能跟踪使用鼠标,并
我们有一个包含近 4000 万条记录的 MongoDB 集合。该集合的当前大小为 5GB。此集合中存储的数据包含以下字段: _id: "MongoDB id" userid: "user id" (i
文档说:如果你有多个字段的复合索引,你可以用它来查询字段的开始子集。所以如果你有一个索引一个,乙,丙你可以用它查询一种一个,乙a,b,c 我的问题是,如果我有一个像这样的复合索引一个,乙,丙我可以查询
我正在使用 $('#list option').each(function(){ //do stuff }); 循环列表中的选项。我想知道如何获取当前循环的索引? 因为我不想让 var i = 0;循
MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度。 打个比方,如果合理的设计且使用索引的MySQL是一辆兰博基尼的话,那么没有设计和使用索引的MySQL
SQLite 索引(Index) 索引(Index)是一种特殊的查找表,数据库搜索引擎用来加快数据检索。简单地说,索引是一个指向表中数据的指针。一个数据库中的索引与一本书后边的索引是非常相似的。
我是 RavenDB 的新手。我正在尝试使用多 map 索引功能,但我不确定这是否是解决我的问题的最佳方法。所以我有三个文件:Unit、Car、People。 汽车文件看起来像这样: { Id: "
我有以下数据,我想根据范围在另一个表中建立索引 我想要实现的是,例如,如果三星的销售额为 2500,则折扣为 2%,低于 3000 且高于 1000 我知道它可以通过索引来完成,与多个数组匹配,然后指
我正在检查并删除 SQL 数据库中的重复和冗余索引。 所以如果我有两个相同的索引,我会删除。 例如,如果我删除了重叠的索引... 索引1:品牌、型号 指标二:品牌、型号、价格 我删除索引 1。 相同顺
我是一名优秀的程序员,十分优秀!