2012-12-28 25 views
5

Sử dụng SQL Server 2005, việc nâng cấp lên 2012Làm thế nào để sử dụng TRUNCATE TABLE ảnh hưởng đến chỉ số

Nếu tôi có một ETL sự nào sau đây (Simplified)

TRUNCATE TABLE detination 
INSERT INTO detination 
SELECT * 
FROM source 

Điều này rõ ràng chỉ số và xây dựng lại nó với các chèn? Tôi có mảnh vụn không?

+0

"TRUNCATE TABLE loại bỏ tất cả các hàng từ một bảng, nhưng cấu trúc bảng và các cột, các ràng buộc, các chỉ mục của nó vẫn giữ nguyên, bộ đếm được sử dụng bởi một danh tính cho các hàng mới được đặt lại thành hạt giống cho cột đó. Thay vào đó, sử dụng DELETE. Nếu bạn muốn loại bỏ định nghĩa bảng và dữ liệu của nó, hãy sử dụng câu lệnh DROP TABLE "từ http://msdn.microsoft.com/en-us/library/aa260621(v=sql.80).aspx. Nếu bạn cắt bớt bảng, sau đó chèn lại dữ liệu, sau khi chèn nó có thể có ý nghĩa nhất để xây dựng lại chỉ mục vì bạn có dữ liệu mới trong bảng. – Kprof

+0

@Kprof Chúng tôi đã có tình huống apposite khi DELETE hàng tuần giết hiệu suất máy chủ cho đến khi xây dựng lại chỉ mục hoàn chỉnh, nhưng TRUNCATE hàng tuần giữ nó sạch sẽ trên MSSQL 2005 – alex

Trả lời

9

Giả sử nó sẽ không cắt bớt chỉ mục. Điều đó có nghĩa là cơ sở dữ liệu không phù hợp về thể chất. Vì vậy, nó không thể được theo cách này.

Cắt ngắn hợp lý sẽ xóa tất cả các hàng và tạo vật lý cho cây xanh mới cho tất cả các phân đoạn. Vì cây tươi không có phân mảnh tồn tại.

Thực ra tôi không chắc liệu cây có 0 hoặc 1 trang được phân bổ cho chúng hay không. Nhưng nó không quan trọng. Tôi tin rằng cho các bảng tạm thời có một trường hợp đặc biệt mà đã làm với bộ nhớ đệm tạm thời bảng. Cũng không quan trọng.

Chèn từ câu hỏi của bạn hoạt động giống như cách chèn khác. Nó không bị ảnh hưởng bởi việc cắt ngắn trước đó theo cách giao tiếp chéo. Cho dù nó gây ra sự phân mảnh phụ thuộc vào trường hợp cụ thể của bạn và, IMHO, được đặt tốt nhất trong một câu hỏi mới.

+1

Cảm ơn, tôi đang tìm kiếm nếu nó tạo ra cây tươi – Jmyster

0

Thách thức @sjaan phản ứng

MSDN "TRUNCATE TABLE loại bỏ tất cả các hàng từ một bảng, nhưng cấu trúc bảng và các cột của nó, những hạn chế, chỉ số, và vân vân vẫn" đội SQL đang nói rằng chỉ số sẽ tồn tại nhưng không có trang dữ liệu ... Bạn có thể dễ dàng kiểm tra rằng với reference

Nếu bạn kiểm tra kích thước của các chỉ số trên bàn rằng nó sẽ không

SELECT * 
FROM 
(
    SELECT OBJECT_NAME(i.OBJECT_ID) AS TableName, 
      i.name AS IndexName, 
      i.index_id AS IndexID, 
      8 * SUM(a.used_pages) AS 'Indexsize(KB)' 
    FROM sys.indexes AS i 
     JOIN sys.partitions AS p ON p.OBJECT_ID = i.OBJECT_ID 
            AND p.index_id = i.index_id 
     JOIN sys.allocation_units AS a ON a.container_id = p.partition_id 
    GROUP BY i.OBJECT_ID, 
      i.index_id, 
      i.name 
) a 
WHERE A.TableName LIKE '%table%' 
ORDER BY Tablename, 
     indexid; 
Các vấn đề liên quan