首页 > 解决方案 > 查询调优和优化

问题描述

我是 TSQL 的初学者。这是问题。如何优化下面的查询并缩短执行时间?该 SP 在光标内执行,但只允许修改该部分。我正在考虑使用临时表。谢谢

    CREATE PROCEDURE dbo.GetProductFromHistory 
    @ProductID INT
AS
BEGIN
    DECLARE @Result TABLE(
        PurchaseOrderNumber NVARCHAR(25),
        TransactionID INT
    )

    INSERT INTO @Result(PurchaseOrderNumber, TransactionID)
    SELECT soh.PurchaseOrderNumber, th.TransactionID
    FROM Production.TransactionHistory th
    INNER JOIN Sales.SalesOrderHeader soh on th.ReferenceOrderID = soh.SalesOrderID
    WHERE th.ProductID = @ProductID;

END

GO

标签: sqlsql-servertsqlquery-optimizationdatabase-performance

解决方案


你无能为力。在游标循环中运行 SP 完全不是你这样做的方式,并且会使事情变得非常缓慢,但你按照自己的话来说是不允许改变这个事实的。

假设您有一个 ID 并且还定义了输出 - 这是一个很简单的 select 语句,并且您无法在此代码上进行任何优化。显然,两个相关字段(th.ProductID 和 th.ReferenceOrderID 和 soh.SalesOrderID)上都应该有一个索引,但话又说回来,这不是查询的一部分(但我通常经常看到的错误)。

这里的症结在于,将这个 SP 放在循环中是让它变慢的原因,而不是你拥有的小代码。


推荐阅读