TRUNCATE TABLE (Transact-SQL)
Şunlar için geçerlidir:SQL ServerAzure SQL VeritabanıAzure SQL Yönetilen ÖrneğiAzure Synapse AnalyticsAnalytics Platform Sistemi (PDW)Warehouse in Microsoft FabricSQL veritabanında Microsoft Fabric
Tek tek satır silmeleri günlüğe kaydetmeden bir tablodan veya tablonun belirtilen bölümlerinden tüm satırları kaldırır.
TRUNCATE TABLE
, WHERE
yan tümcesi olmayan DELETE
deyimine benzer; ancak TRUNCATE TABLE
daha hızlıdır ve daha az sistem ve işlem günlüğü kaynağı kullanır.
Transact-SQL söz dizimi kuralları
Sözdizimi
SQL Server, Azure SQL Veritabanı, Doku SQL veritabanı söz dizimi
TRUNCATE TABLE
{ database_name.schema_name.table_name | schema_name.table_name | table_name }
[ WITH ( PARTITIONS ( { <partition_number_expression> | <range> }
[ , ...n ] ) ) ]
[ ; ]
<range> ::=
<partition_number_expression> TO <partition_number_expression>
Microsoft Fabric, Azure Synapse Analytics ve Paralel Veri Ambarı için söz dizimi.
TRUNCATE TABLE { database_name.schema_name.table_name | schema_name.table_name | table_name }
[ ; ]
Bağımsız değişken
database_name
Veritabanının adı.
schema_name
Tablonun ait olduğu şemanın adı.
table_name
Kesilen veya tüm satırların kaldırıldığı tablonun adı.
table_name değişmez değer olmalıdır.
table_nameOBJECT_ID()
işlevi veya değişken olamaz.
WITH ( PARTITIONS ( { <partition_number_expression> | <aralığı> } [ , ... n ] ) )
için geçerlidir: SQL Server 2016 (13.x) ve sonraki sürümler.
Kesilen veya tüm satırların kaldırıldığı bölümleri belirtir. Tablo bölümlenmemişse, WITH PARTITIONS
bağımsız değişkeni bir hata oluşturur.
WITH PARTITIONS
yan tümcesi sağlanmamışsa tablonun tamamı kesilir.
<partition_number_expression>
aşağıdaki yollarla belirtilebilir:
Bölüm sayısını belirtin, örneğin:
WITH (PARTITIONS (2))
Virgülle ayrılmış birkaç bölüm için bölüm numaralarını sağlayın, örneğin:
WITH (PARTITIONS (1, 5))
Hem aralıkları hem de tek tek bölümleri sağlayın, örneğin:
WITH (PARTITIONS (2, 4, 6 TO 8))
<range>
,TO
sözcüğüyle ayrılmış bölüm numaraları olarak belirtilebilir, örneğin:WITH (PARTITIONS (6 TO 8))
Bölümlenmiş bir tabloyu kesebilmek için tablo ve dizinler hizalanmalıdır (aynı bölüm işlevinde bölümlenmiş).
Açıklamalar
DELETE
deyimiyle karşılaştırıldığında, TRUNCATE TABLE
aşağıdaki avantajlara sahiptir:
Daha az işlem günlüğü alanı kullanılır.
DELETE
deyimi satırları birer birer kaldırır ve silinen her satır için işlem günlüğüne bir girdi kaydeder.TRUNCATE TABLE
, tablo verilerini depolamak için kullanılan veri sayfalarını serbest bırakarak verileri kaldırır ve işlem günlüğünde yalnızca sayfa ayırmalarını kaydeder.Genellikle daha az kilit kullanılır.
DELETE
deyimi satır kilidi kullanılarak yürütülürse, tablodaki her satır silinmek üzere kilitlenir.TRUNCATE TABLE
her zaman tabloyu (şema (SCH-M
) kilidi dahil) ve sayfayı kilitler, ancak her satırı kilitlemez.İstisnasız olarak tabloda sıfır sayfa kalır.
DELETE
deyimi yürütüldükten sonra tablo yine de boş sayfalar içerebilir. Örneğin, bir yığındaki boş sayfalar en azından özel (LCK_M_X
) tablo kilidi olmadan serbest bırakılamaz. Silme işlemi tablo kilidi kullanmıyorsa, tablo (yığın) çok sayıda boş sayfa içerir. Dizinler için, arka plan temizleme işlemi bu sayfaları hızla serbest bıraksa da, silme işlemi boş sayfalar bırakabilir.
TRUNCATE TABLE
tablodaki tüm satırları kaldırır, ancak tablo yapısı ve sütunları, kısıtlamaları, dizinleri vb. kalır. Verilerine ek olarak tablo tanımını kaldırmak için DROP TABLE
deyimini kullanın.
Tabloda bir kimlik sütunu varsa, bu sütunun sayacı sütun için tanımlanan tohum değerine sıfırlanır. Hiçbir tohum tanımlanmamışsa, varsayılan değer 1
kullanılır. Kimlik sayacını korumak için bunun yerine DELETE
kullanın.
bir TRUNCATE TABLE
işlemi bir işlem içinde geri alınabilir.
Fabric SQL veritabanında, bir tablonun kesilmesi, bu tablo için Doku OneLake'ten tüm yansıtılmış verileri siler.
Sınırlama
aşağıdaki tablolarda TRUNCATE TABLE
kullanamazsınız:
FOREIGN KEY
kısıtlaması tarafından başvurulur. Kendisine başvuran yabancı anahtarı olan bir tabloyu kesebilirsiniz.Dizinli görünüme katılın.
İşlem çoğaltması veya birleştirme çoğaltması kullanılarak yayımlanır.
Sistem sürümü zamansaldır.
bir
EDGE
kısıtlaması tarafından başvurulur.
Bu özelliklerden birine veya daha fazlasına sahip tablolar için bunun yerine DELETE
deyimini kullanın.
TRUNCATE TABLE
, işlem tek tek satır silmeleri günlüğe kaydetmediğinden tetikleyiciyi etkinleştiremiyor. Daha fazla bilgi için bkz. create TRIGGER (Transact-SQL)
Azure Synapse Analytics ve Analytics Platform Sistemi'nde (PDW):
EXPLAIN
deyimindeTRUNCATE TABLE
izin verilmez.TRUNCATE TABLE
bir işlemin içinde çalıştırılamaz.
Büyük tabloları kesme
Microsoft SQL Server, bırakma için gereken tüm kapsamlarda eşzamanlı kilitler tutmadan 128'den fazla uzantıya sahip tabloları bırakma veya kesme özelliğine sahiptir.
İzinler
Gereken en düşük izin table_nameALTER
.
TRUNCATE TABLE
izinleri varsayılan olarak tablo sahibine, sysadmin sabit sunucu rolünün üyelerine, db_owner ve sabit veritabanı rollerini db_ddladmin ve aktarılamaz. Ancak TRUNCATE TABLE
deyimini saklı yordam gibi bir modüle ekleyebilir ve EXECUTE AS
yan tümcesini kullanarak modüle uygun izinleri verilmektedir.
Örnekler
A. Tabloyu kesme
Aşağıdaki örnek, JobCandidate
tablosundaki tüm verileri kaldırır.
SELECT
deyimleri, sonuçları karşılaştırmak için TRUNCATE TABLE
deyiminden önce ve sonra eklenir.
USE AdventureWorks2022;
GO
SELECT COUNT(*) AS BeforeTruncateCount
FROM HumanResources.JobCandidate;
GO
TRUNCATE TABLE HumanResources.JobCandidate;
GO
SELECT COUNT(*) AS AfterTruncateCount
FROM HumanResources.JobCandidate;
GO
B. Tablo bölümlerini kesme
için geçerlidir: SQL Server 2016 (13.x) ve sonraki sürümler.
Aşağıdaki örnek, bölümlenmiş tablonun belirtilen bölümlerini kesmektedir.
WITH (PARTITIONS (2, 4, 6 TO 8))
söz dizimi 2, 4, 6, 7 ve 8 bölüm numaralarının kesilmesine neden olur.
TRUNCATE TABLE PartitionTable1
WITH (PARTITIONS (2, 4, 6 TO 8));
GO
C. Kesme işlemini geri alma
Aşağıdaki örnekte, bir işlem içindeki TRUNCATE TABLE
işleminin geri alınabileceği gösterilmektedir.
Üç satırlı bir test tablosu oluşturun.
USE [tempdb]; GO CREATE TABLE TruncateTest (ID INT IDENTITY (1, 1) NOT NULL); GO INSERT INTO TruncateTest DEFAULT VALUES; GO 3
Kesmeden önce verileri denetleyin.
SELECT * FROM TruncateTest; GO
Bir işlem içindeki tabloyu kırpın ve satır sayısını denetleyin.
BEGIN TRANSACTION; TRUNCATE TABLE TruncateTest; SELECT * FROM TruncateTest;
Tablonun boş olduğunu görürsünüz.
İşlemi geri alın ve verileri denetleyin.
ROLLBACK TRANSACTION; GO SELECT * FROM TruncateTest; GO
Üç satırı da görürsünüz.
Masayı temizleyin.
DROP TABLE TruncateTest; GO
İlgili içerik
- DELETE (Transact-SQL)
- DROP TABLE (Transact-SQL)
- CREATE TABLE (Transact-SQL) IDENTITY (Özellik)