Làm thế nào để tạo các khung nhìn cụ thể trong SQL Server?


101

Tôi sẽ thiết kế một chiếc DW và tôi đã nghe về những quan điểm cụ thể hóa. Trên thực tế, tôi muốn tạo một dạng xem và nó sẽ tự động cập nhật khi các bảng cơ sở được thay đổi. Bất cứ ai có thể giải thích với một ví dụ truy vấn ..

Câu trả lời:


144

Chúng được gọi là dạng xem được lập chỉ mục trong SQL Server - hãy đọc các tài liệu trắng này để biết thêm thông tin cơ bản:

Về cơ bản, tất cả những gì bạn cần làm là:

  • tạo chế độ xem thông thường
  • tạo một chỉ mục theo nhóm trên chế độ xem đó

và bạn đã hoàn thành!

Phần khó khăn là: chế độ xem phải đáp ứng khá nhiều ràng buộc và hạn chế - những điều này đã được nêu trong sách trắng. Nếu bạn làm điều này - đó là tất cả. Chế độ xem đang được cập nhật tự động, không cần bảo trì.

Các nguồn bổ sung:


Cảm ơn vì đã trả lời. Tôi đã có những gì tôi muốn .. Tôi cũng muốn biết về các chỉ mục. Tôi muốn biết có cách nào để tạo sơ đồ giản đồ hình sao trong máy chủ SQL khi tôi đã sẵn sàng tất cả cấu trúc bảng không? Nếu Có, làm cách nào để tạo bảng dữ kiện cho điều đó?
Deepak

3
Các hạn chế về việc đặt một chỉ mục được phân nhóm trên chế độ xem là rất lớn. Ví dụ: dạng xem không thể tham chiếu các dạng xem khác và không thể chứa các phép nối bên ngoài. Vì vậy, nhiều chế độ xem cần hiệu suất tốt hơn không thể sử dụng phương pháp này. Vẫn là một câu trả lời hay.
Jeff Wilson

1
Như đã đề cập trong một câu hỏi liên quan, bài viết trên blog MSDN, blog.msdn.microsoft.com/ssma/2011/06/20/… , nêu bật một số điểm khác biệt chính giữa chế độ xem cụ thể hóa và chế độ xem được lập chỉ mục. IMHO có vấn đề nhất là không thể chỉ định trình kích hoạt làm mới: các chế độ xem được lập chỉ mục được cập nhật bất cứ khi nào các bảng cơ sở được cập nhật - làm suy yếu hầu hết các lợi ích về hiệu suất của việc sử dụng chế độ xem cụ thể hóa. Các lệnh cấm đối với phép nối, tổng hợp, hàm cửa sổ và truy vấn con khiến các chế độ xem được lập chỉ mục gần như vô nghĩa trừ khi dữ liệu không thay đổi thường xuyên.
Suncat2000

43

Mặc dù hoàn toàn từ góc độ kỹ thuật, các chế độ xem được lập chỉ mục nghe giống như một thứ mà mọi người có thể sử dụng để cải thiện hiệu suất nhưng kịch bản trong cuộc sống thực lại rất khác. Tôi đã không thành công khi sử dụng các chế độ xem được lập chỉ mục ở nơi tôi cần chúng nhất vì có quá nhiều hạn chế về những gì có thể được lập chỉ mục và những gì không thể.

Nếu bạn có các phép nối bên ngoài trong dạng xem, chúng không thể được sử dụng. Ngoài ra, các biểu thức bảng thông thường không được phép ... Trên thực tế, nếu bạn có bất kỳ thứ tự nào trong các danh sách con hoặc bảng dẫn xuất (chẳng hạn như với phân vùng theo mệnh đề), bạn cũng gặp may.

Điều đó chỉ để lại các tình huống rất đơn giản để sử dụng các chế độ xem được lập chỉ mục, theo ý kiến ​​của tôi, điều gì đó có thể được tối ưu hóa bằng cách tạo các chỉ mục thích hợp trên các bảng bên dưới.

Tôi sẽ rất vui khi nghe một số tình huống thực tế trong đó mọi người đã thực sự sử dụng chế độ xem được lập chỉ mục vì lợi ích của họ và không thể làm được nếu không có chúng


Trên thực tế, tôi đã sử dụng Chế độ xem được lập chỉ mục (chỉ một lần) để phân vùng chỉ mục Tìm kiếm văn bản đầy đủ. Các chỉ mục FTS thực sự không thể được phân vùng, nhưng các chỉ mục riêng biệt có thể được tạo trên một số chế độ xem từ cùng một bảng. Tuy nhiên, đó là phương sách cuối cùng.
areyesram

4
Bạn cần nhớ thêm (NOEXPAND)gợi ý cho các truy vấn sử dụng các dạng xem được lập chỉ mục. Và sau đó bạn nhận thấy sự khác biệt. Lợi thế của việc sử dụng các dạng xem được lập chỉ mục so với "lập chỉ mục các bảng đúng cách" là hạn chế việc lựa chọn bản ghi, nếu bạn đúng, nó sẽ giống nhau.
ajeh

Vâng, điều NOEXPAND không thể bị đánh giá thấp!
Simon_Weaver

18

Bạn có thể cần thêm một chút thông tin cơ bản về Chế độ xem Vật liệu hóa thực sự là gì. Trong Oracle, đây là một đối tượng bao gồm một số phần tử khi bạn cố gắng xây dựng nó ở nơi khác.

MVIEW về cơ bản là một ảnh chụp nhanh dữ liệu từ một nguồn khác. Không giống như một dạng xem, dữ liệu không được tìm thấy khi bạn truy vấn dạng xem, nó được lưu trữ cục bộ trong một dạng bảng. MVIEW được làm mới bằng cách sử dụng quy trình nền khởi động theo chu kỳ hoặc khi dữ liệu nguồn thay đổi. Oracle cho phép làm mới toàn bộ hoặc một phần.

Trong SQL Server, tôi sẽ sử dụng phần sau để tạo MVIEW cơ bản để (hoàn thành) làm mới thường xuyên.

Đầu tiên, một góc nhìn. Điều này sẽ dễ dàng đối với hầu hết vì các khung nhìn khá phổ biến trong bất kỳ cơ sở dữ liệu nào Tiếp theo, một bảng. Điều này phải giống với chế độ xem trong cột và dữ liệu. Điều này sẽ lưu trữ ảnh chụp nhanh của dữ liệu chế độ xem. Sau đó, một thủ tục cắt ngắn bảng và tải lại nó dựa trên dữ liệu hiện tại trong dạng xem. Cuối cùng, một công việc kích hoạt quy trình để bắt đầu nó hoạt động.

Mọi thứ khác đều là thử nghiệm.


5
Nhận xét của bạn về SQL Server là không chính xác - các khung nhìn cụ thể hóa là những thứ rất khác nhau trong Oracle và SQL Server. Trong SQL Server, chế độ xem có chỉ mục nhóm duy nhất trên đó (còn gọi là "chế độ xem cụ thể hóa") không và không thể được cập nhật bởi người dùng, cũng như không được lưu trữ trong một bảng do người dùng tạo riêng biệt - nó luôn được cập nhật bởi trong quá trình cập nhật và không bao giờ bị lỗi thời. Không cần thiết phải lưu trữ ảnh chụp nhanh của dữ liệu.
ErikE

10
Những gì OP yêu cầu sẽ dễ dàng được cung cấp bởi một dạng xem được lập chỉ mục. Đó là thứ gần nhất mà SQL Server cung cấp nguyên bản cho một khung nhìn hiện thực hóa của Oracle. Tuy nhiên, nếu bạn muốn / cần sao chép chính xác cách thức hoạt động của Oracle MVIEW, thì Jason đã đúng. Cách tiếp cận của Jason cũng giúp ích trong cùng một kịch bản mà Oracle MVIEW có thể - ví dụ: làm mới bảng báo cáo ngoài giờ làm việc mà bạn quan tâm nhiều hơn đến tải cơ sở dữ liệu hơn là cập nhật chế độ xem như thế nào (ví dụ: chỉ báo cáo về số của ngày hôm qua ...)

4

Khi chế độ xem được lập chỉ mục không phải là một tùy chọn và không cần cập nhật nhanh chóng, bạn có thể tạo bảng hack cache:

select * into cachetablename from myviewname
alter table cachetablename add primary key (columns)
-- OR alter table cachetablename add rid bigint identity primary key
create index...

sau đó sp_rename view / table hoặc thay đổi bất kỳ truy vấn nào hoặc các view khác tham chiếu nó để trỏ đến bảng cache.

lên lịch hàng ngày / hàng đêm / hàng tuần / không làm mới như thế nào

begin transaction
truncate table cachetablename
insert into cachetablename select * from viewname
commit transaction

NB: điều này sẽ ăn gian, cũng như trong nhật ký tx của bạn. Được sử dụng tốt nhất cho các bộ dữ liệu nhỏ có tốc độ tính toán chậm. Có thể refactor để loại bỏ các cột "dễ dàng nhưng lớn" trước tiên vào một khung nhìn bên ngoài.


1

Đối với MS T-SQL Server, tôi khuyên bạn nên xem xét việc tạo chỉ mục với câu lệnh "include". Tính duy nhất là không bắt buộc, cũng không phải sắp xếp vật lý dữ liệu được liên kết với chỉ mục được phân nhóm. "Chỉ mục ... Bao gồm ()" tạo ra một bộ lưu trữ dữ liệu vật lý riêng được hệ thống tự động duy trì. Về mặt khái niệm, nó rất giống với Chế độ xem Vật liệu hóa của Oracle.

https://msdn.microsoft.com/en-us/library/ms190806.aspx

https://technet.microsoft.com/en-us/library/ms189607(v=sql.105).aspx

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.