Oracle

使用文本文件中的數據查詢數據庫的有效方法

  • February 12, 2020

我已經設置了一個 oracle 數據庫,並希望在收到文本文件中的數據後查詢它。文本文件中存在的產品名稱數量約為一百萬。

經過大量搜尋後,我發現了兩種相同的方法,但我不確定哪種方法更有效。

  1. 使用 SQL 載入器將數據載入到表中,然後使用 where in 或 join 進行查詢
  2. 在循環中查詢每個產品名稱的數據庫。

第二個選項是一個考慮因素,因為我認為插入(使用載入器)+選擇將比僅選擇更昂貴。

PS:我寧願減少數據庫伺服器上的負載,也不願減少時間。

文件內容類似於:

ABC
BCD
FGS
LTB
.
.
NHL

我必須查詢 db 作為

選項1:

Run a sqlloader on file products.txt and load contents into TMPTABLE.
SELECT PRICE FROM PRICEMAP WHERE PRODUCT_NAME IN (SELECT PRODUCT_NAME FROM TMPTABLE);

選項 2:

Foreach $productname in products.txt:
   SELECT PRICE FROM PRICEMAP WHERE PRODUCT_NAME IN=$productname

每台伺服器都不同,但您可能會驚訝於查詢一百萬行的速度有多快。您是將數據插入表中,還是只是嘗試查詢它?

如果您只是嘗試查詢文件但不需要將數據儲存在數據庫中,則可以將其插入臨時表並對其執行查詢。

如果您要將文件插入表中,我會選擇您的第一個選項。與執行 100 萬個查詢相比,一個查詢對伺服器造成的負載會更少(如果我理解正確的話)。在不知道您的查詢的情況下,我對性能/負載無能為力。它可能不適用,但 UNION 通常比 JOIN 快。只是要記住其他一些事情。

(對不起,沒有評論,我還沒有代表)

選項 1 肯定比選項 2 好得多。選項 2 將對 PRICEMAP 表進行 1mio 單行訪問,而選項 1 將實現為普通連接:查詢優化器會將您的查詢扁平化為連接。根據表的大小,這將是嵌套循環(以 TMPTABLE 作為驅動表)或散列連接(可能是因為您完全匹配兩個表)。

實際上有一個選項 3:它與選項 1 類似,只是文件被定義為外部表。這意味著將使用相同的查詢,但 TMPTABLE 確實指向您的文本文件。它將節省您將數據載入到數據庫中的時間——儘管那個時間可能很短。我會在現代硬體上最多說幾分鐘。

在此處閱讀有關外部表的資訊:https ://docs.oracle.com/en/database/oracle/oracle-database/19/sutil/oracle-external-tables.html

外部表是一種非常強大的機制。他們可以從各種來源讀取數據,包括 HDFS 或 HIVE。

引用自:https://dba.stackexchange.com/questions/259442