假设我有一个40MM 9位邮政编码的Oracle数据库表,其中包含每个邮政编码的4位邮政编码。我有800个5位邮政编码列表,我需要找到所有相关的9位邮政编码。共有40K 5位邮政编码。假设我们使用B * Tree(常规)索引为5位邮政编码字段编制索引。考虑到数据库性能和可扩展性,是最好的方法:
查询单个语句中的所有记录?像这样的东西运行一次:
SELECT * FROM ZIPCODE WHERE ZIP5 IN(:1,:2,...:800)
为每个5位邮政编码查询一次?像这样的东西运行800次:
SELECT * FROM ZIPCODE WHERE ZIP5 =:1
两者之间的批量大小?
您如何看待?为什么?如果你处于一种思维状态,可以采取一些[可选的]后续想法:
答案 0 :(得分:4)
让数据库服务器决定如何处理它。即使它在内部进行800次查询,它仍然会更快。它必须只解析一次查询,并且只需要发送一次结果。
因此,请使用SELECT * FROM ZIPCODE WHERE ZIP5 IN (:1, :2,... :800)
答案 1 :(得分:2)
您是否可以选择创建外部表?即,
CREATE TABLE zip5 (zip5 varchar2(5))
ORGANIZATION EXTERNAL
(
TYPE ORACLE_LOADER
DEFAULT DIRECTORY <some oracle DIRECTORY object>
LOCATION (<yourDirectory>:'zip5 filename.txt'
)
将zip5文本文件放在Oracle目录对象指定的OS目录中, 然后执行:
SELECT * FROM zipcode JOIN zip5 ON (zipcode.zip5 = zip5.zip5);
这是比每次ZIP5列表更改时重建查询更通用的解决方案。