SQL Server:使用 IN 子句很慢

彌迦蒙托亞

我正在創建一個臨時表,其中填充了特定用戶的前 25 個項目。然後我使用這個臨時表從另一個表中獲取這些項目的所有部分。

這些是我的步驟:

DECLARE @tableIds TABLE (id uniqueidentifier)

INSERT INTO @tableIds
    SELECT TOP 25 I.Id
    FROM Items I 
    INNER JOIN UserItems UI ON I.Id = UI.UserId
    WHERE UI.UserId = 'b846371d-5afc-eb11-b563-0003ff2a40c4'
      AND I.Valid = 1
    ORDER BY I.[TimeStamp] DESC 

現在,當我使用 id 上的 IN 子句對物品進行查詢時,查詢速度非常慢。運行時間超過 2 分鐘並導致應用程序超時。itempieces表中只有1700個相關行,但總共有超過200萬行。查詢是這樣的:

SELECT 
    IPs.Id, 
    IPs.ItemId, 
    IPs.[Name], 
    IPs.PartNo, 
    IPs.PartPosition, 
    IPs.Size,
    IPs.Step
FROM
    ItemPieces IPs
WHERE 
    Ips.ItemId IN (SELECT id FROM @tableIds)

我考慮過使用並嘗試了EXISTS許多示例後子句,但我很難弄清楚如何讓它工作並返回相關結果。相反,它返回了所有內容,而不僅僅是相關的行。

我該如何寫這個以便我只獲得相關的行但它也很快?

謝謝

肖恩·朗

我會重新設計它以使用內部連接到您的有限值列表。使用您的兩個查詢,它會是這樣的。

SELECT IPs.Id, 
    IPs.ItemId, 
    IPs.[Name], 
    IPs.PartNo, 
    IPs.PartPosition, 
    IPs.Size,
    IPs.Step
FROM ItemPieces IPs
inner join 
(
    SELECT TOP 25 I.Id
    FROM Items I INNER JOIN
    UserItems UI on I.Id = UI.UserId
    WHERE UI.UserId = 'b846371d-5afc-eb11-b563-0003ff2a40c4'
    AND I.Valid = 1
    ORDER BY I.[TimeStamp] DESC 
) x on x.id = IPs.ItemId

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章