Mysql

我什麼時候需要在 MySQL 儲存過程中 DEALLOCATE 準備好的語句?

  • July 10, 2021

我的問題很簡單。在什麼情況下最好釋放準備好的語句,從而將其從記憶體中刪除,在什麼情況下最好將其保留在記憶體中?

我編寫了一個使用兩個準備好的語句的儲存過程。前幾行之一是像這樣準備語句:

PREPARE selectStatementByJournalEntryAndLanguageQuery
FROM "INSERT INTO results(id, content, title, language_id, journalentry_id)
    SELECT *
    FROM JournalEntryTitleAndContent jetc
    WHERE jetc.language_id = ?
          AND jetc.journalentry_id = ?
    LIMIT 1";

PREPARE selectStatementByJournalEntryQuery
FROM "INSERT INTO results(id, content, title, language_id, journalentry_id)
    SELECT * FROM JournalEntryTitleAndContent jetc
    WHERE jetc.journalentry_id = ?
    LIMIT 1";

現在這個儲存過程和這些準備好的語句一天可以被許多使用者多次使用。在這種情況下,最好不要同時呼叫DEALLOCATE兩個準備好的語句,對嗎?因為這樣準備好的語句保留在記憶體中,當其他人使用儲存過程時不必重新編譯。

但這引發了關於這兩條PREPARE語句的問題。如果我沒有在最後釋放準備好的語句並且其他人啟動了儲存過程,那麼數據庫是否會PREPARE再次嘗試準備好的語句,或者當它檢測到這些準備好的語句已經在另一個過程中準備好時它會忽略這兩個程式碼行數據庫儲存過程查詢會話?

謝謝你。

[ https://dev.mysql.com/doc/refman/8.0/en/sql-prepared-statements.html]說:

準備好的語句特定於創建它的會話。如果您終止會話而不釋放先前準備的語句,則伺服器會自動釋放它。

準備好的語句對於會話也是全域的。如果在儲存常式中創建準備好的語句,則在儲存常式結束時不會釋放它。

為防止同時創建太多準備好的語句,請設置 max_prepared_stmt_count 系統變數。要防止使用準備好的語句,請將值設置為 0。

我會注意執行 DEALLOCATE,除非我有大量接近最大值的準備好的語句(在 MySQL 8.0 中預設為 16382)。

https://dev.mysql.com/doc/refman/8.0/en/prepare.html:說:

如果已存在具有給定名稱的預準備語句,則在準備新語句之前將其隱式釋放。

因此它將再次執行,但之前執行 DEALLOCATE:因此在同一會話中不會有任何重複的準備好的語句。

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