Нужна помощь в оптимизации моей хранимой процедуры - PullRequest
0 голосов
/ 26 сентября 2019

Мне нужна помощь в оптимизации моей хранимой процедуры.Это для нашей таблицы фактов, и в настоящее время хранимая процедура усекает таблицу, а затем загружает данные обратно. Я хочу избавиться от усечения и вместо этого добавлять новые строки или удалять строки с помощью столбца last_update, который в настоящее время не существует.Также есть таблица last_update с одним столбцом, которая изменяется при каждом запуске хранимой процедуры, но я бы предпочел, чтобы last_update был столбцом в самой таблице, а не отдельным столбцом.

У меня естьсоздал триггер, который должен обновлять столбец last_updated с текущей датой при запуске хранимой процедуры, но я также хотел бы избавиться от усечения и вместо этого добавлять и удалять строки.То, как хранимая процедура в настоящее время структурирована, мешает мне понять, как лучше всего это сделать.

Хранимая процедура начинается с добавления данных в 2 временные таблицы, затем добавляет данные из двух временных таблиц в 3-ю временную таблицу, затем усекает текущую FACT TABLE, а затем 3-я временная таблица, наконец, вставляется в FACT.Таблица.

--CLEAR LAST UPDATE TABLE
TRUNCATE TABLE ADM.LastUpdate;

--SET NEW LAST UPDATE TIME
INSERT INTO ADM.LastUpdate(TABLE_NAME, UPDATE_TIME)
VALUES('FactBP', CONVERT(VARCHAR, GETDATE(), 100)+' (CST)');

--CHECK TO SEE IF TEMP TABLES EXISTS THEN DROP
IF OBJECT_ID('tempdb.dbo.#TEMP_CARTON', 'U') IS NOT NULL
    DROP TABLE #TEMP_CARTON;

IF OBJECT_ID('tempdb.dbo.#TEMP_ORDER', 'U') IS NOT NULL
    DROP TABLE #TEMP_ORDER;

--CREATE TEMP TABLES
SELECT *
INTO #TEMP_CARTON
FROM [dbo].[FACT_CARTON_V];

SELECT *
INTO #TEMP_ORDER
FROM [dbo].[FACT_ORDER_V];

--CHECK TO SEE IF DATA EXISTS IN #TEMP_CARTON AND #TEMP_ORDER
IF EXISTS(SELECT * FROM #TEMP_CARTON)
    AND EXISTS(SELECT * FROM #TEMP_ORDER)

--CODE HERE joins the data from #TEMP_CARTON and #TEMP ORDER and puts it into a 3rd temp table #TEMP_FACT.


--CLEAR ALL DATA FROM FACTBP
TRUNCATE TABLE dbo.FactBP;

--INSERT DATA FROM TEMP TABLE TO FACTBP
INSERT INTO dbo.FactBP
SELECT 
[SOURCE]
      ,[DC_ORDER_NUMBER]
      ,[CUSTOMER_PURCHASE_ORDER_ID]
      ,[BILL_TO]
      ,[CUSTOMER_MASTER_RECORD_TYPE]
      ,[SHIP_TO]
      ,[CUSTOMER_NAME]
      ,[SALES_ORDER]
      ,[ORDER_CARRIER]
      ,[CARRIER_SERVICE_ID]
      ,[CREATE_DATE]
      ,[CREATE_TIME]
      ,[ALLOCATION_DATE]
      ,[REQUESTED_SHIP_DATE]
      ,[ADJ_REQ_SHIP]
      ,[CANCEL_DATE]
      ,[DISPATCH_DATE]
      ,[RELEASED_DATE]
      ,[RELEASED_TIME]
      ,[PRIORITY_ORDER]
      ,[SHIPPING_LOAD_NUMBER]
      ,[ORDER_HDR_STATUS]
      ,[ORDER_STATUS]
      ,[DELIVERY_NUMBER]
      ,[DCMS_ORDER_TYPE]
      ,[ORDER_TYPE]
      ,[MATERIAL]
      ,[QUALITY]
      ,[MERCHANDISE_SIZE_1]
      ,[SPECIAL_PROCESS_CODE_1]
      ,[SPECIAL_PROCESS_CODE_2]
      ,[SPECIAL_PROCESS_CODE_3]
      ,[DIVISION]
      ,[DIVISION_DESC]
      ,[ORDER_QTY]
      ,[ORDER_SELECTED_QTY]
      ,[CARTON_PARCEL_ID]
      ,[CARTON_ID]
      ,[SHIP_DATE]
      ,[SHIP_TIME]
      ,[PACKED_DATE]
      ,[PACKED_TIME]
      ,[ADJ_PACKED_DATE]
      ,[FULL_CASE_PULL_STATUS]
      ,[CARRIER_ID]
      ,[TRAILER_ID]
      ,[WAVE_NUMBER]
      ,[DISPATCH_RELEASE_PRIORITY]
      ,[CARTON_TOTE_COUNT]
      ,[PICK_PACK_METHOD]
      ,[RELEASED_QTY]
      ,[SHIP_QTY]
      ,[MERCHANDISE_STYLE]
      ,[PICK_WAREHOUSE]
      ,[PICK_AREA]
      ,[PICK_ZONE]
      ,[PICK_AISLE]
      ,EST_DEL_DATE
FROM #TEMP_FACT;

В настоящее время, так как я добавил столбец last_updated в свой FACT TABLE и создал триггер, я фактически не передаю никакого значения через хранимую процедуру для него, поэтому я получаю ошибку

Имя объекта или столбца отсутствует или пусто.

Я не уверен, куда я должен передать какое-либо значение для столбца LAST_UPDATED.

Вот триггер, который я создал для обновления last_updated колонка:

CREATE TRIGGER last_updated
ON dbo.factbp
AFTER UPDATE 
AS
    UPDATE dbo.factbp
    SET last_updated = GETDATE()
    FROM Inserted i
    WHERE dbo.factbp.id = i.id

1 Ответ

0 голосов
/ 26 сентября 2019

Первое, что я бы попробовал, это создать первичные ключи для двух временных таблиц #TEMP_CARTON и #TEMP_ORDER и использовать команду intersect для получения строк, общих для обеих таблиц:

select * from  #TEMP_CARTON
intersect
SELECT * FROM #TEMP_ORDER
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...