close

最近剛好遇到工作上需要對特定資料表,根據排序後的第一筆資料進行刪除

過往可能需要先查詢出排序後第一筆資料關鍵Key值再進行刪除

範例資料

CREATE TABLE dbo.T1 ( C1 INT PRIMARY KEY IDENTITY(1,1))
INSERT INTO dbo.T1 DEFAULT VALUES
GO 10000

過去

--刪除排序後第一筆資料
DECLARE @No INT 
SET @No = (SELECT TOP 1 C1 FROM dbo.T1 ORDER BY C1)
DELETE dbo.T1 WHERE C1 = @No

--刪除排序後前一百筆資料
DELETE dbo.T1 
WHERE C1 IN 
(
    SELECT TOP 100 C1 FROM dbo.T1 ORDER BY C1
)

但當Key值是多欄位或是語法更複雜時,SQL Script會越來越複雜,效能上也因為操作的動作變多還變差

透過使用SQL Server CTE的方式可以提升效能,語法也會變得比較簡潔(個人認為XD)

使用CTE方式

;WITH DEL AS

    SELECT TOP 100 * FROM dbo.T1 ORDER BY C1 
)
DELETE DEL

使用評估計畫比較兩者的效能

20200106_001.png

原本的方法因為多包了一層子查詢所以動作上比較多,而使用CTE進行刪除,則直接抓取到目標資料後進行刪除

我使用的範例比較簡陋,如果遇到更加複雜的狀況,可能還是要多嘗試不同語法後找到適合的方法

如果大家有更快捷的方式也可以分享一下^^

 

 

 

arrow
arrow
    文章標籤
    SQL Server T-SQL
    全站熱搜
    創作者介紹
    創作者 Louis 的頭像
    Louis

    Louis學習筆記

    Louis 發表在 痞客邦 留言(0) 人氣()