簡體   English   中英

如何編寫可以有效處理大量記錄的查詢?

[英]How to write a query that will efficiently handle large amount of records?

假設我有一個具有十億條記錄的表X。

Table X

ProductID AccountID ContractID

ProductIDAccountID構成表X的組合鍵。

現在,在內存中,我有一個包含一百萬(ProductID,AccountID)對的映射(比如Java HashMap)。

我想創建一個文件,其中將包含該對的所有(產品ID,帳戶ID)以及相應的合同ID。

現在,我可以使用一個for循環,並且可以為每個表(ProductID,AccountID)查詢該表,但是那時我將不得不執行一百萬次,這實際上是低效的。

問題是,如何編寫查詢來有效地做到這一點? 還是完全可以編寫這樣的查詢? 還有其他出路嗎?

如果速度和效率很重要,那么在IN子句中具有一百萬個“聯合”或一百萬個項目的查詢將是不可接受的。

更具性能的解決方案是將ProductID / AccountID哈希映射批量插入到臨時表中,我們將其稱為#temp。 我將不描述批量插入,因為這取決於數據庫。 然后,您可以執行一個簡單的聯接查詢:

SELECT ProductID, AccountID, ContractID
FROM X
INNER JOIN #temp t ON t.ProductID = X.ProductID AND t.AccountID = X.AccountID

在不知道確切的SQL方言的情況下,我將執行INNER JOIN

SELECT ProductID, AccountID, ContractID
FROM X
INNER JOIN MemTable m ON m.ProductID = X.ProductID AND m.AccountID = X.AccountID

您現在已將Java添加為標簽,所以我是否認為該地圖位於Java應用程序之內? 如果是這樣,它將變得很困難-您實際上可能需要查詢數據庫一百萬次。

另一方面,您可以構造一個包含單個大型SQL語句的字符串,如下所示:

SELECT * FROM X WHERE ProductID IN (...) AND AccountID IN (...)

您的循環只需要填寫產品ID和帳戶ID的列表(以逗號分隔)。 然后,您一次發出該命令。 例如,假設兩個ID均為數字,則命令應如下所示:

SELECT * FROM X WHERE ProductID IN (1,2,3,4) AND AccountID IN (99,88,77)

編輯
請注意,我的最后建議可能存在以下缺陷(您必須確定這是否確實是您的問題):

假設您的地圖包含(1,99)和(3,77),但是在表X有其他記錄(1,77)和(3,99)。 我的查詢結果將是(1,99),(3、77),(1、77)和(3、99),因為這兩個ID都不被視為“實體”,而是被單獨對待。

因此,只要存在包含給定ProductID和AccountID的任意組合的行,它們就會被返回。

假設您正在使用的數據庫系統允許這樣做,則可以將SELECT語句擴展為如下所示:

SELECT ProductID, AccountID, ContractID FROM X WHERE ProductID = <ValueFromMap> AND AccountID = <ValueFromMap>
UNION ALL
SELECT ProductID, AccountID, ContractID FROM X WHERE ...
UNION ALL
...

我猜您的內存映射在您的Java程序中? 如果是這樣,我認為沒有一個獨立於數據庫的有效解決方案。 我能想到的最好的辦法是嘗試在內存映射中查找連續的id范圍,以便您可以編寫SELECT FROM X,其中ID> = xx AND id <= yy,並避免選擇重復的ID。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM