2010-07-08 15 views
2

比方說,我有一個包含4位郵政編碼的40MM 9位郵政編碼的Oracle數據庫表。我有一個800個5位郵政編碼的清單,我需要找到所有相關的9位郵政編碼。共有40K 5位郵政編碼。假設我們用B *樹(傳統)索引爲5位郵政編碼字段建立索引。考慮到數據庫性能和可擴展性,最好的方法是:查詢性能,多個「OR's」與單獨的語句

  1. 查詢單個語句中的所有記錄?像這樣運行一次:

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

  2. 查詢一次對每個5位郵政編碼的?事情是這樣的運行800次:

    SELECT * FROM ZIPCODE WHERE ZIP5 =:1

  3. 一些批量大小在兩者之間?

您是怎麼想的?爲什麼?如果你處於思考的心情,一些[可選的]後續想法:

  • 我們可以運行哪些測試來驗證您的想法?
  • 最佳方法是否隨着卷的變化而變化(例如,如果我們有100個9位郵政編碼映射到10個5位郵政編碼,尋找其中3個)?
  • 對於吸收查詢結果的應用程序服務器而言,數據庫的最佳效果與最佳效果不同?

回答

4

讓數據庫服務器決定如何處理它。即使它在內部執行了800次查詢,它仍然會更快。它只能解析查詢一次,並且只能發送一次結果。

因此,使用SELECT * FROM ZIPCODE WHERE ZIP5 IN (:1, :2,... :800)

+4

+1需要注意的是,IN列表最多隻能有1000個項目。如果你已經達到800,那對我的喜好來說有點太近了。 將列表粘貼到另一個表(全局臨時表?)並執行SELECT * FROM ZIPCODE WHERE ZIP5 IN(SELECT ZIP5 FROM ...) – 2010-07-08 22:57:38

+0

我喜歡這個答案。 Oracle優化器比我們所有人都更聰明。通常... – 2010-07-09 05:12:04

+0

加里的答案+1。從表格中選擇比列表中的800更快。 – Rene 2010-07-09 08:33:31

2

你必須創建一個外部表的選項?即,

CREATE TABLE zip5 (zip5 varchar2(5)) 
ORGANIZATION EXTERNAL 
(
    TYPE ORACLE_LOADER 
    DEFAULT DIRECTORY <some oracle DIRECTORY object> 
    LOCATION (<yourDirectory>:'zip5 filename.txt' 
) 

將通過您的Oracle目錄對象指定的OS目錄中zip5文本文件, 然後執行:

SELECT * FROM zipcode JOIN zip5 ON (zipcode.zip5 = zip5.zip5); 

這是不是每次你ZIP5重建查詢更通用的解決方案列表更改。

相關問題