优化使用多个临时表来连接和输出数据的存储过程

时间:2017-07-16 04:41:18

标签: sql sql-server stored-procedures database-design

我正在尝试优化存储过程以提高整体性能。目前,该设计具有多个临时表,最后一列用于在从中绘制数据的字段上执行聚合函数(如SUM)。

例如:

INSERT #TBL_Cancellations(currencyID, DateValue, Cancellations) 
    SELECT C.CurrencyID, C.Date, SUM(T.Amount) - SUM(T.Debit)
    FROM Currency C
    JOIN Transaction T ON C.CurrencyId = T.CurrencyId
    -- More conditions here . . .
    GROUP BY C.CurrencyId, C.Date

在其中一个临时表的最后一个字段上执行的一个聚合函数的示例如下所示:

SELECT DISTINCT 
    C.CurrencyCode 'Currency Code',
    C.ConversionRate 'Conversion Rate',
    R.Refunds,
    F.Fees 'Fees',
    D.Deposits 'Desposits'
    -- More here . . .
FROM 
    #TBL_Refunds (CurrencyID int, DateValue DATETIME, Refunds decimal(18,2)) R
LEFT JOIN 
    Currency C ON R.CurrencyID = C.CurrencyID
LEFT JOIN 
    #TBL_Fees F ON F.CurrencyID = C.CurrencyID
LEFT JOIN 
    #TBL_Deposits D ON D.CurrencyID = C.CurrencyID
-- More JOINS here. . .

最终选择输出每个临时表的聚合字段,并使用LEFT JOIN匹配每个临时表。

例如

List

有没有更好的设计来解决这个问题而不使用临时表?是否有更现代的方法来解决这个问题?

我对编写存储过程和SQL相对较新,所以任何帮助都会很棒。

谢谢!

2 个答案:

答案 0 :(得分:0)

我建议您在临时表上使用索引,因为最后您似乎只使用select查询来查找不同的记录。并确保最后您应该删除临时表或索引,因为下次他们将花费更多时间来重建索引。

我也不想使用create语句为临时表使用insert into statement。

确保您在执行这些聚合函数的列上有适当的索引

答案 1 :(得分:0)

什么表现不佳。马上我会:

  1. 您聚合为计算列的模型
  2. 在插页
  3. 上使用tablockx
  4. SELECT'DISTINCT' - 为什么?
  5. 所有LEFT OUTER JOINS - 这是必要的吗?
  6. 表中的任何CurrencyID都没有索引,就此而言
  7. 为什么这只是组合到一个表,或者表中的自然键在哪里?这些真的是1:1关系吗?