So sánh lược đồ SSDT không hoạt động trong khi BULK INSERT đang diễn ra


11

Tôi đang làm việc tại một dự án ETL và DW lớn, nơi chúng tôi sử dụng kiểm soát TFS / nguồn cùng với cả SSIS và SSDT.

Hôm nay, tôi phát hiện ra rằng trong khi gói SSIS đang thực hiện BULK INSERT vào bảng cơ sở dữ liệu, thì không thể thực hiện So sánh lược đồ SSDT so với cơ sở dữ liệu đó. Điều này thật đáng tiếc, vì một số gói của chúng tôi mất khá nhiều thời gian để hoàn thành. Chúng tôi muốn sử dụng chức năng Schema So sánh để phát hiện các thay đổi đối với cấu trúc cơ sở dữ liệu để lưu chúng trong dự án SSDT của chúng tôi để kiểm soát phiên bản của cơ sở dữ liệu.

Nhìn sâu hơn một chút vào điều này, tôi thấy rằng hàm Schema So sánh trong SSDT thực thi một tập lệnh SQL gọi OBJECTPROPERTY()hàm hệ thống trên các bảng trong cơ sở dữ liệu. Cụ thể trong trường hợp của tôi, bất kỳ cuộc gọi nào OBJECTPROPERTY(<object_id>, N'IsEncrypted')dường như bị chặn, khi <object_id>đề cập đến một bảng hiện đang được chèn số lượng lớn.

Trong Visual Studio, Lược đồ SSDT So sánh đơn giản chỉ sau một thời gian và tuyên bố rằng không có sự khác biệt nào được phát hiện.

Có cách giải quyết vấn đề này trong SSDT không, hoặc có lẽ tôi nên thử gửi báo cáo lỗi MS Connect?

Ngoài ra, vì BULK INSERT xảy ra từ gói SSIS, có lẽ có một số cách để thực hiện việc chèn này mà không khóa các khóa OBJECTPROPERTYtrên bàn? Chỉnh sửa: Trong SSIS OLE DB Destination, chúng tôi có thể xóa dấu kiểm khỏi "Bảng khóa", thực hiện những gì nó nói, nhưng điều này có thể làm giảm hiệu suất trong một số trường hợp. Tôi quan tâm nhiều hơn đến một giải pháp cho phép So sánh lược đồ SSDT thực hiện công việc của mình, ngay cả khi một số đối tượng bị khóa.


Hãy xem Kiểm soát hành vi khóa đối với nhập hàng loạt - bạn có thể bật 'khóa bảng khi tải hàng loạt'. Ngoài ra, hãy kiểm tra BULK INSERT của bạn không chỉ định TABLOCK
stuartd

Nếu bạn đang thực hiện khóa bảng, bạn có thể tìm thấy tải nhanh hơn nếu bạn vô hiệu hóa nó bằng mọi cách ( technet.microsoft.com/en-us/l Library / ms177445.aspx ) - bất kể lý do gì tôi sẽ tăng kết nối vì hết thời gian chờ ít nhất là thất bại thay vì chỉ nói rằng không có thay đổi
Ed Elliott

Cảm ơn bạn đã trả lời, stuartd và Ed Elliot. Hóa ra chúng tôi thực sự muốn khóa bảng, vì lý do hiệu suất. Theo tôi, SSDT sẽ có thể xử lý việc này, vì chúng tôi chỉ muốn so sánh cơ sở dữ liệu, không áp dụng các thay đổi cho các đối tượng trong cơ sở dữ liệu. Tôi sẽ tạo một bài đăng kết nối để giải quyết điều này.
Dan

3
Thực tế không phải là sở trường của tôi nhưng theo tôi hiểu, bạn có một khóa trên bàn. Bất cứ khóa nào được thực hiện là cho phần chèn lớn không tương thích với (các) khóa được yêu cầu để xác thực lược đồ. Có liên quan đọc khóa BOL Schema
billinkc

Có lẽ bạn có thể giải thích rõ hơn tại sao so sánh lược đồ phải chạy song song với thao tác tải? Có lẽ một sự thay thế là có một mô hình tham chiếu của cơ sở dữ liệu. Không có dữ liệu, chỉ là lược đồ. Chạy các so sánh của bạn với điều đó và sau đó đảm bảo rằng không ai sửa đổi cơ sở dữ liệu thực tế nơi các ops số lượng lớn này đang được thực hiện mà không cập nhật mô hình tham chiếu trước.
billinkc

Câu trả lời:


19

Cuộc OBJECTPROPERTYgọi yêu cầu khóa ổn định lược đồ (Sch-S), khóa này không tương thích với khóa sửa đổi lược đồ (Sch-M).

Các BULK INSERTsẽ mất một khóa Sch-M trong một số trường hợp. Những điều này được liệt kê trong phần "Khóa bảng và ghi nhật ký khi nhập hàng loạt" trong Hướng dẫn tối ưu hóa nhập hàng loạt trong sách trực tuyến:

Khóa nhập hàng loạt

Nếu bảng đích được nhóm, bạn có thể thấy bật cờ theo dõi 610 . Vui lòng đọc toàn bộ loạt bài đăng đó và Hướng dẫn hiệu suất tải dữ liệu và kiểm tra kỹ nếu bạn quyết định đi theo lộ trình này.

Tôi không biết tại sao SSDT kiểm tra thuộc IsEncryptedtính cho các bảng. Tôi không thể tưởng tượng ra một kịch bản có ý nghĩa, nhưng đó là một câu hỏi cho những người SSDT.


3
Đây là một câu trả lời rất toàn diện và thỏa đáng. Cảm ơn rât nhiều.
Dan
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.