首页 > 解决方案 > SQL Server - 当数据很大时使用 IN 运算符时的查询性能

问题描述

我有一个以 VendorId 作为参数的查询,它应该返回该供应商处于“已批准”状态并且还具有有效注册表项的所有电子产品。

问题是许多产品都有 RegistryEntry 来检查该产品的 RegistryEntry 是否有效我需要检查 tblRegistries 表的 StatusId=2 这意味着它是一个有效的键。

下面的查询工作正常,我担心使用

IN (SELECT RegistryEntry FROM tblRegistries WHERE StatusId = 2)

因为在 prod 环境中,tblRegistries 表中有很多数据,当我说

SELECT RegistryEntry FROM tblRegistries WHERE StatusId = 2

它返回数十万条记录

SELECT * FROM [dbo].[Product] P
INNER JOIN [dbo].[ElectronicProduct] EP
ON P.ProductId = EP.ProductId
WHERE P.VendorId = @VendorId
AND P.[RegistryEntry] IN (SELECT RegistryEntry FROM tblRegistries WHERE StatusId = 2) AND EP.Status = 'Approved'

如果可以使用连接或其他功能以更好的方式完成此操作,我正在寻找一些专家建议。

标签: sql-serverstored-proceduresquery-performance

解决方案


你尝试过这样的事情吗?

SELECT * FROM [dbo].[Product] P
INNER JOIN [dbo].[ElectronicProduct] EP ON P.ProductId = EP.ProductId
INNER JOIN tblRegistries R ON R.RegistryEntry = P.RegistryEntry AND StatusId = 2
WHERE   P.VendorId = @VendorId
        AND EP.Status = 'Approved'

在连接字段上添加索引也应该可以提高性能


推荐阅读