2009-10-02 29 views
5

Chúng tôi có một bảng với hàng 17 triệu có chứa thuộc tính sản phẩm, chúng ta hãy nói rằng họ đang:SQL Server uẩn cho các bảng rất lớn

brandID, sizeID, colorID, giá cả, shapeID

Và chúng ta cần phải truy vấn tổng hợp theo thương hiệu và kích thước. Hiện tại, chúng tôi truy vấn và lọc dữ liệu này bằng cách thực hiện một việc như sau:

select brandID, sizeID, count(*) 
from table where colorID in (1,2,3) and price=10 and shapeID=17 
--"additional complex where clause here" 
group by brandID, sizeID 
order by brandID, sizeID 

Và chúng tôi báo cáo dữ liệu này. Vấn đề là, phải mất 10 giây hoặc lâu hơn để chạy truy vấn này (và đây là một ví dụ rất đơn giản) mặc dù dữ liệu thực tế được trả lại sẽ chỉ là vài trăm hàng.

Tôi nghĩ rằng chúng tôi đã đạt đến khả năng lập chỉ mục bảng này nên tôi không nghĩ rằng bất kỳ số lượng chỉ mục nào sẽ đưa chúng tôi đến kết quả gần như ngay lập tức.

Tôi biết rất ít về OLAP hoặc các dịch vụ phân tích khác, nhưng những gì có sẵn cho SQL Server có thể lọc trước hoặc tổng hợp trước bảng này sao cho các truy vấn như trên (hoặc dữ liệu tương đương trở về tương tự) có thể được thực hiện? HOẶC Cách tốt nhất để xử lý tùy ý khi mệnh đề trên một bảng rất lớn là gì?

+0

Bạn có thể cho chúng ta một ý tưởng về tần số và độ tươi của dữ liệu, tức là 'Có người chạy này mỗi 15 phút và dữ liệu cần phải được cập nhật' hoặc 'Rất nhiều người chạy cả ngày nhưng chúng tôi rất vui khi thấy dữ liệu đến ngày hôm qua '(ứng cử viên chính cho hình lập phương hoặc chế độ xem được lập chỉ mục) –

Trả lời

0

Nếu không có chi tiết cụ thể về cấu trúc bảng và môi trường vật lý và chỉ mục nhóm (không), vị trí đầu tiên tôi sẽ tìm nút cổ chai là "Hiển thị kế hoạch thực hiện" cho truy vấn, Trình quản lý cơ sở dữ liệu và trình lược tả SQL. Hi vọng điêu nay co ich.

4

Tôi nghĩ rằng đây là một ứng cử viên hoàn hảo cho một khối olap. Tôi có dữ liệu thực tế với hàng trăm triệu hàng. Tôi đã thực hiện các loại truy vấn mà bạn đã mô tả ở trên và các truy vấn đã trở lại sau vài phút. Tôi đã chuyển nó thành một khối OLAP và các truy vấn bây giờ gần như tức thời. Có một chút của một đường cong học tập cho olap. Tôi khuyên bạn nên tìm một hướng dẫn về một số khối lập phương đơn giản chỉ để có được đầu của bạn xung quanh nó. Các đồng nghiệp của DBA đã nói với tôi về hình khối trong nhiều năm và tôi chưa bao giờ nhận được nó. Bây giờ tôi không biết tại sao tôi đã đi quá lâu mà không có nó.

Ngoài OLAP, bạn cũng có thể muốn nghiên cứu các khung nhìn được lập chỉ mục nhưng nếu bạn cắt dữ liệu theo nhiều cách, điều đó có thể không khả thi.

+1

Đúng nếu tôi sai, nhưng khối OLAP cần được làm mới (hoặc được biên dịch lại, tôi không nhớ từ chính xác) để dữ liệu được cập nhật. Vì vậy, nếu Jody Powlette cần dữ liệu thời gian thực, nó có thể không phải là giải pháp tốt nhất. – MaxiWheat

+0

Tải dữ liệu trong lược đồ sao có thể được coi là "OLAP của người nghèo". –

+0

Tôi đồng ý với Matt về vấn đề này. Có, họ cần phải được tái xử lý và triển khai lại với các bản cập nhật nhưng nếu bảng Jody nói về đang được sử dụng cho các báo cáo, họ có thể lên lịch các cập nhật cụ thể này thường xuyên nếu cần mà không làm gián đoạn dịch vụ và quyền truy cập. – ajdams

0

Phụ thuộc vào chỉ số và giản đồ của bạn

Dù sao, chỉ số của bạn cho truy vấn này nên là một trong

CREATE INDEX IX_foo ON table (shapeID, price, colorID) INCLUDE (brandID, sizeID) 
CREATE INDEX IX_foo ON table (shapeID, price, colorID, brandID, sizeID) 

Tuy nhiên, bạn thêm "bổ sung phức tạp mệnh đề where here" mà giảm nhẹ so với một câu trả lời tốt

suy nghĩ của tôi:

  • Các mệnh đề WHERE là rất quan trọng bởi vì điều này làm giảm hàng đếm
  • Các ORDER BY là ít quan trọng hơn so với tổng/Ở ĐÂU
  • Bìa truy vấn để loại bỏ tra cứu chủ chốt

điều Extra:

  • Các colorID trong (1,2, 3) không hợp lệ vì đó là số an toàn HOẶC
  • Đảm bảo kiểu dữ liệu thông số cột khớp dữ liệu tham số chính xác để tránh chuyển đổi tiềm ẩn
  • Bạn có thể hoán đổi hình dạngID, Giá và colorID quanh một chút để xem những gì tốt nhất (hoặc tạo một vài chỉ mục và xem chỉ mục nào) (
  • Bạn có tắc nghẽn máy chủ (ví dụ: chạy trên SQL Express, v.v ...) không?
0

Nếu bạn đang sử dụng SQL 2008 và có một số bộ lọc thường được sử dụng, hãy xem xét sử dụng chỉ mục đã lọc (có thể kết hợp với chỉ mục INCLUDE như gbn được đề xuất).

Giả sử bạn chỉ có năm giá trị sizeID. Bạn có thể chia chỉ mục hiện tại của mình thành nhiều chỉ mục được lọc (ví dụ: "WHERE sizeID = 1").

Sử dụng bộ lọc kết hợp với INCLUDE có thể làm cho truy vấn của bạn trả lại nhiều hơn nhanh hơn.

tham khảo: Exploring SQL Server 2008’s Filtered Indexes

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