簡體   English   中英

“在哪里”條款的實際限制

[英]Practical limit on “where in” clause

我有一個相當簡單的表,大約有一百萬行。

id  |  my_col  |  other1  |  other 2 | ...

此表中有大約 15k 個不同的 my_col 值,並且我在 my_col 上有一個索引。 我有一組需要從該表中刪除的 7k my_col 值。

在 SQL 中做什么更有效(我目前正在使用 MySQL,但將來可能會移植到 MS SQL)。

是不是 a) 在我的 java 應用程序代碼中,遍歷所有 my_col 值並調用 sql 刪除每個值。

for (String my_colValue : listMyCol) {
   [delete from my_table where my_col = my_colValue]
}

或 b) 使用“where in”子句構建包含所有這些值的單個 SQL [大] 語句?

delete from my_table where my_col in ('aaa', 'aab', 'aac', ...)

我猜它是 b),但我不確定在這個“where in”子句中指定大約 7k 值是否會變得低效。

就其價值而言,我的應用服務器和數據庫服務器都托管在 Amazon 中,但位於不同的層級。

c) 重新創建您的表。

您將刪除一半的行,所以請考慮一下。 雖然 a) 和 b) 可能會花費很長時間,但重新創建您的表會更棘手但很快。

而且您需要將 7k 值加載到臨時表中,這很容易:

CREATE TABLE newMyTable
AS
SELECT myTable.*
FROM myTable
    INNER JOIN myValues
        ON myTable.my_col = myValues.my_col

或者如果你不能創建表,也許這會足夠快:

DELETE FROM myTable t
WHERE EXISTS
(
    SELECT *
    FROM myValues v
    WHERE t.my_col = v.my_col
)

但是您需要記住的唯一一件事是:您必須創建一個包含 7k 值的表。

使用WHERE IN的真正實際限制是您可以使您的 SQL 查詢有多大。 這是由 MySQL 的max_packet_size配置變量定義的。 其他任何事情都只是性能權衡。 要找出最有效的方法,基准測試仍然是最好的。

我會選擇 go,但我會將所有內容都放在事務中。 這樣,提交將出現在最后,而不是在每個 DELETE 語句之后。

搜索許多記錄時,索引變得低效。

暫無
暫無

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

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