Gần đây chúng tôi đã gặp phải vấn đề điểm tới hạn và một số truy vấn báo cáo được sử dụng để hoàn thành thực thi trong vài giây hiện mất hơn 2 phút vì trình tối ưu hóa truy vấn chỉ đơn giản bỏ qua chỉ mục không được nhóm trên cột tìm kiếm. Một truy vấn ví dụ dưới đây:
select top 100 *
from [dbo].[t_Call]
where ID > 0
and throwtime between '3/20/2014 7:00:00 AM' and '3/24/2014 6:59:59 AM'
order by id
Các ID
cột là clustered Index và Throwtime
có chỉ số nonclustered. Trong trường hợp này, chúng tôi nhận thấy rằng việc đặt hàng throwtime
thay vì thay ID
đổi kế hoạch truy vấn và chỉ mục không bao gồm được sử dụng. Chúng tôi cũng đang dự định lưu trữ một số dữ liệu cũ (hiện tại nó có 20 hàng hàng !!). Nhưng thực hiện những thay đổi này trong ứng dụng sẽ mất một thời gian và tôi cần tìm cách làm cho các báo cáo chạy nhanh một cách hợp lý, mà không thực hiện thay đổi ở cấp ứng dụng (ồ, đó là cuộc sống!).
Nhập hướng dẫn kế hoạch. Tôi đã tạo hướng dẫn kế hoạch dưới đây với một gợi ý truy vấn chỉ mục không bao gồm và vì một số lý do, chỉ mục không bao gồm vẫn không được sử dụng. Tui bỏ lỡ điều gì vậy?
EXEC sp_create_plan_guide
@name = N'[prod2reports_callthrowtime]',
@stmt = N'select top 100 *
from [dbo] . [t_Call]
where ID > @0 and @1 < = ThrowTime and ThrowTime < = @2 order by ID',
@type = N'SQL',
@module_or_batch = N'select top 100 *
from [dbo] . [t_Call]
where ID > @0 and @1 < = ThrowTime and ThrowTime < = @2 order by ID',
@params = N'@0 int, @1 datetime, @2 datetime',
@hints = N'OPTION (TABLE HINT( [dbo] . [t_Call],
INDEX(IDX_NC_t_call_ThrowtimeProblemCodes)))'
GO
throwtime between '3/20/2014 7:00:00 AM' and '3/24/2014 6:59:59 AM'
thành throwtime >= '20140320 07:00' AND throwtime < '20140324 07:00';
- vui lòng xem bài đăng trên blog này và cả bài này .