![]() |
1
1
我建议你把800万行的桌子改大一点。 谷歌的IP(对我来说,目前)即将成为
您可以将一条记录存储为“66.102.011”,其中包含相应的范围。事实上,你的商店 至少 “一个记录一个”aaa.bbb.ccc公司". 您可能会得到一个可能是5倍大的表,但是您可以通过每次只使用几个逻辑IOs而不是分区扫描的成百上千个IOs来锁定相关记录。 我怀疑你所有的数据都会有点过时(因为世界各地的权威机构都会发布/重新发布范围),所以每天/每周重新生成该表的调整应该不是什么大问题。 |
![]() |
2
2
我在过去也遇到过类似的问题;我的优势是我的范围很明显。我有几个IP_RANGES表,每个表对应一个特定的上下文,最大的是大约1000万条记录,没有分区。 我拥有的每个表都是索引组织的,主键是(endnum,START NUM)。我还有一个唯一的索引(START\u NUM,END\u NUM),但在本例中没有使用它。 使用一个随机的IP地址(1234567890),您的查询需要大约132k的时间。
最重要的提示是 ;它告诉Oracle运行该子查询一次,而不是每行运行一次,并为要在外部查询中使用的索引提供相等性测试。 |
![]() |
3
0
|
![]() |
4
0
请说明你们的IP范围是否有统一或有序的特征?例如,我通常希望IP范围位于2次方边界上。这里就是这种情况,所以我们可以假设所有范围都有一个隐式的网络掩码,以 米 一个接一个 n 如果是这样的话,就应该有一种方法来利用这些知识并“逐步”进入范围。有没有可能在一个计算值上添加一个索引,其中包含屏蔽位的计数(0-32)或者块大小(1到2^32)? 32只使用start\u num从掩码0到32的寻道比使用start\u num和end\u num之间的扫描要快。 另外,您是否考虑过位算法作为检查匹配的可能方法(同样,仅当范围表示大小为2的幂次方的均匀位置块时)。 |
![]() |
5
0
首先,你的表现要求是什么? 您的分区有一个明确的起始值和结束值,可以从所有的分区(或硬编码)中确定,并在函数中使用(下面的概念,但您需要修改它以向前/向后移动一个分区)。 然后您应该能够编写代码
它应该能够锁定到特定的分区。但是,如果如您所建议的,您只能将它锁定为八个分区中的三个分区,那么这仍然是一个大的扫描。我正在发布另一个更激进的答案,可能更合适。
|
![]() |
6
0
您现有的分区不起作用,因为Oracle正在通过start\ num访问表的本地索引分区,并且必须检查每个分区中可能存在匹配项的地方。
另一种解决方案是,假设没有范围跨越类A,则按分区列出
假设分布均匀,那么您的~10m行将被分散成大约40k行,这可能会更快地通读。
但是,如果我们添加了允许Oracle将注意力集中在单个分区上的条件,则会产生巨大的差异:
|
![]() |
Community wiki · SQL语法新手 1 年前 |
![]() |
KateMak · 是否将多行中的多列与唯一id组合? 1 年前 |
![]() |
Karuna · SQL中列内的筛选器[重复] 1 年前 |
![]() |
Irvan Affandy · 为另一个选择选择声明的键 1 年前 |
![]() |
Community wiki · 这个MySQL语句出了什么问题? 1 年前 |
![]() |
Community wiki · 优化从同一表中提取的多列的查询 1 年前 |