【发布时间】:2021-06-10 11:54:57
【问题描述】:
存储过程返回结果的时间过长,我想提高存储过程的性能。但我不确定问题到底发生在哪里。任何人都可以通过在 EXISTS 子句之后重写子查询来提供帮助。
仅供参考,这些表有数十万条记录
DECLARE @InvNo VARCHAR(MAX) = NULL,
SELECT @InvNo='123'
DECLARE @tblInv TABLE (RowID INT IDENTITY(1,1) PRIMARY KEY CLUSTERED,
InvNo VARCHAR(MAX))
IF @InvNo IS NOT NULL
INSERT INTO @tblInv(InvNo)
SELECT value
FROM STRING_SPLIT(@InvNo,',')
select * from table1 t
where (@InvNo IS NULL
OR EXISTS (SELECT 1
FROM @tblInv i
INNER JOIN table2 inv
ON inv.inv_no = i.InvNo OR ISNULL(inv.alt_inv_no,'@@') = i.InvNo
INNER JOIN table3 isp
ON isp.inv_no = inv.inv_no
INNER JOIN table4 ic
ON ic.inv_no = inv.inv_no
WHERE isp.bl_no = t.bl_no
AND ic.cust_code = t.cust_code)
)
【问题讨论】:
-
我们仍然缺少我们在您的last question 中询问您的执行计划。另外,什么是“十万”?
-
问题可能是子查询中的
OR。 -
OR ISNULL(inv.alt_inv_no,'@@')不会是 SARGable。使用IS NULL和IS NOT NULL正确处理您的NULL值。你真的也需要EXISTS中的所有JOIN吗? -
@Larnu 是的,我真的需要那些 JOINS。如果 InvNo 具有单个值或无值,则删除 OR 并添加一个额外的 EXISTS 似乎对我有用。对于逗号分隔的值,查询再次变慢了。。
-
请记住,我们大多数不是来自印度的人都不知道“lac”是什么。
标签: sql sql-server stored-procedures query-optimization