Chúng tôi có một bảng với dữ liệu không gian và một số thuộc tính và cần tổng hợp nó để có thể sử dụng nó trong các truy vấn khác nhau. Chúng tôi có cơ chế thực hiện tổng hợp nhanh chóng thông qua các thủ tục được lưu trữ CLR nhưng tôi đã tự hỏi đâu là cách tốt nhất để lưu trữ dữ liệu tổng hợp này trong SQL Server 2008 R2 vì việc tổng hợp rất chậm.
Vì vậy, chúng tôi có bảng như thế này:
[TableId] [int] NOT NULL,
[FeatureId] [int] NOT NULL,
[MeasureFrom] [float] NOT NULL,
[MeasureTo] [float] NOT NULL,
[Value] [smallint] NOT NULL,
[Timestamp] [datetime2](7) NOT NULL
FeatureId, ĐoFrom và Đo lường Về cơ bản xác định một khoảng và Xếp hạng là giá trị của khoảng này. Lưu ý rằng FeatureId thực sự tham chiếu một dòng thực (hình dạng) từ một bảng khác. Hiện tại chúng tôi có khoảng 250 nghìn hàng trong bảng này với các khoảng thời gian chồng chéo và dấu thời gian khác nhau (hồ sơ lịch sử). Quá trình tổng hợp của chúng tôi cố gắng tìm Giá trị mới nhất trong tất cả các khoảng thời gian để nó cần cắt và nối các khoảng dựa trên dấu thời gian và giữ giá trị liên quan.
Vì truy vấn nhanh đang chậm và chiếm nhiều tài nguyên, chúng tôi nghĩ rằng chúng tôi có thể cần phải tạo một cơ sở dữ liệu khác lưu trữ kết quả của tổng hợp này. Bảng nguồn được cập nhật liên tục (nhưng không quá thường xuyên, một lần trong một vài ngày).
Điều gì sẽ là cách tốt nhất để tạo cơ sở dữ liệu này và giữ cho các giá trị tổng hợp được cập nhật? Tôi có thể nghĩ về việc sử dụng kích hoạt, hoặc nhiệm vụ theo lịch trình. Tôi không có kinh nghiệm với SSAS nhưng điều đó có phù hợp hơn không?
Chỉ cần lưu ý, chúng tôi có một vài bảng tương tự lưu trữ các giá trị hơi khác nhau (một số có nhiều cột Giá trị) và do đó là lý do cho một cơ sở dữ liệu riêng biệt thay vì một bảng khác trong cơ sở dữ liệu gốc.
Làm thế nào nhanh chóng việc truy vấn cơ sở dữ liệu riêng biệt này từ cơ sở dữ liệu ban đầu bằng cách sử dụng tham gia cơ sở dữ liệu chéo?
Đã chỉnh sửa: Để chứng minh "tập hợp" của chúng tôi làm gì, đây là một số dữ liệu mẫu:
FeatureId | MeasureFrom | MeasureTo | Value | Timestamp
1 | 1 | 20 | 2 | 2015-01-01
1 | 5 | 15 | 3 | 2015-01-02
1 | 9 | 10 | 8 | 2015-01-03
Và kết quả chúng ta đang nhận được:
FeatureId | MeasureFrom | MeasureTo | Value | Timestamp
1 | 1 | 5 | 2 | 2015-01-01
1 | 5 | 9 | 3 | 2015-01-02
1 | 9 | 10 | 8 | 2015-01-03
1 | 10 | 15 | 3 | 2015-01-02
1 | 15 | 20 | 2 | 2015-01-01
Như bạn có thể thấy, kết quả thực sự chứa nhiều hàng hơn dữ liệu gốc. Về cơ bản chúng ta cần Giá trị mới nhất tại bất kỳ điểm nào trong khu vực. Giá trị mới nhất được xác định dựa trên giá trị trong cột Dấu thời gian. Khi có một khoảng cách trong các khoảng, điều này sẽ lan truyền đến tập dữ liệu kết quả.
Mã này thực sự được viết bằng .NET và nó khá phức tạp. Thuật toán như sau: Nhận tất cả dữ liệu cho một tính năng quan tâm, sắp xếp các bản ghi theo dấu thời gian giảm dần, xử lý tất cả các bản ghi trong một vòng lặp. Lấy khoảng thời gian (Số đo từ, Số đo), cắt nó với kết quả mà bạn có, nếu bạn nhận được một phần mà bạn chưa có, hãy thêm nó vào kết quả. Tiếp tục với bản ghi tiếp theo. Dữ liệu đại diện cho các cuộc khảo sát được thực hiện thường xuyên để bạn càng đi đúng giờ, càng nhiều dữ liệu sẽ bị loại bỏ vì bạn sẽ có Giá trị mới hơn cho cùng một Khoảng thời gian.
Các cuộc khảo sát được đưa ra với Dấu thời gian ngẫu nhiên, vì vậy không phải lúc nào nó cũng là cuộc khảo sát mới nhất. Quá trình tương tự sau đó được lặp lại cho các tính năng khác vì bạn có thể quan tâm đến việc nhận giá trị cho một vài tính năng cùng một lúc. Và đây là kết quả mọi người sẽ truy vấn thường xuyên.
Lý tưởng nhất là chúng tôi muốn giữ kết quả tổng hợp càng gần với thời gian thực càng tốt.
Để giải thích thuật toán cần thiết hơn một chút, hãy xem liên kết được đăng bởi @dnoeth (trong phần bình luận bên dưới) http://sqlmag.com/sql-server/packing-inter đạn-p Warriorities . Nó giải quyết vấn đề tương tự với sự khác biệt của việc sử dụng các ưu tiên thay vì Dấu thời gian và giải pháp được mô tả sử dụng các tính năng từ SQL Server 2012.