Aracılığıyla paylaş


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>, TOsö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 deyiminde TRUNCATE 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.

  1. Üç 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
    
  2. Kesmeden önce verileri denetleyin.

    SELECT * FROM TruncateTest;
    GO
    
  3. 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.

  4. İşlemi geri alın ve verileri denetleyin.

    ROLLBACK TRANSACTION;
    GO
    
    SELECT * FROM TruncateTest;
    GO
    

    Üç satırı da görürsünüz.

  5. Masayı temizleyin.

    DROP TABLE TruncateTest;
    GO