数据库是DB2,多个索引都有某一个字段,那么DB2会执行那一个呢?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据库是DB2,多个索引都有某一个字段,那么DB2会执行那一个呢?相关的知识,希望对你有一定的参考价值。

比如Table中有字段:oid,name,sex,age,address。现在有两个索引:index1包含的字段有:oid,name.index2包含的字段有:name,age.
如果根据oid,name,age,查询一些数据时,DB2的执行计划是会调用哪个索引呢???
还有,这种写法会提到SQL的查询效率吗???

请各位大侠不吝赐教。
回答有帮助了,继续加分,十分感谢。

你的两个索引都是复合索引。所以字段的顺序是很重要的,索引的第一个字段是主索引码。索引B+树是根据主索引码构造的。index1(oid,name)和index1(name,oid)有天壤之别。
看样子,oid是主码吧,它具有唯一性,所以,根据oid、name、age查询数据时,会优先使用index1(姑且认为index1是(oid,name)形式),在index1中使用oid进行索引页的查找,因为oid值是唯一的,直接就能快速定位,根本用不到name和age。如果oid不是主码,如果仍然使用index1,那么当oid不足以区分表中行的时候,才会使用name和age进一步筛选。
当然,上面的内容也不是绝对的,一方面,DB2会对整个数据库收集统计信息,根据表中数据的分布和频率,有可能会选择index2,甚至不使用索引,直接表扫描;另一方面,如果你的查询语句中where后面的条件(谓词)是不可索引谓词(比如oid<>10),对应的索引同样不可用。

针对你的数据库系统到底会使用那个,你可以直接使用explain工具对查询优化过程进行查看。最简单的是事业visual explain,图形化的,会直观显示优化过程和结果。
你的问题属于查询优化的内容,实际上挺复杂的,建议你找些专业的介绍看看。(看你描述似乎不大专业)
参考技术A DB2可能先按old,name访问index1选出RID集合A,然后按name,age访问index2选出RID集合B ,再对集合A和集合B做MERGE,最后根据MERGE的结果RID访问数据。 我是一直做z/OS DB2,不晓得开放系统DB2术语是否一样。 参考技术B select oid,name,sex,age,address from Table
where oid = ? and name=? and age=?
用哪个索引是吧,
一般来说sql是那个索引先出现它就用哪个。
所以上面的使用 index1

如果你可以用两个索引(或者以上)一般你需要看 那个缩小范围大,
比如 你用name =? and age=?查到5条
用oid = ? and name =?查到 1000条。
显示用index2更好。
所以上面的sql为:
select oid,name,sex,age,address from Table
where name=? and age=? and
oid = ?

一般是这样的。
当然 如果是主键那数据库会优先用主键,当然有些数据库会帮你优化,一般的原则是那个索引先出现,就优先用那个。

MongoDB 一个复合索引与多个单字段索引

【中文标题】MongoDB 一个复合索引与多个单字段索引【英文标题】:MongoDB one compound index vs multiple single field indexes 【发布时间】:2012-11-16 07:11:43 【问题描述】:

我有一组照片。它们可以从其他一些集合(事件、新闻、帖子等)中引用(一对多)

我可以像这样创建参考:

db.photos.insert( parent: collection: 'events', id: 12345 )
db.photos.insert( parent: collection: 'events', id: 54321 )
//or just DBRef
db.photos.ensureIndex(parent:1)

db.photos.insert( post_id: 12345 )
db.photos.insert( event_id: 54321 )

db.photos.ensureIndex(post_id:1, sparse: true)
db.photos.ensureIndex(event_id:1, sparse: true)

在第一种情况下,我们有一个大的复合索引 第二个——一些较小的索引

每种方法的优缺点是什么?

【问题讨论】:

第一种情况是子文档索引,不是复合索引。请参阅文档here 以获得对差异的基本了解。询问每种方法的优缺点是一个过于宽泛的问题。 由于每张照片都可以从很多地方引用,您是否考虑过将照片 ID 存储在适当的事件集合中而不是照片集合中的事件?要了解哪个“更好”以及权衡取舍,您需要考虑如何查询此信息(因为架构和索引应根据您将使用的查询进行优化,而不是孤立的数据本身)。 基本上答案是:这取决于您的查询。 @JohnnyHK,谢谢,当然,我知道其中的区别。只是把它弄混了,因为我也在考虑两个单独的字段变体 //parent_collection 和 parent_id @AsyaKamsky,是的,我考虑过这个变体,而且这就是它现在的实现方式。但我还需要显示单独的照片列表。而且我敢肯定,在显示事件时,对照片集合的一个额外查询比在显示照片时对事件的多个查询要好。 【参考方案1】:

首先,检查哪个字段的命中数。 其次,创建一个具有最大命中字段的复合索引。 第三,创建一个具有最小命中字段的复合索引。

注意: 如果一次命中大量字段,则使用复合索引。 其他情况创建单一索引。

【讨论】:

以上是关于数据库是DB2,多个索引都有某一个字段,那么DB2会执行那一个呢?的主要内容,如果未能解决你的问题,请参考以下文章

DB2 与 Oracle 中的查询

DB2 分区表的效率问题及如何建立索引

DB2 v10 zos:识别空闲索引值

db2-索引

db2中获取某个表/索引占用空间的大小

db2 delete表数据如何恢复,表没有删除