Làm thế nào để làm cho một quan điểm công đoàn thực hiện hiệu quả hơn?


8

Tôi có một bảng lớn (hàng chục đến hàng trăm triệu bản ghi) mà chúng tôi đã chia vì lý do hiệu suất thành các bảng hoạt động và lưu trữ, sử dụng ánh xạ trường trực tiếp và chạy quy trình lưu trữ mỗi đêm.

Ở một số vị trí trong mã của chúng tôi, chúng tôi cần chạy các truy vấn kết hợp các bảng hoạt động và lưu trữ, hầu như luôn được lọc bởi một hoặc nhiều trường (mà rõ ràng chúng tôi đã đặt chỉ mục vào cả hai bảng). Để thuận tiện, sẽ có ý nghĩa khi có một cái nhìn như thế này:

create view vMyTable_Combined as
select * from MyTable_Active
union all
select * from MyTable_Archive

Nhưng nếu tôi chạy một truy vấn như

select * from vMyTable_Combined where IndexedField = @val

nó sẽ kết hợp mọi thứ từ Active và Store trước khi lọc @val, điều này sẽ giết chết hiệu suất.

Có cách nào thông minh để làm cho hai truy vấn phụ của liên kết xem từng bộ lọc @valtrước khi chúng tạo liên kết không?

Hoặc có thể có một số cách tiếp cận khác mà bạn muốn đề xuất để đạt được những gì tôi sẽ làm, tức là một cách dễ dàng và hiệu quả để lấy bản ghi liên minh, được lọc bởi trường được lập chỉ mục?

EDIT: đây là kế hoạch thực hiện (và bạn có thể thấy tên bảng thực ở đây):

kế hoạch thực hiện

Thật kỳ lạ, bảng hoạt động thực sự đang sử dụng chỉ mục chính xác (cộng với tra cứu RID?) Nhưng bảng lưu trữ đang thực hiện quét bảng!


Bình luận không dành cho thảo luận mở rộng; cuộc trò chuyện này đã được chuyển sang trò chuyện .
Paul White 9

Câu trả lời:


8

Các ý kiến ​​về câu hỏi cho thấy vấn đề là cơ sở dữ liệu thử nghiệm mà OP đang sử dụng để phát triển truy vấn có các đặc điểm dữ liệu hoàn toàn khác với cơ sở dữ liệu sản xuất. Nó có ít hàng hơn nhiều và trường được sử dụng để lọc không đủ chọn lọc.

Khi số lượng giá trị riêng biệt trong một cột quá nhỏ, chỉ mục có thể không đủ chọn lọc. Trong trường hợp này, quét bảng tuần tự rẻ hơn so với thao tác tìm kiếm / tìm kiếm chỉ mục. Thông thường, quét bảng giúp sử dụng nhiều I / O tuần tự, nhanh hơn nhiều so với đọc truy cập ngẫu nhiên.

Thông thường, nếu một truy vấn sẽ trả về nhiều hơn chỉ một vài phần trăm hàng thì sẽ rẻ hơn nếu chỉ quét bảng so với tìm kiếm / tìm kiếm chỉ mục hoặc thao tác tương tự sử dụng nhiều I / O ngẫu nhiên.


1

Chỉ cần thêm, những gì tôi tìm thấy. Nếu bạn làm:

create view vMyTable_Combined as
select *, 1 AS [Active] from MyTable_Active
union all
select *, 0 AS [Active] from MyTable_Archive

Sau đó, bạn có thể lọc trên trường [Hoạt động] và đảm bảo rằng phần khác không được tải.

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.