Kiến trúc chỉ mục thích hợp khi bị buộc phải thực hiện IsDelatted (xóa mềm) là gì?


16

Hiện tại, chúng tôi có một cơ sở dữ liệu và ứng dụng hiện có đầy đủ chức năng. Tôi không có khả năng thay đổi kiến ​​trúc vào thời điểm này. Ngày nay, mỗi bảng trong cơ sở dữ liệu có trường "Không bị xóa" KHÔNG NULL BIT với mặc định là '0'. Khi ứng dụng "xóa" dữ liệu, nó chỉ cần cập nhật cờ IsDelatted thành 1.

Điều tôi gặp khó khăn trong việc hiểu là làm thế nào các chỉ mục trên mỗi bảng nên được cấu trúc. Ngay bây giờ, mọi truy vấn / tham gia / etc luôn thực hiện kiểm tra IsDelatted. Đó là một tiêu chuẩn mà các nhà phát triển của chúng tôi phải tuân theo. Điều đó đang được nói, tôi đang cố gắng xác định xem tất cả các chỉ mục khóa chính được nhóm của tôi trên mỗi bảng có cần phải được thay đổi để bao gồm khóa chính VÀ trường BIT bị xóa hay không. Ngoài ra, vì MỌI truy vấn / tham gia / v.v. phải thực hiện kiểm tra IsDelatted, đó có phải là một giả định thích hợp rằng MỌI chỉ số SINGLE (cũng không được phân cụm) nên bao gồm trường IsDelatted là trường đầu tiên của chỉ mục không?

Một câu hỏi khác tôi có là xung quanh các chỉ mục được lọc. Tôi hiểu rằng tôi có thể đặt các bộ lọc vào các chỉ mục, chẳng hạn như "WHERE IsDelatted = 0" để giảm kích thước của các chỉ mục. Tuy nhiên, vì mọi liên kết / truy vấn sẽ phải thực hiện kiểm tra IsDelatted, điều đó có ngăn chặn chỉ mục được lọc không được sử dụng (vì cột IsDelatted được sử dụng trong tham gia / truy vấn)?

Hãy nhớ rằng, tôi không có khả năng thay đổi cách tiếp cận IsDelatted.

Câu trả lời:


13

Cách tiếp cận đơn giản nhất ở đây là để riêng các khóa và các chỉ mục được nhóm của bạn và sử dụng các chỉ mục được lọc cho các chỉ mục không được phân cụm của bạn.

Ngoài ra, bạn có thể di chuyển một số bảng lớn sang các đống được phân vùng hoặc các cột cột được phân vùng (SQL Server 2016+), để lại khóa chính và các chỉ mục duy nhất không được phân vùng. Điều này sẽ cho phép bạn đẩy các cột không khóa cho các hàng IsDelatted sang cấu trúc dữ liệu riêng biệt, có thể được nén khác nhau hoặc được lưu trữ trên một nhóm tệp khác.

Và đảm bảo rằng các nhà phát triển sử dụng một chữ thay vì tham số để lọc các hàng IsDelatted ra. Với một tham số SQL Server phải sử dụng cùng một kế hoạch truy vấn cho cả hai trường hợp.

VÍ DỤ

SELECT ... WHERE ... AND IsDeleted=0

Và không:

SELECT ... WHERE ... AND IsDeleted=@IsDeleted

Sử dụng một tham số sẽ ngăn việc sử dụng chỉ mục được lọc và có thể khiến bạn gặp rắc rối với việc đánh hơi tham số.


Do tính phổ biến và tầm quan trọng của IsDeletedcột, bất kể lưu trữ vật lý, có thể có ý nghĩa để lộ dữ liệu qua hai chế độ xem (tùy chọn trong các lược đồ khác nhau), giải quyết cả vấn đề tham số hóa và mắc lỗi khi truy cập dữ liệu không nên có truy cập ít có khả năng. Truy cập dữ liệu cơ sở chỉ liên quan đến các trường hợp hiếm hoi trong đó dữ liệu bị xóa và không xóa cần được kết hợp bằng cách nào đó và khi các hàng thực sự cần phải được chuyển sang "bị xóa".
Jeroen Mostert

@JeroenMostert tư vấn tốt. RLS cũng có thể được sử dụng ở đây, hoặc một cái gì đó như Bộ lọc truy vấn toàn cầu của EF Core. docs.microsoft.com/en-us/ef/core/querying/filters
David Browne - Microsoft

9

Đây có thể là một ý kiến ​​không phổ biến, nhưng tôi không nghĩ có "làm điều này ở mọi nơi" / một kích thước phù hợp với tất cả câu trả lời cho câu hỏi của bạn.

Nếu bạn có các truy vấn đang quét rất nhiều hàng IsDelatted mà không có lý do, một giải pháp là tạo một chỉ mục được lọc, không tách rời để đáp ứng truy vấn đó.

Một tùy chọn khác là tạo chế độ xem được lập chỉ mục có thể được sử dụng bởi một số truy vấn khác nhau, được lọc thành các hàng không bị xóa. Điều này có thể đặc biệt hữu ích trên Phiên bản doanh nghiệp, nơi kết hợp chế độ xem được lập chỉ mục tự động mà không cung cấp NOEXPANDgợi ý.

Đối với các bảng nhỏ hoặc các bảng được đọc nhiều, việc thêm các chỉ mục hoặc chế độ xem không được lọc hoặc bất kỳ thứ gì thực sự có thể chỉ là thêm chi phí không cần thiết vào cơ sở dữ liệu của bạn.


2

Theo giả định hợp lý rằng việc xóa là hiếm, không có thay đổi nào đối với các chỉ số là một giải pháp thích hợp.

Tôi thấy rằng sớm hay muộn người ta phải truy vấn các tham chiếu đến các hàng đã bị xóa và các hàng nằm trong các chỉ mục đột nhiên rất đáng giá.

Xin lưu ý rằng trừ khi bạn đang sử dụng chế độ xem, bạn phải chỉnh sửa tất cả các truy vấn của mình để bao gồm các bộ lọc.


0

Tôi đã thấy một hệ thống trong đó cờ IS_DELETED là 0 hoặc giá trị của PK. Trong các hệ thống khác, đó là tiêu cực của PK.

Vì hầu hết các truy vấn truy xuất giá trị bằng khóa "tự nhiên" hoặc doanh nghiệp (đôi khi là đa trường), chúng không bao giờ được truy vấn bởi PK ngoại trừ thông qua các phép nối; nhưng họ đã luôn thêm AND IS_DELETED = 0 ở cuối cho bảng chính và cho bất kỳ bảng đã tham gia nào.

Hệ thống này cũng có một bảng kiểm toán cho mỗi bảng giao dịch theo dõi các thay đổi; và ứng dụng có một tính năng để hiển thị tất cả các thay đổi dữ liệu bao gồm cả dữ liệu đã xóa.


0

Hy vọng bạn có quyền và khả năng thay đổi truy vấn.

Tuy nhiên, vì mọi liên kết / truy vấn sẽ phải thực hiện kiểm tra IsDelatted, điều đó có ngăn chặn chỉ mục được lọc không được sử dụng (vì cột IsDelatted được sử dụng trong tham gia / truy vấn)?

Tôi muốn nói một điểm quan trọng, hy vọng tôi có thể giải thích nó.

Trong truy vấn nơi phức tạp Transaction tableMasterbảng cả hai đều sử dụng.

IsDeleted=0Chỉ sử dụng trong Transactionbảng. Không sử dụng trong Masterbảng.

Thí dụ,

Select * from dbo.Order O
inner join dbo.category C on o.categoryid=o.categoryid
inner join dbo.Product P on P.Productid=o.Productid
where o.isdeleted=0

Không có điểm nào trong c.isdeleted=0(sử dụng trong Categorybảng). Điều đó là không cần thiết.

Tương tự như vậy có bất kỳ điểm trong việc sử dụng P.isdeleted=0?

Bởi vì tôi muốn tất cả các đơn hàng chưa hoàn tác và chi tiết của họ.

Làm thế nào có thể Productđược xóa khi OrderActivehoặc bất cứ nơi nào Productidlà tài liệu tham khảo.

Vì vậy, theo cách này nếu bạn gỡ lỗi cẩn thận trong truy vấn quan trọng, thì có thể bạn có thể xóa một số isdelatted = 0.

Đừng mù quáng Tạo Chỉ mục được Lọc, trước tiên hãy chọn tất cả những truy vấn rất quan trọng và chậm.

Tối ưu hóa các truy vấn chậm đó sau đó chỉ quyết định về Chỉ mục được lọc hoặc điều chỉnh Chỉ mục.

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.