2011-01-28 37 views
5

Ai đó có thể giúp tôi điều chỉnh truy vấn SQL này không?Tại sao kết quả SQL này trong Quét chỉ mục thay vì Tìm kiếm chỉ mục?

SELECT a.BuildingID, a.ApplicantID, a.ACH, a.Address, a.Age, a.AgentID, a.AmenityFee, a.ApartmentID, a.Applied, a.AptStatus, a.BikeLocation, a.BikeRent, a.Children, 
     a.CurrentResidence, a.Email, a.Employer, a.FamilyStatus, a.HCMembers, a.HCPayment, a.Income, a.Industry, a.Name, a.OccupancyTimeframe, a.OnSiteID, 
     a.Other, a.ParkingFee, a.Pets, a.PetFee, a.Phone, a.Source, a.StorageLocation, a.StorageRent, a.TenantSigned, a.WasherDryer, a.WasherRent, a.WorkLocation, 
     a.WorkPhone, a.CreationDate, a.CreatedBy, a.LastUpdated, a.UpdatedBy 
FROM dbo.NPapplicants AS a INNER JOIN 
     dbo.NPapartments AS apt ON a.BuildingID = apt.BuildingID AND a.ApartmentID = apt.ApartmentID 
WHERE (apt.Offline = 0) 
AND  (apt.MA = 'M') 

.

Đây là kế hoạch thực hiện như sau:

.

enter image description here

Những gì tôi không hiểu là tại sao tôi nhận được một Scan Index cho NPapplicants. Tôi có một chỉ số bao gồm BuildingID và ApartmentID. Không nên được sử dụng?

+0

Có bao nhiêu hàng trong bảng NPapplicants? –

+0

hình ảnh hiển thị 7775, từ số liệu thống kê cập nhật mới nhất – RichardTheKiwi

Trả lời

6

Đó là vì nó dự kiến ​​gần 10 nghìn bản ghi để trả về từ các kết quả phù hợp. Để quay trở lại dữ liệu để lấy các cột khác bằng cách sử dụng các khóa 10K tương đương với một cái gì đó giống như hiệu suất của việc quét 100K bản ghi (ít nhất) và lọc bằng cách sử dụng kết hợp băm.

Để truy cập vào bảng khác, Trình tối ưu hóa truy vấn đã quyết định rằng chỉ mục của bạn hữu ích (có thể là chống lại Offline hoặc MA) để tìm kiếm chỉ mục đó để nhận khóa tham gia.

Hai giá trị này sau đó là HASH khớp với các giao lộ để tạo ra kết quả cuối cùng.

+0

Cảm ơn bạn đã phản hồi. Vì vậy, bạn có nói rằng không có nhiều tôi có thể làm. Truy vấn là về tinh chỉnh vì nó sẽ nhận được nhiều dữ liệu đó để trả về? – Axeva

+0

Đối với số lượng cột đó từ bảng người nộp đơn - có, điều đó tốt như vậy. Trừ khi các bộ lọc trên 'căn hộ (Offline, MA)' thực sự thực sự chọn lọc (như 1% hoặc ít hơn) và 'đếm (căn hộ) <đếm (người nộp đơn)' như vậy mà nó có thể sản xuất chỉ một vài phím mà INDEX SEEK trên người nộp đơn. – RichardTheKiwi

3

Tìm kiếm trong chỉ mục B-Tree tốn nhiều lần so với quét bảng (mỗi bản ghi).

Ngoài ra, tìm kiếm khác trong chỉ mục nhóm sẽ được thực hiện để truy lục giá trị của các cột khác.

Nếu một phần lớn các bản ghi được mong đợi sẽ khớp, thì sẽ rẻ hơn khi quét chỉ mục nhóm.

Để chắc chắn rằng tôi ưu hoa đã chọn phương pháp tốt nhất, bạn có thể chạy này:

SET STATISTICS IO ON 
SET STATSTICS TIME ON 

SELECT a.BuildingID, a.ApplicantID, a.ACH, a.Address, a.Age, a.AgentID, a.AmenityFee, a.ApartmentID, a.Applied, a.AptStatus, a.BikeLocation, a.BikeRent, a.Children, 
     a.CurrentResidence, a.Email, a.Employer, a.FamilyStatus, a.HCMembers, a.HCPayment, a.Income, a.Industry, a.Name, a.OccupancyTimeframe, a.OnSiteID, 
     a.Other, a.ParkingFee, a.Pets, a.PetFee, a.Phone, a.Source, a.StorageLocation, a.StorageRent, a.TenantSigned, a.WasherDryer, a.WasherRent, a.WorkLocation, 
     a.WorkPhone, a.CreationDate, a.CreatedBy, a.LastUpdated, a.UpdatedBy 
FROM dbo.NPapplicants AS a INNER JOIN 
     dbo.NPapartments AS apt ON a.BuildingID = apt.BuildingID AND a.ApartmentID = apt.ApartmentID 
WHERE (apt.Offline = 0) 
AND  (apt.MA = 'M') 

SELECT a.BuildingID, a.ApplicantID, a.ACH, a.Address, a.Age, a.AgentID, a.AmenityFee, a.ApartmentID, a.Applied, a.AptStatus, a.BikeLocation, a.BikeRent, a.Children, 
     a.CurrentResidence, a.Email, a.Employer, a.FamilyStatus, a.HCMembers, a.HCPayment, a.Income, a.Industry, a.Name, a.OccupancyTimeframe, a.OnSiteID, 
     a.Other, a.ParkingFee, a.Pets, a.PetFee, a.Phone, a.Source, a.StorageLocation, a.StorageRent, a.TenantSigned, a.WasherDryer, a.WasherRent, a.WorkLocation, 
     a.WorkPhone, a.CreationDate, a.CreatedBy, a.LastUpdated, a.UpdatedBy 
FROM dbo.NPapplicants WITH (INDEX (index_name)) AS a 
INNER JOIN 
     dbo.NPapartments AS apt ON a.BuildingID = apt.BuildingID AND a.ApartmentID = apt.ApartmentID 
WHERE (apt.Offline = 0) 
AND  (apt.MA = 'M') 

Thay index_name với tên thực tế của chỉ số của bạn và so sánh thời gian thực hiện và số lượng I/O hoạt động (như thấy trong tab thông báo)

+1

Thú vị. Không có chỉ mục: Thời gian CPU = 93 ms, thời gian trôi qua = 679 ms. /// Với chỉ mục: Thời gian CPU = 172 ms, thời gian trôi qua = 666 ms. – Axeva

+0

@Axeva: như bạn có thể thấy, người tối ưu hóa mama không nuôi nấng. Trên các trường không chọn lọc, tìm kiếm chỉ mục đắt hơn, đặc biệt là với chỉ mục không bao gồm. – Quassnoi

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