一天加载不到一分钟,一个月加载需要几个小时的表变量

问题描述 投票:0回答:1

一天负载使用需要5分钟。我改为参数化存储过程,按执行计划的建议应用索引,一天下降到47秒,但一个月永远加载。可能是什么问题呢?平均每日负荷约为50,000行。

USE [DBl]

--[dbo].[ClosedOrder] StartDate, '@EndDate'
ALTER PROCEDURE [dbo].[ClosedOrders] 
 ( @StartDate DATETIME 
  ,@EndDate  DATETIME
 )
AS




 DECLARE @temp_dec DECIMAL(15,2) = 0.00
 DECLARE @temp_int int     = NULL
 DECLARE @temp_str nvarchar(60)  = NULL
 DECLARE @temp_date Date    = NULL
-- Michael Xia changes temp table to table variable on 05/24/2016
DECLARE @lines TABLE
 (
  SalesOrderID nvarchar (20),
  SalesOrderLine smallint,
  CustomerID_SoldTo nvarchar (14),
  OrderDate date,

  )


INSERT INTO @lines
SELECT

-- multiple sub queries like below              
 , (SELECT TOP 1 CAST(sh.ship_date AS DATE)
   FROM dbl.dbo.[Shipments] sh  (NOLOCK)
  WHERE sh.co_num = coi.co_num AND sh.co_line = coi.co_line
    AND sh.shipped=3
  ORDER BY sh.ship_date DESC)               'DateLastShipped'


 ---multiple update to the table variable using scalar function like below
UPDATE @lines
 SET __ServiceLevelDays = CASE
        WHEN ScheduledToShipDate = ShipNoLaterThanDate THEN 1
        ELSE [dbl].[dbo].GetNumberOfBays(SchlShipDate,ShipNoLaterThanDate,1) + 1
           END


TRUNCATE TABLE [DBL].[dbo].[ClosedOrder]

INSERT INTO [DBL].[dbo].[ClosedOrder]

(

)

SELECT 
 *
FROM @lines


END
sql sql-server tsql
1个回答
1
投票

因为,每日加载需要几秒钟(确切地说是47秒),您需要通过创建临时表来修改每月负载,存储所有日期然后创建循环并添加每天应该花费几分钟(47秒) * 30次)间接地,在写入数据库之前减少内存中的总行数。希望有所帮助。

© www.soinside.com 2019 - 2024. All rights reserved.