sql-server - 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'
如果可以使用连接或其他功能以更好的方式完成此操作,我正在寻找一些专家建议。
解决方案
你尝试过这样的事情吗?
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'
在连接字段上添加索引也应该可以提高性能
推荐阅读
- python - python data handling with mismatching fields in each line
- android - How to properly support different units in Room Database?
- python - Altering the data format in the list
- javascript - 使绝对定位的 div 覆盖视口
- python - Scikit Learn - 具有 KFold 交叉验证的决策树
- java - How to get my Java 'if' statement to work?
- javascript - How to make "big" rollover images that don't move the other adjacent items in the layout?
- python - Iterate a list based on the elements of another in python
- c++ - Comparison operator for std::optional enum
- operators - 表达式和交换性的 Julia-lang 比较