SQL Server索引计算的列,该列对另一个表进行求和

时间:2014-05-08 11:24:10

标签: sql-server ef-code-first azure-sql-database calculated-columns indexed-view

我想有效地添加一个计算列,该列对另一个表中选定行的列进行求和。我需要快速检索并搜索计算列中的值,而无需重新计算总和。

我想添加的计算列在Dream-SQL中看起来像这样:

ALTER TABLE Invoices ADD Balance
AS SUM(Transactions.Amount) WHERE Transactions.InvoiceId = Invoices.Id

当然,这不起作用。我的理解是您无法添加引用另一个表的计算列。但是,索引视图似乎可以包含这样的列。

该项目基于实体框架代码优先。应用程序需要快速找到非零余额。

假设索引视图是要走的路,将它与Invoices和Transactions表集成的最佳方法是什么,以便与LINQ to Entities一起使用?索引视图是否应包含“发票”表中的所有列,还是仅包含“余额”(保留的内容)?用于创建推荐视图和索引的SQL代码片段会很有帮助。

1 个答案:

答案 0 :(得分:2)

索引视图不起作用,因为它只会对GROUP BY子句中的表达式进行索引,这意味着它无法对总和进行索引。计算列不起作用,因为总和不能保留或编入索引。

然而,触发器有效:

CREATE TRIGGER UpdateInvoiceBalance ON Transactions AFTER INSERT, UPDATE AS
    IF UPDATE(Amount) BEGIN
        SET NOCOUNT ON;
        WITH InvoiceBalances AS (
            SELECT Transactions.InvoiceId, SUM(Transactions.Amount) AS Balance
            FROM Transactions
            JOIN inserted ON Transactions.InvoiceId = inserted.InvoiceId
            GROUP BY Transactions.InvoiceId)
        UPDATE Invoices
            SET Balance = InvoiceBalances.Balance
            FROM InvoiceBalances
            WHERE Invoices.Id = InvoiceBalances.InvoiceId
    END

Balance列提供默认值0也很有帮助,因为当您将其标记为DatabaseGeneratedOption.Computed时,EF在添加发票行时不会为其提供任何值。