查询性能,多个“OR”与单独的语句

时间:2010-07-08 16:00:54

标签: sql performance oracle scalability

假设我有一个40MM 9位邮政编码的Oracle数据库表,其中包含每个邮政编码的4位邮政编码。我有800个5位邮政编码列表,我需要找到所有相关的9位邮政编码。共有40K 5位邮政编码。假设我们使用B * Tree(常规)索引为5位邮政编码字段编制索引。考虑到数据库性能和可扩展性,是最好的方法:

  1. 查询单个语句中的所有记录?像这样的东西运行一次:

      

    SELECT * FROM ZIPCODE WHERE ZIP5 IN(:1,:2,...:800)

  2. 为每个5位邮政编码查询一次?像这样的东西运行800次:

      

    SELECT * FROM ZIPCODE WHERE ZIP5 =:1

  3. 两者之间的批量大小?

  4. 您如何看待?为什么?如果你处于一种思维状态,可以采取一些[可选的]后续想法:

    • 我们可以运行哪些测试来验证您的想法?
    • 最好的方法是否会随着卷的变化而改变(例如,如果我们有100个9位邮政编码映射到10个5位邮政编码,那么这10个邮政编码中有3个)?
    • 对于数据库而言,最好的事情是吸收查询结果的应用服务器的最佳选择吗?

2 个答案:

答案 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列表更改时重建查询更通用的解决方案。