洞我有一个表,看起来像这样:优化慢速查询找到序列
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)'上的索引吗? –