Là thêm chỉ mục trên cột bit làm chậm đáng kể chèn?


11

Tôi có một bảng với khoảng 1 triệu đến 5 triệu hồ sơ. Một phần nhỏ của các bản ghi đó có một cột bit được đặt thành 'TRUE'. Cần nhanh chóng tìm hồ sơ đó. Tôi nghĩ rằng chỉ mục đó có thể tăng tốc độ tìm kiếm trên cột này, nhưng tôi sợ về INSERT. Do đó câu hỏi của tôi.

Cơ sở dữ liệu đang hoạt động giống như kho dữ liệu, do đó, có nhiều CHỌN và nhỏ (tối đa 10-20 mỗi ngày) nhưng các INSERT khá lớn (tăng 200 nghìn bản ghi cùng một lúc). Tôi sợ thời gian nhập khẩu vào cơ sở dữ liệu lâu hơn.


5
Phiên bản nào của SQL Server? Nếu 2008+ âm thanh như một chỉ mục được lọc có thể là những gì bạn cần.
Martin Smith

SQL Server 2005
marioosh

1
Bạn có thể tách bảng (thêm một bảng mới chỉ có một cột, PK của bảng, sẽ được điền chỉ với các hàng mà cột bit là đúng - cuối cùng bạn thậm chí có thể xóa cột bit.) Chế độ xem cũng sẽ hoạt động vào năm 2005, với việc thiếu các chỉ mục một phần.
ypercubeᵀᴹ

Hãy cẩn thận với Chế độ xem được lập chỉ mục, như bạn đã đề cập, bạn có 10-20 lần chèn lớn mỗi ngày, việc duy trì chế độ xem được lập chỉ mục có thể vượt qua lợi ích của việc đạt được hiệu suất. Tôi không nghĩ bất kỳ "tính năng vượt trội" nào của SQL 2005 mà bạn có thể sử dụng để cải thiện tình hình của mình. nhưng nếu bạn liệt kê ra cấu trúc bảng hiện tại và chỉ mục hiện có, chúng ta có thể tìm thấy một số thiết kế thay thế.
Anup Shah

Câu trả lời:


8

Một chỉ mục trên một chút cho 1 triệu hồ sơ là vô ích. Trình tối ưu hóa sẽ không bao giờ sử dụng nó, bạn sẽ chỉ trả tiền cho việc duy trì nó. Một cách khác tốt hơn là thêm bit này làm khóa ngoài cùng bên trái trên chỉ mục được nhóm.

Nhưng tôi sẽ thực hiện một cú đánh mù trong bóng tối và đoán rằng những gì bạn có là một mẫu xếp hàng: các bản ghi được thả trong bảng với bit được đặt thành 'TRUE' (nghĩa là 'cần chế biến = true') và sau đó một quá trình nền sẽ xuất hiện đối với các bản ghi này, thực hiện một số xử lý và cập nhật bit lên FALSE. Đây là một mẫu có mặt ở khắp nơi, còn được gọi một cách trìu mến là 'mẫu công thức thảm họa hiệu suất'. Tôi sẽ khuyên bạn nên bỏ các bản ghi vào bảng và bỏ thông báo (có thể đơn giản như ID bản ghi mới được chèn), đồng thời, vào hàng đợi . Xem Sử dụng Bảng dưới dạng Hàng đợi .


1
Tôi không thấy bất kỳ điểm tốt nào trong việc đặt cột bit ở bên trái hầu hết vì chúng ta không biết các cột bộ lọc khác có người dùng Cardinalality cao có thể có. Cho đến nay tôi đã thấy cột BIT là lựa chọn cuối cùng trong chỉ mục cụm. nhưng có, +1 để tham khảo tốt về "Sử dụng bảng làm hàng đợi".
Anup Shah

2
Trên thực tế tôi đã chạy thử nghiệm và có nó sẽ sử dụng chỉ mục. Tạo bảng (nhận dạng Id, bit myBit) thêm 100 hàng trong đó bit là 0 và 2000000 trong đó bit là 1. Đảm bảo thống kê được cập nhật (nếu cần) và chạy truy vấn trên myBit = 0 và chỉ mục sẽ được sử dụng.
Kenneth Fisher

@KennethFisher ngoại trừ trong mẫu tốc độ cao điển hình của việc chèn TRUE / cập nhật lên FALSE ngay lập tức, các số liệu thống kê sẽ luôn bị lỗi thời. Nếu bạn thích chơi roulette Nga với trình tối ưu hóa hơn là thiết kế rõ ràng, bạn sẽ nhận được những gì bạn xứng đáng ...
Remus Rusanu

"Sẽ không bao giờ sử dụng nó" tuyên bố đó chiếm 99% các trường hợp, nhưng chúng tôi không biết OP đang ở trường hợp nào. Tôi đã lập chỉ mục thành công trên bit. Trường hợp sử dụng tồn tại.
usr

câu hỏi - là câu trả lời sai ở đây , cụ thể> "Khi bạn lập chỉ mục một trường bit (hoặc một phạm vi hẹp), bạn chỉ giảm tập làm việc theo số lượng hàng khớp với giá trị đó. Nếu bạn có một số lượng nhỏ hàng khớp với nó sẽ làm giảm tập hợp công việc của bạn rất nhiều . Đối với một số lượng lớn các hàng có phân phối 50/50, nó có thể mua cho bạn rất ít hiệu suất tăng so với việc giữ cho chỉ số được cập nhật. " Trong trường hợp nào, một chỉ số trên một bit phù hợp với 1% hồ sơ sẽ làm giảm nhu cầu quét 99% của 1 triệu để tăng đáng kể?
drzaus

2

Như @MartinSmith đã nói nếu bạn từng nâng cấp lên SQL 2008 thì một chỉ mục được lọc sẽ là giải pháp hoàn hảo. Tuy nhiên, trong thời gian trung bình như một trường hợp chung, BẤT K index chỉ số nào được thêm sẽ làm tăng thời gian tải của bạn. Chỉ số nhỏ ít hơn so với chỉ số lớn.

Một điều tôi sẽ xem xét là nếu bạn có một chỉ mục hiện có có thể được sửa đổi. Giả sử các truy vấn hiện tại của bạn đang sử dụng một chỉ mục nhất định, sau đó thêm cột bit vào cuối chỉ mục đó sẽ có hiệu quả tối thiểu đối với các phần chèn và hiệu ứng tích cực mà bạn đang tìm kiếm cho các truy vấn của mình.

Điều tiếp theo cần xem xét là "Tôi đã có rất nhiều chỉ mục chưa?" Không có quy tắc cứng và nhanh như "rất nhiều" là gì nhưng tôi thường tuân theo quy tắc 10 chỉ số là giới hạn trừ khi tôi THỰC SỰ cần một cái mới.

Suy nghĩ cuối cùng, kiểm tra nó trên một ví dụ thử nghiệm. Thiết lập một bảng có vài triệu hàng, chạy tải của bạn trên đó, thêm chỉ mục của bạn sau đó chạy lại tải của bạn và xem bạn có nhận thấy thời gian tải tăng đáng kể không.

Chỉ có bạn thực sự có thể quyết định "đáng kể" là gì. Tôi có các máy trong đó việc thêm 5 phút vào thời gian tải là "đáng kể" và các máy khác mà tôi có thể thấy một vài giờ tăng lên một cách an toàn.

BIÊN TẬP:

Một lựa chọn khác là phân vùng bảng của bạn. Bạn có thể phải sử dụng chế độ xem được phân vùng nếu bạn không sử dụng phiên bản Enterprise nhưng ngay cả như vậy cũng có ích. Bạn đặt bit 0 của bạn vào một phân vùng và bit 1 của bạn ở một phân vùng khác. Giả sử bạn chỉ chèn một phiên bản này hoặc phiên bản kia thì bạn thậm chí có thể tăng tốc độ chèn của mình.

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.