はじめに
最近? Fabric Warehoues で TRUNCATE がサポートされたようですが、Delta Lake は TRUNCATEコマンドはサポートされていないため、DELETEは何が違うのか気になったので確認してみます。
引用:https://learn.microsoft.com/ja-jp/fabric/data-warehouse/tsql-surface-area
SQL Server ではTRUNCATEは各行のDELETE をトランザクションログに記録せずに、データファイルをパージして処理するというメタデータ操作的な作業であるため、高速にデータ削除が可能というものでした
準備
以下のテーブルで検証します。
CREATE TABLE [dbo].[Date] (
[DateID] int NOT NULL,
[Date] datetime2(6) NULL,
[DateBKey] char(10) NULL,
[DayOfMonth] varchar(2) NULL,
[DaySuffix] varchar(4) NULL,
[DayName] varchar(9) NULL,
[DayOfWeek] char(1) NULL,
[DayOfWeekInMonth] varchar(2) NULL,
[DayOfWeekInYear] varchar(2) NULL,
[DayOfQuarter] varchar(3) NULL,
[DayOfYear] varchar(3) NULL,
[WeekOfMonth] varchar(1) NULL,
[WeekOfQuarter] varchar(2) NULL,
[WeekOfYear] varchar(2) NULL,
[Month] varchar(2) NULL,
[MonthName] varchar(9) NULL,
[MonthOfQuarter] varchar(2) NULL,
[Quarter] char(1) NULL,
[QuarterName] varchar(9) NULL,
[Year] char(4) NULL,
[YearName] char(7) NULL,
[MonthYear] char(10) NULL,
[MMYYYY] char(6) NULL,
[FirstDayOfMonth] date NULL,
[LastDayOfMonth] date NULL,
[FirstDayOfQuarter] date NULL,
[LastDayOfQuarter] date NULL,
[FirstDayOfYear] date NULL,
[LastDayOfYear] date NULL,
[IsHolidayUSA] bit NULL,
[IsWeekday] bit NULL,
[HolidayUSA] varchar(50) NULL
);
検証 1. 全件DELETE
-
データ投入後、DELETE してみます。
sqlDELETE FROM [sandWH].[dbo].[Date];
-
OneLake File Explorer から delta_logの確認。左がデータ投入のログ、右がDELETE です。
DELETE は Deleta Lake の仕様通りParquet を参照先から外していることがわかります。なお、二回目以降の DELETE では テーブルプロトコルの情報は出てきませんでした。
検証 2. TRUNCATE
-
データ投入後、DELETE してみます。
sqlTRUNCATE TABLE [sandWH].[dbo].[Date];
-
OneLake File Explorer から delta_logの確認。左がデータ投入のログ、右がTRUNCATE です。
DELETEのときと同じようなファイル remove ログが記録されています。
検証 3. DELETE WHERE
-
データ投入後、DELETE してみます。
sqlDELETE FROM [sandWH].[dbo].[Date] where [DateID] = 20150317;
-
OneLake File Explorer から delta_logの確認。左がデータ投入のログ、右がDELETE です。全件の削除ではないので、新しいバージョンの parquet ファイルが add されています。
やはりTRUNCATE と DELETE は少なくともdelta_log からは同じ操作扱いであることがわかりました。