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])
我有一个以 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])