Chúng tôi có chế độ xem được tối ưu hóa cho các truy vấn mục đơn (200ms không song song):
select *
from OptimizedForSingleObjectIdView e2i
where ObjectId = 3374700
Nó cũng hoạt động trên các tập hợp nhỏ id tĩnh (~ 5).
select *
from OptimizedForSingleObjectIdView e2i
where ObjectId in (3374700, 3374710, 3374720, 3374730, 3374740);
Tuy nhiên, nếu các đối tượng đến từ một nguồn bên ngoài, thì nó tạo ra một kế hoạch chậm. Kế hoạch thực hiện cho thấy nhánh thực thi cho phần khung nhìn đang bỏ qua biến vị ngữ trên ObjectId trong khi trong trường hợp ban đầu, nó sử dụng chúng để thực hiện tìm kiếm chỉ mục.
select v.*
from
(
select top 1 ObjectId from Objects
where ObjectId % 10 = 0
order by ObjectId
) o
join OptimizedForSingleObjectIdView v -- (also tried inner loop join)
on v.ObjectId = o.ObjectId;
Chúng tôi không muốn đầu tư vào "kép" tối ưu hóa quan điểm cho các trường hợp không đơn lẻ. Thay vào đó, giải pháp mà chúng tôi "tìm kiếm" là gọi lặp lại chế độ xem một lần cho mỗi đối tượng mà không cần dùng đến SP .
Hầu hết thời gian giải pháp sau đây gọi hàng xem theo hàng. Tuy nhiên không phải lúc này và thậm chí không chỉ cho 1 đối tượng:
select v.*
from
(
select top 1 ObjectId
from Objects
where ObjectId % 10 = 0 -- non-trivial predicate
order by ObjectId
) o
cross apply
(
select top 2000000000 *
from OptimizedForSingleObjectIdView v_
where ObjectId = o.ObjectId
order by v_.SomeField
) v;
Đã có lúc tôi nghĩ rằng có một tuyên bố rằng việc áp dụng chéo được đảm bảo cho việc thực hiện theo hàng khi nó gọi UDF nhưng điều này cũng thất bại:
create function FunctionCallingView(@pObjectId bigint)
returns table
as
return select *
from OptimizedForSingleObjectIdView
where ObjectId = @pObjectId;
select v.*
from
(
select top 1 ObjectId
from Objects
where ObjectId % 10 = 0
order by ObjectId
) o
cross apply FunctionCallingView(o.ObjectId) v
Thêm tùy chọn (thứ tự lực lượng) không giúp ích - tuy nhiên đã có hai gợi ý băm trong chế độ xem. Tạm thời loại bỏ chúng không giúp ích và làm chậm trường hợp duy nhất.
Dưới đây là một đoạn của kế hoạch ước tính cho trường hợp chậm dựa trên chức năng. Ước tính của 1 hàng là chính xác. Xa xa về bên phải (không hiển thị) là nơi có một vị từ tìm kiếm không bao gồm kết quả top 1 đó. Điều này có vẻ tương tự như các trường hợp khác mà chúng ta có trong đó các giá trị thăm dò số ít từ các tìm kiếm bảng không được sử dụng như các vị từ tìm kiếm ở nơi khác.
OPTION(FAST 1)
gợi ý?