洞我有一個表,看起來像這樣:優化慢速查詢找到序列
id | serial_number_basic | product_id
-------------------------------------
的serial_number_basic是一個流水號,其每次需要一個新的數字一次計數。過去有可能將此號碼的整個範圍留空,並且下一個號碼是MAX() + 1
。
由於要求的變化,現在應該填補空洞。 serial_number_basic當然取決於product_id。每個產品都有自己的serial_number_basics序列。問題是要找到漏洞。
此查詢確實發現根據每個的[ProductID]孔,但不幸的是它是太慢:
SELECT (
MIN(serial_number_basic) + 1
) as next_available_box
FROM (
SELECT DISTINCT t0.serial_number_basic, t1.serial_number_basic AS number_plus_one
FROM (SELECT * FROM conv WHERE product_id = [productid]) AS t0
LEFT JOIN
(SELECT * FROM conv WHERE product_id = [productid]) AS t1
ON t0.serial_number_basic + 1 = t1.serial_number_basic
) AS sub
WHERE number_plus_one IS NULL;
當間隙填滿了,會發生什麼> – dkretz
請注意,除非你是ocasionally消毒這個值,它可能仍然是可能的縫隙悄悄放回序列;這類問題通常與回滾事務有關,所以這可能不是一個大問題。 –
@Exceptiondev:你有'(product_id,serial_number_basic)'上的索引嗎? –