Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 优化使用多个临时表连接和输出数据的存储过程_Sql_Sql Server_Stored Procedures_Database Design - Fatal编程技术网

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

Sql 优化使用多个临时表连接和输出数据的存储过程,sql,sql-server,stored-procedures,database-design,Sql,Sql Server,Stored Procedures,Database Design,我正在尝试优化存储过程以提高总体性能。目前,该设计有多个临时表,最后一列设计用于对从中提取数据的字段执行聚合函数(如SUM) 例如: CREATE TABLE #TBL_Refunds (CurrencyID int, DateValue DATETIME, Refunds decimal(18,2)) CREATE TABLE #TBL_Fees (CurrencyID int, DateValue DATETIME, Fees decimal(18,2)) CREATE TABLE #

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

例如:

CREATE TABLE #TBL_Refunds (CurrencyID int, DateValue DATETIME, Refunds decimal(18,2))

CREATE TABLE #TBL_Fees (CurrencyID int, DateValue DATETIME, Fees decimal(18,2)) 

CREATE TABLE #TBL_Deposits (CurrencyID int, DateValue DATETIME, Deposits decimal(18,2)) 

CREATE TABLE #TBL_Cancellations (CurrencyID int, DateValue DATETIME, Cancellations decimal(18,2))        
对其中一个临时表的最后一个字段执行的聚合函数示例如下所示:

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
最终选择输出每个临时表的聚合字段,并使用左连接匹配每个临时表

例如

在不使用临时表的情况下,是否有更好的设计来解决此问题?有没有更现代的方法来解决这个问题

我对编写存储过程和SQL还比较陌生,所以任何帮助都会很好


谢谢

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

我也不希望对临时表使用create语句,而是使用insert into语句


确保在执行这些聚合函数的列上有适当的索引,这些聚合函数执行得不好。我马上会:

  • 将聚合为计算列的模型
  • 与插件上的tablockx一起使用
  • 选择“不同”-为什么
  • 所有左侧外部连接-是否有必要
  • 表中的任何CurrencyID都没有索引,因此
  • 为什么不合并到一个表中,或者表中的自然键在哪里?这真的是一对一的关系吗

  • 有没有更好的设计来解决这个问题
    -哪个问题?您的SQL语句没有描述任何可能的性能问题。优化的关键是分析瓶颈。你有没有察觉到有人在闹哄哄的
    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. . .