Chỉ mục cột cửa hàng và khóa ngoại


18

Tôi đang thực hiện điều chỉnh một kho dữ liệu bằng cách sử dụng các chỉ mục. Tôi còn khá mới với SQL Server 2014.Microsoft mô tả như sau:

"Chúng tôi xem chỉ mục kho lưu trữ phân cụm là tiêu chuẩn để lưu trữ các bảng thực tế lưu trữ dữ liệu lớn và hy vọng nó sẽ được sử dụng trong hầu hết các tình huống lưu trữ dữ liệu. và xóa các hoạt động. " http://msdn.microsoft.com/en-us/l Library / gg492088.aspx

Tuy nhiên, nếu bạn đọc thêm trong tài liệu, bạn sẽ thấy trong các giới hạn và hạn chế:

"Không thể có các ràng buộc duy nhất, các ràng buộc khóa chính hoặc các ràng buộc khóa ngoài."

Điều này làm tôi bối rối rất nhiều! Đó là một thực tiễn tốt (không bắt buộc) để có khóa ngoại trong kho dữ liệu vì nhiều lý do (tính toàn vẹn dữ liệu, quan hệ hiển thị cho lớp ngữ nghĩa ...)

Vì vậy, Microsoft ủng hộ các chỉ mục kho lưu trữ phân cụm cho các kịch bản kho dữ liệu; tuy nhiên, nó không thể xử lý các mối quan hệ khóa ngoài?!

Tôi có đúng về điều này? Những cách tiếp cận khác bạn sẽ khuyên? Trước đây, tôi đã sử dụng một chỉ mục kho lưu trữ cột không bao gồm trong các kịch bản kho dữ liệu, với việc thả và xây dựng lại để tải dữ liệu. Tuy nhiên SQL Server 2014 sau đó không thêm giá trị mới thực sự cho kho dữ liệu ??


Khi tính năng đáo hạn, bạn sẽ thấy ngày càng nhiều các tính năng này được hỗ trợ (heck, vào năm 2012, các chỉ mục của cột chỉ được đọc!). Trong khi đó, bạn được cung cấp một sự đánh đổi - hiệu suất tuyệt vời với những hạn chế, hoặc cũ như cũ. Tôi cũng không tin rằng họ dự định rằng điều đó có nghĩa là mọi bảng trong DW của bạn nên có các chỉ mục của cột phân cụm và không có bảng nào có bất kỳ ràng buộc nào - có thể có một số lượng bảng giới hạn trong bất kỳ DW nào sẽ mang lại cho bạn rất nhiều xô.
Aaron Bertrand

3
Cẩn thận -it có thể xử lý tham gia. Một mối quan hệ FK là hoàn toàn không cần thiết cho một tham gia. Nó ở đó để xử lý tính toàn vẹn tham chiếu - rất tốt để có nhưng trong kho dữ liệu CÓ THỂ được bỏ qua. Có nguy cơ, có, nhưng cũng với một hiệu suất đạt được.
TomTom

8
Ngoài ra - "không có giá trị mới thực sự"? Bạn có nghĩa là có thể ghi và phân cụm không giống như cải thiện cho bạn? Việc người dùng có thể truy vấn dữ liệu trong thời gian thực thay vì chờ đợi và xây dựng lại để có thêm dữ liệu hiện tại dường như không phải là một điều tốt cho người dùng của bạn và ít bảo trì hơn cho bạn? nhún vai
Aaron Bertrand

Bạn có thể có các chỉ mục (duy nhất) bằng cách tạo chế độ xem được lập chỉ mục. Có vẻ như cơ sở hạ tầng để bảo trì chỉ số đã có sẵn. Chỉ là các chỉ mục bình thường chưa được thực hiện.
usr

@AaronBertrand Trong kịch bản DWH với các bảng thực tế có khóa ngoại, chỉ mục Clustered Columnstore không hoạt động. Điều này trái ngược hoàn toàn với Microsoft hy vọng đây là tiêu chuẩn để lưu trữ các bảng thực tế lớn. Tôi hy vọng bạn có thể chứng minh tôi sai ...? Bởi vì tôi thích SQL Server.
OverflowStack

Câu trả lời:


13

Bạn đã có rất nhiều câu hỏi ở đây:

Q: (Việc thiếu chìa khóa nước ngoài) làm tôi bối rối rất nhiều! Đó là một thực tiễn tốt (không bắt buộc) để có Fk trong DWH vì nhiều lý do (tính toàn vẹn dữ liệu, quan hệ hiển thị cho lớp ngữ nghĩa, ....)

Trả lời: Chính xác, thông thường nên có khóa ngoại trong kho dữ liệu. Tuy nhiên, các chỉ mục cột được phân cụm chưa hỗ trợ điều đó.

H: Vì vậy, MS ủng hộ các chỉ mục lưu trữ Cột cụm cho các kịch bản DWH, tuy nhiên, nó không thể xử lý các mối quan hệ FK?!

A: Microsoft cung cấp cho bạn các công cụ. Tùy thuộc vào cách bạn sử dụng các công cụ đó.

Nếu thách thức lớn nhất của bạn là thiếu tính toàn vẹn dữ liệu trong kho dữ liệu của bạn, thì công cụ bạn muốn là các bảng thông thường có khóa ngoại.

Nếu thách thức lớn nhất của bạn là hiệu năng truy vấn và bạn sẵn sàng kiểm tra tính toàn vẹn dữ liệu của riêng bạn như là một phần của quá trình tải, thì công cụ bạn muốn là các chỉ mục của cột.

Q: Tuy nhiên, SQL 2014 không có giá trị mới thực sự cho DWH ??

Trả lời: Rất may, kho lưu trữ cột không phải là tính năng mới duy nhất trong SQL Server 2014. Ví dụ: hãy kiểm tra công cụ ước tính cardinality mới.

Q: Tại sao tôi rất tức giận và cay đắng về cách thực hiện tính năng yêu thích của tôi?

A: Bạn bắt được tôi - bạn thực sự không hỏi câu hỏi đó - nhưng dù sao tôi cũng sẽ trả lời nó. Chào mừng bạn đến với thế giới của phần mềm bên thứ ba nơi không phải mọi thứ đều được xây dựng theo thông số kỹ thuật chính xác của bạn. Nếu bạn cảm thấy say mê về một thay đổi mà bạn muốn thấy trong một sản phẩm của Microsoft, hãy xem Connect.Microsoft.com . Đó là quá trình phản hồi của họ nơi bạn có thể gửi thay đổi, người khác có thể bỏ phiếu và sau đó nhóm sản phẩm sẽ đọc và cho bạn biết lý do tại sao họ sẽ không thực hiện. Đôi khi. Hầu hết thời gian họ chỉ đánh dấu là "sẽ không sửa, hoạt động trên máy của tôi", nhưng này, đôi khi bạn nhận được một số câu trả lời.


"Chính xác, thông thường nên có khóa ngoại trong kho dữ liệu" -> SQLCAT - 10 cách thực hành tốt nhất để xây dựng kho dữ liệu quan hệ quy mô lớn ... "Xây dựng các chỉ mục không bao gồm cho mỗi khóa ngoại." -> Không có gì về việc thực thi mối quan hệ FK được đề cập trong liên kết và phi CI là dự phòng do cột lưu trữ, vì vậy bạn sẽ chỉ ra rằng không cần FK trên bảng thực tế, bạn có đồng ý không? Quan tâm đến suy nghĩ của bạn về điều này.
Adrian Torrie

1
... và đối với kích thước: "Tránh thực thi các mối quan hệ khóa ngoài giữa thực tế và bảng thứ nguyên, để cho phép tải dữ liệu nhanh hơn. Bạn có thể tạo các ràng buộc khóa ngoài với NOCHECK để ghi lại các mối quan hệ; nhưng không thực thi chúng. mặc dù Transform Lookups hoặc thực hiện kiểm tra tính toàn vẹn dữ liệu tại nguồn của dữ liệu "
Adrian Torrie

6

Tôi có thể hiểu rằng bạn cảm thấy một số phần mà bạn đã từng bị thiếu. Nhưng đó chỉ là vì họ đang mất tích.

Tuy nhiên, SQL Server đã được sử dụng thành công khi Khóa ngoài chỉ là một khái niệm (mà chúng tôi đã triển khai thông qua các trình kích hoạt trong những ngày đó), chứ không phải là một triển khai vật lý như ràng buộc. Tính toàn vẹn tham chiếu khai báo đã có ít nhất bởi SQL Server 7.0, nhưng yếu hơn nhiều so với triển khai hiện tại.

Về giá trị của IndexStore Index Clustered, nó cung cấp một chỉ mục và các hàng có thể cập nhật được. Bạn có thể thấy cuộc thảo luận này có giá trị: http://sqlwithmanoj.com/2014/07/24/maintained-uniquety-with-clustered-columnstore-index-sql-server-2014/

Manoj chỉ ra rằng có một cách để tạo Chế độ xem được lập chỉ mục / được vật chất hóa trên đầu bảng này, với Khóa cụm là PK (cột thứ nhất của bảng / dạng xem). Cho dù điều đó phù hợp với bạn, tất nhiên, là một quyết định bạn phải đưa ra.

Nhưng, như Aaron Bertrand và TomTom nhận xét, đây là tất cả về hiệu suất tốt hơn. Nếu bạn có thể quản lý các vấn đề khác liên quan đến bạn (và tôi tin rằng chúng thể quản lý được) thì bạn sẽ nhận được khá nhiều lợi ích. Vì vậy, hãy sử dụng ColumnStore cho những gì có thể làm và tự mình quản lý các tính năng còn thiếu.


2

Câu hỏi này liên quan đến SQL 2014, nhưng tôi muốn cung cấp thêm thông tin về các thay đổi được thực hiện trong SQL 2016 cho các chỉ mục của cột, vì khó có thể phân loại các giới hạn trong các phiên bản khác nhau và câu hỏi này vẫn còn khá cao trên Google:

Đối với SQL 2016, Microsoft mô tả phương pháp sử dụng các chỉ mục btree chưa được phân loại (hiện có thể được thêm làm chỉ mục phụ trên bảng cột phân cụm) để thực thi các ràng buộc khóa ngoài, với điều kiện ràng buộc được thêm vào trước chỉ mục của cột: https: // docs .microsoft.com / en-us / sql / quan hệ-cơ sở dữ liệu / chỉ mục / cột cửa hàng-chỉ mục-thiết kế-hướng dẫn

Niko Neugebauer cũng có một bài đăng trên blog về điều này; thực sự có thể tạo trực tiếp các ràng buộc duy nhất / nước ngoài trên các bảng cột (Tôi đã áp dụng phương pháp này trong công việc của mình): http://www.nikoport.com/2015/09/15/columnstore-indexes-part-66- more-clustered-cộtstore-Cải thiện-trong-sql-server-2016 /

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.