持久计算列是否需要更新所有行或仅受影响的行?

时间:2015-05-29 17:27:39

标签: sql-server performance sql-server-2008-r2 calculated-columns

在此Stackoverflow article中,我了解Persist的含义及其优缺点。但是,我试图进行更深入的研究,但无法找到关于"更新"之一。

这是我的场景(TL;下面的DR版本):我有Order表和OrderDetail表,如下图所示:

enter image description here

OrderDetail.Subtotal是一个计算列,使用这个简单的公式:([Price]*[Quantity])

Order.Total是一个计算列,使用以下公式:([dbo].[CalculateOrderTotal]([ID])),这是函数:

ALTER FUNCTION [dbo].[CalculateOrderTotal]
(
    @orderID int
)
RETURNS int
AS
BEGIN
    DECLARE @result int;

    SELECT @result = SUM(od.Subtotal)
    FROM OrderDetail od
    WHERE od.OrderID = @orderID;

    RETURN @result;
END

TL; DR :我的OrderOrderDetail经常更新,但主要是INSERTING。我也需要经常查询,但不像插入那么频繁。如果我将SubtotalTotal检查为Persist,因为大多数操作都不会影响行的Subtotal字段,SQL Server是否知道它这样数据库只需要更新受影响的记录,或者它必须重新计算Order表的所有记录?是好还是坏?

P.s:我正在使用SQL Server 2008以防万一。

1 个答案:

答案 0 :(得分:1)

计算列在选择时计算  当计算它们的表达式发生变化时,将计算持久列 因此,对于选择性能,我建议使用持久性,但对于存储空间不要使用持久性,因为"常规"计算列实际上并未存储在数据库中。