Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Cách tốt nhất để làm mới bảng tổng hợp đang tải là gì?

Cách tôi đã làm điều này trong một số dự án là sử dụng hai bản sao của bảng trong các lược đồ khác nhau. Vì vậy, một cái gì đó như:

CREATE SCHEMA fake WITH AUTHORIZATION dbo;
CREATE SCHEMA standby WITH AUTHORIZATION dbo;
GO

CREATE TABLE dbo.mySummary(<...columns...>);

CREATE TABLE fake.mySummary(<...columns...>);
GO

Bây giờ, hãy tạo một thủ tục được lưu trữ để cắt bớt và điền lại bảng giả, sau đó trong một giao dịch, hãy di chuyển các đối tượng giữa các lược đồ.

CREATE PROCEDURE dbo.SwapInSummary
AS
BEGIN
    SET NOCOUNT ON;

    TRUNCATE TABLE fake.mySummary;

    INSERT fake.mySummary(<...columns...>)
        SELECT <expensive query>;

    BEGIN TRANSACTION;
        ALTER SCHEMA standby TRANSFER dbo.mySummary;
        ALTER SCHEMA dbo     TRANSFER fake.mySummary;
        ALTER SCHEMA fake    TRANSFER standby.mySummary;
    COMMIT TRANSACTION;
END
GO

Đây có lẽ là khoảng thời gian ngắn nhất mà bạn có thể khiến người dùng đợi dữ liệu mới được làm mới và không làm gián đoạn họ khi đang đọc. (Có nhiều vấn đề liên quan đến NOLOCK khiến nó trở thành một giải pháp thay thế ít được mong đợi hơn, mặc dù phải thừa nhận rằng nó rất dễ viết mã.) Để ngắn gọn / rõ ràng, tôi đã bỏ qua việc xử lý lỗi, v.v. và tôi cũng nên chỉ ra rằng nếu bạn sử dụng script để đồng bộ hóa cơ sở dữ liệu của bạn, hãy đảm bảo rằng bạn đặt tên cho các ràng buộc, chỉ mục, v.v. giống nhau trên cả hai bảng, nếu không, bạn sẽ mất đồng bộ một nửa thời gian. Khi kết thúc quy trình, bạn có thể TRUNCATE bảng fake.MySummary mới, nhưng nếu bạn có khoảng trống, tôi muốn để dữ liệu ở đó để tôi luôn có thể so sánh với phiên bản trước.

Trước SQL Server 2005, tôi đã sử dụng sp_rename bên trong giao dịch để thực hiện chính xác điều tương tự, tuy nhiên vì tôi thực hiện điều này trong một công việc, tôi rất vui khi chuyển sang lược đồ, vì khi tôi làm vậy, cảnh báo không thể ngăn chặn từ sp_rename đã ngừng điền. lập nhật ký lịch sử SQL Server Agent của tôi.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SqlServer đang ở chế độ nâng cấp tập lệnh

  2. Không thể cắt ngắn bảng vì nó đang được tham chiếu bởi ràng buộc NGOẠI KHÓA - Hướng dẫn sử dụng SQL Server / TSQL Phần 70

  3. Làm cách nào để chuyển tên bảng vào proc được lưu trữ?

  4. SQL Server và các lỗ hổng Spectre / Meltdown

  5. Không thực hiện được tác vụ SSIS khi mặt nạ để chọn tệp được tải lên máy chủ FTP bằng WinSCP không khớp với tệp nào