使用文本文件中的數據查詢數據庫的有效方法
我已經設置了一個 oracle 數據庫,並希望在收到文本文件中的數據後查詢它。文本文件中存在的產品名稱數量約為一百萬。
經過大量搜尋後,我發現了兩種相同的方法,但我不確定哪種方法更有效。
- 使用 SQL 載入器將數據載入到表中,然後使用 where in 或 join 進行查詢
- 在循環中查詢每個產品名稱的數據庫。
第二個選項是一個考慮因素,因為我認為插入(使用載入器)+選擇將比僅選擇更昂貴。
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。