Tại sao "Chọn * vào mục tiêu có thể truy cập được từ nguồn dữ liệu có thể nhanh hơn so với việc chèn vào mục tiêu có thể chọn lọc * từ mục đích


9

Tiêu đề này là câu hỏi. Tôi tò mò muốn biết câu trả lời. Có người nói

chọn vào được đăng nhập tối thiểu vào cơ sở dữ liệu mô hình khôi phục đơn giản ... Tôi hoàn toàn không tham gia vào nó.

Trích từ Microsoft:

Số lượng ghi nhật ký cho CHỌN ... INTO phụ thuộc vào mô hình khôi phục có hiệu lực cho cơ sở dữ liệu. Trong mô hình khôi phục đơn giản hoặc mô hình khôi phục được ghi nhật ký hàng loạt, các hoạt động hàng loạt được ghi lại tối thiểu. Với ghi nhật ký tối thiểu, sử dụng câu lệnh CHỌN INTO có thể hiệu quả hơn so với việc tạo bảng và sau đó điền vào bảng bằng câu lệnh INSERT

Tìm sự giúp đỡ

Cảm ơn


Bạn đang dùng gói dữ liệu nào vậy? Những cấu trúc nào là các bảng? Làm thế nào bạn đo được cái này nhanh hơn cái kia?

Tôi sẽ ngạc nhiên nếu có bất kỳ sự khác biệt nào trên một DBMS được viết tốt.

Cơ sở dữ liệu: Máy chủ Sql 20005 ... và tôi đã nghe điều này .. thậm chí tôi không chắc chắn 100% ... Tôi đang tìm kiếm những gì người khác nói .. Như tôi đã đề cập rằng ai đó đã nói với tôi điều này ..

Tìm thấy một liên kết xác nhận rằng SELECT INTOcó thể được ghi lại tối thiểu khi không sử dụng Full Recovery.
Damien_The_Unbeliever

Câu trả lời:


10

Một vài ý tưởng / lý thuyết:

CHỌN VÀO ... cho phép RDBMS xác định thứ tự sắp xếp dựa trên thứ tự của bảng gốc của bạn. Nếu bạn chèn vào một bảng hiện có, có thể có một loại cần thiết để khớp với (các) chỉ mục được nhóm hoặc không tách rời.

Không có chỉ mục - khi bạn SELECT INTO...biết RDBMS chắc chắn không có chỉ mục tồn tại trước để cập nhật.

Không có sự can thiệp - vì bảng bạn đang chèn không tồn tại, SQL Server không cần phải lo lắng về việc khóa cấp hàng hoặc xử lý tranh chấp. Không có gì khác có thể tham chiếu bảng bạn tạo vì nó không tồn tại.

Tất cả những gì đang được nói, có những cách khác để chèn vào một bảng rất nhanh.

  • Hãy chắc chắn rằng các khóa chỉ mục được nhóm của bạn khớp với nhau khi có thể. Điều này có nghĩa là không có sự sắp xếp nhanh chóng

  • Vô hiệu hóa tất cả các chỉ mục không cụm. Tự giải thích.

  • Đặt chế độ khôi phục thành đơn giản và theo dõi cờ 610 thành ON. Sử dụng TABLOCKgợi ý trên bảng mục tiêu của bạn và NOLOCKgợi ý trên bảng nguồn của bạn.

Ví dụ: giả sử tablea và tableb có cùng chỉ mục được nhóm:

INSERT INTO TableB WITH (TABLOCK)
SELECT <Columns>
FROM TableA WITH (NOLOCK)

Theo kinh nghiệm của tôi, điều này nhanh hơn việc sử dụng SELECT INTO...và sau đó tạo ra chỉ mục cụm. Xin lưu ý rằng điều này cũng có thể hoạt động trên một bảng đã có dữ liệu trong đó là một kịch bản hữu ích hơn nhiều.

BIÊN TẬP:

Đây là một whitepaper chi tiết tuyệt vời từ MS cho hiệu suất tải dữ liệu trong Sql Server 2008.


3
Câu trả lời rất kỹ lưỡng JNK. Ngoài ra, khi được triển khai chính xác và mô hình khôi phục không đầy đủ, một tác vụ luồng dữ liệu SSIS đơn giản có thể nhanh hơn một trong hai nhiệm vụ này. Tại sao? Cả hai điều trên sẽ phát hành một khóa độc quyền (Đọc là đa luồng nhưng ghi là một luồng). Miễn là khóa bảng được sử dụng với bộ điều hợp đích, SSIS sẽ sử dụng khóa cập nhật hàng loạt (Cả đọc và ghi đều là đa luồng).
brian
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.