2009-08-27 31 views
24

Tôi có bảng sauIndexed Xem vs chỉ số trên Bảng

EVENT_LOG:

EVENT_ID: pk, int, not null 
TYPEID: fk, int, not null 
CATEGORYID: fk, int, null 
SOURCE: varchar(255), null 
DESCRIPTION: varchar(4000), null 
CREATED: datetime, null 

Chúng tôi đã tạo ra một báo cáo, và thấy hiệu suất mà hút. Không có bất kỳ chỉ mục nào ngoài nhóm chỉ mục. Chúng tôi có thể tạo ra chúng, nhưng vì bảng này được viết nhiều hơn nó được đọc từ - có một quan tâm trọng lượng hiệu suất truy cập. Đối với báo cáo, tôi có xu hướng đặt chỉ mục trên mỗi cột vì các cột mô tả & nguồn cần phải được tìm kiếm cho các bản chất.

Chúng tôi tự hỏi nếu indexed view (chế độ xem vật hoá AKA) sẽ là một tùy chọn, trong đó chế độ xem được lập chỉ mục sẽ chứa tất cả các cột từ bảng EVENT_LOG nhưng có chỉ mục thích hợp được tạo trên chế độ xem. Điều này có giúp chúng tôi thực hiện báo cáo, trong khi không ảnh hưởng đến việc ghi vào bảng EVENT_LOG không?

+3

Tôi đoán bạn nên sử dụng bản sao của bảng sản xuất cho mục đích báo cáo, giống như bản sao được sao chép mà bạn muốn điền vào với các thay đổi từ hoạt động hàng ngày nói một lần một đêm và sau đó bạn có thể có bất kỳ số chỉ mục nào để tăng tốc báo cáo. –

+0

Bạn cũng có thể cải thiện hiệu suất tìm kiếm chuỗi con bằng cách lập chỉ mục các cột văn bản ngược lại. – Matthew

Trả lời

25

Chế độ xem được lập chỉ mục sẽ gây ra các vấn đề tương tự như chỉ mục trên cột, vì các chế độ xem được lập chỉ mục yêu cầu with schemabinding, liên kết trực tiếp với bảng, không cho phép bạn thay đổi/thay đổi lược đồ của bảng đó theo bất kỳ cách nào, hình dạng, hoặc hình thức. Điều này bao gồm việc đổi kích thước cột (ví dụ: từ varchar(50) thành varchar(255)), thay đổi loại dữ liệu của cột (ví dụ: từ double thành decimal(18,5)), v.v. Tôi đã thấy chúng gây ra nhiều cơn đau đầu bất ngờ do thực tế này.

Đề xuất của tôi là thiết lập quy trình được lưu trữ hoặc gói SSIS sẽ tạo bảng báo cáo cho bạn chạy mỗi giờ một lần. Bằng cách này, bạn có thể lập chỉ mục địa ngục yêu thương từ đó và tận hưởng tất cả các lợi ích hiệu suất mà nó tạo ra. Tôi ngại chống lại báo cáo từ một hệ thống đang hoạt động, đang diễn ra. Tôi đã thực sự chưa nhìn thấy trường hợp này là cần thiết. Đối với mục đích báo cáo, thông tin về giờ thường hoàn toàn đủ để hoàn thành công việc.

+0

Không phải là có bất kỳ kế hoạch trực tiếp nào để thay đổi thông tin liên quan đến kiểu dữ liệu, nhưng sau khi hoàn thành - sẽ không cập nhật số liệu thống kê chăm sóc mọi thứ? Tôi đồng ý với bạn và marc_s rằng sao chép sang một bảng khác hoàn toàn có lẽ là lựa chọn tốt nhất. –

+0

xem mẫu CQRS, Udi Dahan thực hiện tốt công việc: http://www.udidahan.com/2009/12/09/clarified-cqrs/ – BlackICE

3

Tôi nghĩ rằng nó sẽ vẫn ảnh hưởng đến hiệu suất, vì các chỉ mục trên quan điểm vật chất cần phải được cập nhật tại một số điểm - có thể không cần phải đồng bộ với bảng viết.

Cá nhân tôi sẽ đặt các chỉ mục trên bảng và tự đánh giá hiệu suất ghi. Bạn có thể đoán về việc viết chậm hơn bao nhiêu với các chỉ mục trên đó, nhưng cho đến khi bạn thực sự đo lường nó, bạn chỉ cần suy đoán. Nó có thể không tạo ra sự khác biệt đáng chú ý chút nào.

1

Không nếu bạn định viết thư nếu thường xuyên, vì bạn có chi phí thực hiện của chỉ mục trên chế độ xem vật chất của bạn. Chế độ xem vật chất hóa nhiều hơn cho dữ liệu không thay đổi thường xuyên.

1

Tôi đã gặp sự cố tương tự. Quyết định thêm chỉ mục đa cột chống lại lời khuyên từ DBA. Trên máy phát triển của tôi và máy chủ (với sự cho phép của DBA), hiệu suất để viết tăng và báo cáo nhanh hơn đáng kể (17x) so với việc tạo các chỉ mục trên các cột riêng lẻ. Tại sao, tôi không biết kể từ khi tôi không phải là một DBA, nhưng tôi biết những điều cơ bản, và đôi khi giúp bạn nhìn xuyên qua rừng/cây cối. Vì vậy, tôi đồng ý với Eric Pertroelje, bạn phải thêm các chỉ mục và đo lường hiệu năng viết và thậm chí đo lường hiệu suất đọc.

3

"Nguồn & cột mô tả cần phải được tìm kiếm chuỗi con."

Khi bạn tìm kiếm cho chuỗi con trên varchar() cột, SQL Server sẽ không sử dụng bất kỳ chỉ số.(ngay cả khi bạn sao chép bảng và tạo các chỉ mục) Các chỉ mục không được sử dụng, nếu một ký tự tự nhiên được sử dụng khi bắt đầu chuỗi tìm kiếm của bạn.

Tôi đoán, tốt hơn hết là nên tạo Chỉ mục toàn văn trên 'Nguồn' và 'Mô tả', nếu bạn cần tìm kiếm các bản chất trong đó. Vì vậy, đề xuất của tôi sẽ là tạo một Chỉ mục Toàn văn trên các cột varchar() và thực hiện Thay đổi-Theo dõi dưới dạng Thủ công và chạy nó mỗi giờ hoặc lâu hơn khi không có DML ... sẽ làm giảm Tải trên INSERT statement

Các vấn đề liên quan