2

我通过以下方式创建了一个 Sql 动态查询(我正在使用存储过程),但我想知道,与我们以字符串形式执行的动态查询相比,它是否有任何性能下降。sp_Executesql sp

SELECT   *
FROM CityToCityTransferPricing as ctp
INNER JOIN VehicleDynamicPackage as vdp on ctp.vehicleId=vdp.vehicleId
INNER JOIN VehicleType as vt on vdp.vehicleTypeId=vt.vehicleTypeId
WHERE cityToCityTransferID=@cityToCityTransferID 
    AND (
        @vehicleID is null 
        OR ctp.vehicleId=@vehicleID
    )       
    AND (
        @status is null 
        OR ctp.status=@status
    )
4

4 回答 4

1

在一般情况下,使用动态查询时,您不会看到明显的性能下降。

还看到这个 -

SELECT * 
FROM dbo.CityToCityTransferPricing ctp 
JOIN dbo.VehicleDynamicPackage vdp ON ctp.vehicleId = vdp.vehicleId 
JOIN dbo.VehicleType vt ON vdp.vehicleTypeId = vt.vehicleTypeId
WHERE cityToCityTransferID = @cityToCityTransferID
    AND ISNULL(@vehicleID, ctp.vehicleId) = ctp.vehicleId
    AND ISNULL(@status, ctp.[status]) = ctp.[status]
于 2013-05-29T06:34:14.577 回答
1

没有适用于所有情况的通用答案。您可以做的最好的事情是检查执行计划并亲自查看。我同意德瓦特的观点,在大多数情况下,您可能不会注意到任何差异。

这是关于动态 sql 的好读物:http: //www.sommarskog.se/dynamic_sql.html

于 2013-05-29T08:33:37.170 回答
1

您必须知道动态 SQL 总是会被重新编译。所以在性能方面这不是一件好事。在这种情况下,您可能不会注意到它,但我仍然会选择最佳实践,而不是使用动态 sql。

此外,如果您真的必须使用动态查询,您还可以查看 sp_executesql 与 EXEC。EXEC 还将始终为您提供新的查询计划(无缓存),其中 sp_executesql 第一次编译查询并第二次重用其计划。

于 2013-05-29T08:46:06.853 回答
0

如果您使用 parameterized sp_execute_sql,则没有太大区别。但是,如果您正在动态生成动态字符串然后执行它,则可能会对性能产生影响。请看以下链接:动态 SQL 性能比较

于 2013-12-10T04:12:21.443 回答