Oracle复合索引用于范围查询条件
我有一个表Blah(纬度float,经度float,create_time date,owner_id int,…..)
我的代码只能执行一次查询 select * from Blah where latitude < l1 and latitude > l2 and longitude < ll1 and longitude > ll2 and create_time < t1 and create_time > t2 and owner_id < o1 and owner_id > o2 ; (当然,值l1,l2,… o1,o2是来自程序的动态参数) 我的问题是我应该创建什么样的索引?综合指数? 我想了很久,没有找到关于oracle索引如何工作的详细文档. 我可以使用B-tree找到使用B-tree实现的文档,在我们的例子中:B树中的每个键都是一个4元组:(column1,column2,column3,column4),其中这些元组的排序关系被定义为词法订购. 那么对于上面的查询,假设我们的订单是(owner_id,create_time,纬度,经度),我猜 接下来,我们需要找到满足条件的下一节,所以我们需要 按照这种精神,看来我们应该把列的数值范围基数放在第一位, 为了更清楚,这里有一个更简单的例子: 假设我有2列X和Y 在db中,两者的值都是[1,2,… 100],所以我们有100×100行 我的查询是 select * from mytable where X > 34 and X < 78 and Y > 12 and Y < 15; 说我们的索引是(X,Y),所以两个值之间的比较规则是 v1 < v2 <=====> v1.x < v2.x || v1.x == v2.x && v1.y < v2.y 给定上述排序规则,我们可以看到索引中的值是 1,1,2 1,3 .... 1,100 2,1 2,2 2,3 ......2,100 ..... 100,1 100,2 ....... 100,100 现在,要查询查询中的值,需要B-Tree遍历 所以如果我们具有更高的维度,则间隔数量呈指数增长 非常感谢 实际上,我们很少创建索引,其唯一目的是优化单个查询.一般来说,为了使索引维护的开销值得,我们希望我们的索引在许多查询中都是有用的.在复合索引的情况下,这意味着按查询在该列上具有谓词的概率排序列.如果在owner_id,经度等上有一个复合索引,那么可以将其用于仅在owner_id上指定谓词的查询.但是,实际上,您不会将该索引用于仅在经度上指定谓词的查询. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |