比方說,我有一個包含4位郵政編碼的40MM 9位郵政編碼的Oracle數據庫表。我有一個800個5位郵政編碼的清單,我需要找到所有相關的9位郵政編碼。共有40K 5位郵政編碼。假設我們用B *樹(傳統)索引爲5位郵政編碼字段建立索引。考慮到數據庫性能和可擴展性,最好的方法是:查詢性能,多個「OR's」與單獨的語句
查詢單個語句中的所有記錄?像這樣運行一次:
SELECT * FROM ZIPCODE WHERE ZIP5 IN(:1,:2,...:800)
查詢一次對每個5位郵政編碼的?事情是這樣的運行800次:
SELECT * FROM ZIPCODE WHERE ZIP5 =:1
一些批量大小在兩者之間?
您是怎麼想的?爲什麼?如果你處於思考的心情,一些[可選的]後續想法:
- 我們可以運行哪些測試來驗證您的想法?
- 最佳方法是否隨着卷的變化而變化(例如,如果我們有100個9位郵政編碼映射到10個5位郵政編碼,尋找其中3個)?
- 對於吸收查詢結果的應用程序服務器而言,數據庫的最佳效果與最佳效果不同?
+1需要注意的是,IN列表最多隻能有1000個項目。如果你已經達到800,那對我的喜好來說有點太近了。 將列表粘貼到另一個表(全局臨時表?)並執行SELECT * FROM ZIPCODE WHERE ZIP5 IN(SELECT ZIP5 FROM ...) – 2010-07-08 22:57:38
我喜歡這個答案。 Oracle優化器比我們所有人都更聰明。通常... – 2010-07-09 05:12:04
加里的答案+1。從表格中選擇比列表中的800更快。 – Rene 2010-07-09 08:33:31