2016-07-29 64 views
0

我正在使用這兩個查詢將數據首先插入事務轉儲中的事務精製表中,然後刪除可能的重複項。TSQL插入和刪除重複項以提高查詢性能

INSERT INTO [dbo].[Transactions_Refined] 
    SELECT 
     Client_ID, 
     Customer_ID, 
     Transaction_ID, 
     SUM(try_parse(value_sold AS numeric(18,2))) AS value_sold, 
     SUM(try_parse(quantity AS numeric(18,4))) AS quantity, 
     subclass, 
     article, 
     try_parse(Transaction_Date AS Datetime) AS Transaction_Date, 
     Store_ID 
    FROM 
     [dbo].[Transaction_Dump] 
    GROUP BY 
     Client_ID, Customer_ID, Transaction_ID, 
     try_parse(Transaction_Date AS Datetime), 
     subclass, article, Store_ID ; 

WITH cte AS 
(
    SELECT 
     *, 
     row_number() OVER(PARTITION BY Client_ID, Customer_ID, Transaction_ID, value_sold, quantity, subclass, article 
         ORDER BY Client_ID, Customer_ID, Transaction_ID, value_sold, quantity, subclass, article) AS [rn] 
    FROM 
     [dbo].[Transactions_Refined] 
    WHERE 
     Client_ID IN (SELECT DISTINCT [Client_ID] 
        FROM [dbo].[Transaction_Dump])) 
DELETE cte 
WHERE [rn] > 1 ; 

我想加快這個過程。任何想法?我正在考慮使用外連接。

+0

是Transaction_Dump一個表,你從一些文本文件加載? 這就是您使用TRY_PARSE的原因嗎? 它通常包含多少條記錄? Transactions_Refined包含多少條記錄? 它是一個累積表,你追加並不斷增長? 我看到您使用ROW_NUMBER爲了刪除重複密鑰,但是不是以這種方式丟失信息? –

+0

用'EXISTS'替換'IN DISTINCT' –

+0

To:tomislav_t是的數據來自一個文本文件,我解析它,因爲我需要將它轉換成適當的格式化數據。我沒有使用SSIS我正在使用Azure數據工廠。是的,你知道我正在追加數據。不,我不會丟失我需要的信息。 –

回答

1

代碼從文本文件導入數據到Transaction_Dump中。第一個語句中的GROUP BY負責按Client_ID,Customer_ID,Transaction_ID,Transaction_Date,子類,文章,Store_ID彙總各個交易,並將value_sold和數量相加。

聚合記錄插入到Transaction_Refined中。我們假設這個過程是週期性重複的,這樣Transaction_Refined將會變得非常大。

在Transaction_Refined中插入後,會發生一些不需要的重複。這些重複項由CTE的DELETE語句刪除。 CTE範圍DELETE語句,它使用最近Transaction_Dump中提到的ClientId選擇Transaction_Refined中的記錄。

我懷疑在上面的代碼中有錯誤。插入中的聚合發生在StoreId和Transaction_Date中的其他聚合中。這是有道理的。

奇怪的是,DELETE代碼將通過在StoreId和Transaction_Date上對最近發生在Transaction_Dump中的ClientId進行分組來刪除重複項。

現在的重要問題是ClientId的使用是否每個Transaction_Dump文件都是唯一的。我認爲這不是事實,即一個ClientId可能在不同的日子有多個訂單。

上面的DELETE語句基本上會丟失Transaction_Refined記錄,因爲它忽略了StoreId和Transaction_Date。

有兩種方法來解決這個問題:

選擇1:你把Transaction_Refined作爲一個彙總表,其中你保持每天彙總的交易。在這種情況下,我們可以通過刪除插入中的重複項來使DELETE語句和CTE過時。

選項2:您將Transaction_Refined視爲每個客戶端在所有StoreId和Transaction_Date上的事務總數。如果是這種情況,那麼應該從Transaction_Refined表中刪除StoreId和Transaction_Date列,並且應該有代碼來根據需要插入新記錄或更新現有記錄以保持聚合正確。

下一步將決定您是要選擇選項1還是選項2.一旦你有了這些,應該很容易使非常有效的TSQL代碼更新Transaction_Refined表。