我是否可以使用此语句进行任何优化以获取已使用行的计数。
注意:ProductOrderInfo表中有超过4000万行。
SELECT @TotalUsed = COUNT(*)
FROM ProductInfo WITH (NOLOCK)
WHERE ProductInfoId IN
(
SELECT ProductInfoId FROM ProductOrderInfo WITH (NOLOCK)
);
答案 0 :(得分:2)
使用JOIN进行此类查询:
SELECT @TotalUsed = COUNT(DISTINCT i.ProductInfoId)
FROM ProductInfo i WITH (NOLOCK)
JOIN ProductOrderInfo oi WITH (NOLOCK)
ON io.ProductInfoId = i.ProductInfoId
表格应该包含这些列的索引以便快速搜索。
答案 1 :(得分:1)
试试这个
SELECT @TotalUsed = COUNT(*) FROM ProductInfo WITH (NOLOCK) as p
WHERE EXISTS ( SELECT ProductInfoId FROM ProductOrderInfo WITH (NOLOCK)
WHERE ProductInfoId =p.ProductInfoId );
答案 2 :(得分:1)
假设ProductOrderInfo上没有孤立ProductInfoId
,则以下内容:
SELECT @TotalUsed = COUNT(DISTINCT ProductInfoId)
FROM ProductOrderInfo WITH (NOLOCK);
可能更快,因为它只能访问一个表。
无论运行哪个查询,如果ProductOrderInfo上的ProductInfoID都有索引,它应该运行得更快。