SQL 服务器 - 数据量巨大时使用 IN 运算符的查询性能

SQL Server - Performance of query while using IN operator when data is huge

我有一个以 VendorId 作为参数的查询,它应该 return 该供应商的所有处于 'Approved' 状态并且还具有有效注册表项的电子产品。

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

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

的性能
IN (SELECT RegistryEntry FROM tblRegistries WHERE StatusId = 2)

因为在生产环境中 tblRegistries 中有很多数据 table 当我说

SELECT RegistryEntry FROM tblRegistries WHERE StatusId = 2

它 return 有数十万条记录

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'

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

你试过这样的东西吗?

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'

同时在连接字段上添加索引应该会提高性能

我发现 exists 经常运行得更快...

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