Tôi có hai bảng: chi tiết và tổng số các chi tiết này.
Chi tiết ( Giải pháp chậm ):
select
OrderId = r.OrderId
, TotalQty = SUM(r.Quantity)
, TotalGrossConsid = SUM(r.Price * r.Quantity)
from dbo.Order r
group by r.OrderId
Tổng cộng ( Giải pháp nhanh ):
select
t.OrderId
, t.TotalQty
, t.TotalGrossConsid
, t.IsValid
from dbo.OrderTotal t
Đôi khi tổng số trở nên không hợp lệ (một số công việc phải tính toán lại tổng số thay đổi nhưng nó bị trì hoãn). Khi bạn hiểu truy vấn thứ hai nhanh hơn và số lượng tổng hợp lệ nhiều hơn thì không hợp lệ. Vì vậy, tôi đang tìm kiếm một truy vấn kết hợp trả về tổng số hợp lệ từ bảng thứ hai (tổng) và trả về tổng số được tính toán lại động bằng cách sử dụng truy vấn chậm đầu tiên. Vì vậy, mục tiêu của tôi sẽ đạt được: tất cả các tổng số là hợp lệ và thời gian để phản hồi nhanh hơn sau đó tính toán lại đầy đủ.
Đây là nỗ lực của tôi ( Giải pháp lai ):
with fast_static(OrderId, TotalQty, TotalGrossConsid, IsValid)
as
(
select
t.OrderId
, t.TotalQty
, t.TotalGrossConsid
, t.IsValid
from dbo.OrderTotal t
)
, slow_dynamic(OrderId, TotalQty, TotalGrossConsid)
(
select
OrderId = r.OrderId
, TotalQty = SUM(r.Quantity)
, TotalGrossConsid = SUM(r.Price * r.Quantity)
from dbo.Order r
)
select
OrderId, TotalQty, TotalGrossConsid
from fast_static
where IsValid = 1
union all
select
OrderId, TotalQty, TotalGrossConsid
from slow_dynamic s
--inner join fast_static ff
--on ff.OrderId = s.OrderId
where --ff.Valid = 0 -- too slow!!!
s.OrderId in (select OrderId from fast_static f where f.Valid = 0)
Tôi đã so sánh giải pháp Nhanh và kết hợp một, tôi nhận được 32% đến 68% (chi phí truy vấn tương đối). Nếu bạn có thể thấy biến thể nhận xét, nó bằng 1% đến 99% (quá tệ). Có thể cải thiện truy vấn này?
THÊM
@gbn:
Valid = case when i.OrderId is null then 1 else 0 end
...
dbo.OrderTotal t left join dbo.InvalidOrders i
Có, tôi có một công việc để tính toán lại tổng số và quá trình này không được đồng bộ hóa với các yêu cầu truy vấn. Các bảng không hợp lệ là một bảng nhỏ lưu trữ các bản ghi để biết rằng tổng số không hợp lệ (được tính toán lại)
GIẢI PHÁP
Quan điểm được lập chỉ mục là sự lựa chọn tốt nhất. Lưu ý về phiên bản SQL Server ( gợi ý không giới hạn cho các phiên bản không dành cho doanh nghiệp) và sẵn sàng tạo lại một số đối tượng cơ sở dữ liệu ( SET ANSI_NULLS ON, SET QUOTED_IDENTIFIER ON
) để bắt đầu sử dụng các khung nhìn được lập chỉ mục ở phía máy khách.
details
. Đây có vẻ như là một vấn đề OLAP đối với tôi - các tổng hợp được tính toán trước để cải thiện hiệu năng truy vấn trong