Để tăng tốc độ của bất kỳ lệnh SQL nào, bạn nên có một cơ sở dữ liệu được thiết lập đúng, do đó tôi hy vọng rằng cơ sở dữ liệu của bạn được lưu trữ trên một đĩa khác và chủ và tempdb nằm trên đĩa riêng của chúng.
Điều đó đang được nói có một số yếu tố ảnh hưởng đến việc tạo chỉ mục: nếu bảng đã được sắp xếp và vì có vẻ như bạn đang xây dựng bảng này trên bảng HEAP, tôi sẽ nói rằng nó không được sắp xếp và thành phần khác là loại cột mà bạn đang tạo chỉ mục trên. Thông tin chứa trong một chỉ mục được phân cụm bị giới hạn bởi số lượng cột hoặc kích thước byte của các cột (tùy theo điều kiện nào đến trước) và do đó một số cột không phải là ứng cử viên tốt cho việc lập chỉ mục cụm.
Vì bạn đang tạo một chỉ mục duy nhất trên bảng heap, bạn nên dọn sạch nó để không có các giá trị trùng lặp. Điều này sẽ tránh cho bạn phải xây dựng lại chỉ mục.
Vì vậy, trước khi bạn chạy truy vấn tạo chỉ mục, hãy chạy cái này trước
SELECT
barKey
FROM
(
SELECT
barKey,
COUNT(barKey) AS NoOfDuplicates
FROM
dbo.tblFactFoo WITH(NOLOCK)
GROUP BY
barKey
)
WHERE
NoOfDuplicates > 1;
Sau khi bạn chạy tệp này và xử lý các bản ghi trùng lặp, bạn có thể chạy các phần sau, xin lưu ý rằng phần này sẽ sử dụng thêm dung lượng đĩa, do đó bạn sẽ cần ít nhất dung lượng bằng kích thước của bảng đó.
CREATE UNIQUE CLUSTERED INDEX IXC_MyTable ON dbo.tblFactFoo(barKey) WITH(SORT_IN_TEMPDB)
GO
Điều này sẽ buộc việc sắp xếp (cần thiết khi tạo chỉ mục) xảy ra trong cơ sở dữ liệu tempdb và sau đó chuyển nó trở lại và thay thế dữ liệu của bạn.
Một cách khác là tạo một bảng trùng lặp có cùng tên, clumns, v.v., thêm khóa cụm trên đó, trước khi bạn thêm bất kỳ bản ghi nào và sau đó thực hiện lệnh này:
MERGE INTO dbo.tblFactFoo AS source
USING dbo.tblFactFooIndexed AS destination ON source.barKey = destination.barKey
WHEN NOT MATCHED BY source THEN
INSERT INTO destination(col1, col2, barKey etc) VALUES (source.col1, source.col2, source.barKey etc)
WHEN MATCHED BY source AND (add extra conditions here if needed) THEN
-- INSERT / UPDATE or DELETE depending on how you want to handle duplicate keys
Vì đây là một hoạt động được thiết lập nên về mặt lý thuyết, nó hoạt động nhanh hơn nhiều vì máy chủ SQL hoạt động trên các bộ nhanh hơn sau đó nó hoạt động trên các hàng. Khi bạn đã hoàn tất, bỏ bảng đầu tiên và đổi tên bảng thứ hai.
Nếu bạn cần thêm trợ giúp với lệnh MERGE ở đây là liên kết đến nó trên MSDN: http://msdn.microsoft.com/en-us/l Library / bb510625.aspx