Làm cách nào để bạn tạo chế độ xem với SNAPSHOT_MATERIALIZATION trong SQL Server 2017?


36

SQL Server 2017 có một vài thủ tục được lưu trữ mới:

  • sp numfresh_single_snapshot_view - tham số đầu vào cho @view_name nvarchar (261), @rgCode int
  • sp numfresh_snapshot_view - tham số đầu vào cho @rgCode int

Và các mục mới trong sys.messages:

  • 10149 - Không thể tạo chỉ mục có SNAPSHOT_MATERIALIZATION trên chế độ xem '%. * Ls' vì định nghĩa chế độ xem chứa (các) bảng được tối ưu hóa bộ nhớ.
  • 10642 - SNAPSHOT_MATERIALIZATION không thể được đặt cho chỉ mục '%. * Ls' trên '%. * Ls' vì nó chỉ áp dụng cho các chỉ mục trên lượt xem.
  • 10643 - SNAPSHOT_MATERIALIZATION không thể được đặt thành '%. * Ls' trên '%. * Ls' vì nó chỉ áp dụng cho các chỉ mục được nhóm trên các chế độ xem.
  • 10648 - SNAPSHOT_MATERIALIZATION không thể được đặt cho chỉ mục được phân vùng '%. * Ls' trên '%. * Ls'.
  • 10649 - Không thể tạo chỉ mục '%. * Ls' trên '%. * Ls' có cụm chỉ mục '%. * Ls' với SNAPSHOT_MATERIALIZATION.
  • 10650 - Làm mới (các) chế độ xem ảnh chụp nhanh yêu cầu cách ly ảnh chụp nhanh được bật trên cơ sở dữ liệu.
  • 3760 - Không thể thả chỉ mục '%. * Ls' khi xem '%. * Ls' có SNAPSHOT_MATERIALIZATION.
  • 4524 - Không thể thay đổi chế độ xem '%. * Ls' vì nó có tính chất vật liệu chụp nhanh.
  • 4525 - Không thể sử dụng gợi ý '% ls' trên chế độ xem '%. * Ls' có tính chất vật liệu chụp nhanh trước khi chế độ xem được làm mới.

Và các sự kiện mở rộng mới:

Ảnh chụp nhanh Sự kiện mở rộng

Vì vậy, làm thế nào chúng ta có thể tạo ra một cái nhìn cụ thể hóa snapshot? (Rõ ràng Microsoft chưa ghi nhận nó.) Đây là một ý chính với những thứ tôi đã thử cho đến nay vẫn chưa hoạt động.

Câu trả lời:


55

Bạn không thể. Tính năng này bị vô hiệu hóa trong năm 2017 RTM.


Điều đó nói rằng, bạn có thể ...

Sử dụng AdventureWorks:

CREATE VIEW dbo.TH
WITH SCHEMABINDING
AS
SELECT P.ProductID, COUNT_BIG(*) AS cbs
FROM Production.Product AS P
JOIN Production.TransactionHistory AS TH
    ON TH.ProductID = P.ProductID
GROUP BY P.ProductID;
GO
CREATE UNIQUE CLUSTERED INDEX cuq ON dbo.TH (ProductID)
WITH (SNAPSHOT_MATERIALIZATION = ON);

Các thay đổi đối với các bảng bên dưới không được phản ánh ngay lập tức trong chế độ xem (như thường thấy với SQL Server). Tương tự, sửa đổi dữ liệu đối với các bảng bên dưới không phải duy trì chế độ xem được lập chỉ mục ảnh chụp nhanh.

Để làm mới nội dung xem, người ta cần gọi một trong các thủ tục được lưu trữ mới:

EXECUTE sys.sp_refresh_single_snapshot_view
    @view_name = N'dbo.TH',
    @rgCode = 0; -- don't know what this is for yet

Điều này tạo ra kế hoạch thực hiện:

Kế hoạch

Điều này có thể sẽ không hiệu quả với bạn, vì cần một cờ theo dõi không có giấy tờ hoặc bạn cần làm điều đặc biệt khó chịu mà tôi đã làm: viết vào vị trí bộ nhớ giữ cờ tính năng (sử dụng trình gỡ lỗi) để bật tính năng này.

Nếu bạn tò mò, cờ tính năng là byte tại sqllang!g_featureSwitchesLangSvc+0x10f. Nó được kiểm tra trong thời gian sqllang!SpRefreshSingleSnapshotView.

Nếu bạn muốn chơi cùng và chuẩn bị đầy đủ để chấp nhận hậu quả của việc hack trong mã SQL Server khi nó đang chạy và sử dụng một tính năng mà Microsoft chưa nghĩ là đã sẵn sàng:

  1. Đính kèm trình gỡ lỗi vào quy trình SQL Server 2017. Tôi sử dụng WinDbg.
  2. Đặt điểm dừng:

    bp sqllang!SpRefreshSingleSnapshotView
  3. Tiếp tục SQL Server bằng lệnh Go ( g)

  4. Tạo chế độ xem ở trên, nhưng chưa phải là chỉ mục cụm duy nhất
  5. Chạy sys.sp_refresh_single_snapshot_viewlệnh trên
  6. Khi điểm dừng được nhấn, bước qua cho đến khi bạn thấy dòng mã:

    cmp byte ptr [sqllang!g_featureSwitchesLangSvc+0x10f (00007fff`328dfbcf)],0

    Phần bù có thể khác trong các bản dựng khác, ví dụ như trong năm 2017 RTM CU3 sqllang!g_featureSwitchesLangSvc+0x114

  7. Địa chỉ bộ nhớ trong ngoặc đơn có thể khác nhau. Sử dụng một trong những bạn nhìn thấy.

  8. Sử dụng lệnh bộ nhớ hiển thị để xem giá trị hiện tại tại địa chỉ bộ nhớ bạn tìm thấy:

    db 00007fff`328dfbcf L1
  9. Điều này sẽ hiển thị số không, cho biết tính năng này đã bị tắt.

  10. Thay đổi số 0 thành một, sử dụng lệnh enter value (một lần nữa với địa chỉ bộ nhớ của bạn):

    eb 00007fff`328dfbcf 1
  11. Vô hiệu hóa điểm dừng và tiếp tục chạy SQL Server.

  12. Tính năng này hiện đã được bật.
  13. Xây dựng chỉ mục cụm duy nhất trên khung nhìn.
  14. Chơi xung quanh.

Lưu ý SNAPSHOT_MATERIALIZATIONcho phép chúng tôi cụ thể hóa một ảnh chụp nhanh của một đặc tả truy vấn mà thông thường không thể được lập chỉ mục, ví dụ như các cách sử dụng dưới đây MAX:

CREATE VIEW dbo.TH2
WITH SCHEMABINDING
AS
SELECT TH.ProductID, MaxTransactionID = MAX(TH.TransactionID)
FROM Production.TransactionHistory AS TH
GROUP BY TH.ProductID;
GO
CREATE UNIQUE CLUSTERED INDEX cuq ON dbo.TH2 (ProductID)
WITH (SNAPSHOT_MATERIALIZATION = ON);

Kết quả:

Các lệnh hoàn thành thành công.
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.