Aracılığıyla paylaş


TRUNCATE MASA (Transact-SQL)

Şunlar için geçerlidir:SQL ServerAzure SQL VeritabanıAzure SQL Yönetilen ÖrneğiAzure Synapse AnalyticsAnaliz Platformu Sistemi (PDW)Microsoft Fabric'te ambarMicrosoft Fabric'te SQL veritabanı

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, DELETE yan tümcesi olmayan WHERE 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ı

Syntax

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 }
[ ; ]

Arguments

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ş).

Remarks

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 ve dizin 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 veya dizinlerinde 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çerebilir. Dizinler için deyimi arkasında DELETE boş sayfalar bırakabilir. Bir arka plan temizleme işlemi daha sonra bu sayfaları serbestleştirir.

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.

Ertelenmiş dağıtım

128 veya daha fazla uzantı kullanan bir tablo kesildiğinde, Veritabanı Altyapısı işlem işlemeden sonraya kadar gerçek sayfa ayırmalarını ve ilişkili kilitlerini saptırır. Kesme iki ayrı aşamada gerçekleşir: mantıksal ve fiziksel. Mantıksal aşamada, tablo ve dizinleri tarafından kullanılan mevcut ayırma birimleri serbest bırakma için işaretlenir ve işlem işleyene kadar kilitlenir. Fiziksel aşamada, arka plan işlemi serbest bırakma için işaretlenmiş sayfaları kaldırır. Bu, tarafından TRUNCATE TABLE yayımlanan alanın yeni ayırmalar için hemen kullanılamayabileceği anlamına gelir.

Hızlandırılmış veritabanı kurtarma etkinleştirilirse, kesme, kapsam sayısından bağımsız olarak ayrı mantıksal ve fiziksel aşamalar kullanır.

Limitations

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):

  • TRUNCATE TABLE deyiminde EXPLAIN izin verilmez.

  • TRUNCATE TABLE bir işlemin içinde yürütülemez.

Permissions

Gereken en düşük izin ALTER. TRUNCATE TABLE izinler varsayılan olarak tablo sahibine, sabit sunucu rolünün sysadmin üyelerine db_owner ve ve db_ddladmin sabit veritabanı rollerine devredilemez. Ancak TRUNCATE TABLE deyimini saklı yordam gibi bir modüle ekleyebilir ve EXECUTE AS yan tümcesini kullanarak modüle uygun izinleri verilmektedir.

Examples

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;

SELECT COUNT(*) AS BeforeTruncateCount
FROM HumanResources.JobCandidate;

TRUNCATE TABLE HumanResources.JobCandidate;

SELECT COUNT(*) AS AfterTruncateCount
FROM HumanResources.JobCandidate;

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];
    
    CREATE TABLE TruncateTest (ID INT IDENTITY (1, 1) NOT NULL);
    GO
    INSERT INTO TruncateTest DEFAULT VALUES;
    GO 3
    
  2. Kesmeden önce verileri denetleyin.

    SELECT ID FROM TruncateTest;
    
  3. Bir işlem içindeki tabloyu kırpın ve satır sayısını denetleyin.

    BEGIN TRANSACTION;
    
    TRUNCATE TABLE TruncateTest;
    
    SELECT ID FROM TruncateTest;
    

    Tablonun boş olduğunu görürsünüz.

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

    ROLLBACK TRANSACTION;
    
    SELECT ID FROM TruncateTest;
    

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

  5. Masayı temizleyin.

    DROP TABLE TruncateTest;