2012-08-06 24 views
17

Làm thế nào tôi có thể làm giảm chỉ số clustered quét chi phí dưới đây đề cập truy vấnLàm thế nào để giảm clustered index quét chi phí bằng cách sử dụng SQL query

DECLARE @PARAMVAL varchar(3) 

set @PARAMVAL = 'CTD' 
select * from MASTER_RECORD_TYPE where [email protected] 

nếu tôi chạy các truy vấn trên nó được hiển thị chỉ số quét 99%

Hãy tìm thấy ở đây dưới đây đặc thù bàn của tôi:

enter image description here

đây dưới đây tôi đã dán chỉ số của tôi cho bảng:

CREATE TABLE [dbo].[MASTER_RECORD_TYPE] ADD CONSTRAINT [PK_MASTER_REPORD_TYPE] PRIMARY KEY CLUSTERED 
(
    [Record_Type_Id] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 80) ON [PRIMARY] 
GO 

vui lòng cho biết làm cách nào để giảm chi phí quét chỉ mục?

Trả lời

23

Trước hết - nếu bạn tìm kiếm RECORD_TYPE_CODE, bạn nên đảm bảo có chỉ mục trên cột đó.

Bên cạnh đó chủ yếu là hai điều:

  • không sử dụng SELECT * - mà sẽ luôn luôn phải quay trở lại với chỉ số nhóm để có được những trang dữ liệu đầy đủ; sử dụng số SELECT chỉ định rõ các cột nào sử dụng

  • nếu có thể, hãy thử tìm cách để có một bao gồm chỉ số không được chỉ định, ví dụ: một chỉ mục có chứa tất cả các cột cần thiết để đáp ứng truy vấn

Nếu bạn có chỉ mục bao gồm không, thì trình tối ưu hóa truy vấn nhiều khả năng sẽ sử dụng chỉ mục bao phủ đó dữ liệu bảng) để tìm nạp kết quả

+0

cảm ơn bạn đã trả lời nhanh chóng, bạn có thể xin vui lòng hướng dẫn cho tôi để tạo ra một chỉ số clustered không bao gồm, những phím được đưa vào chỉ số mà bạn có thể giúp tôi ra đời trên – user1494292

+1

này CREATE nonclustered INDEX [MST_IDX_FOR_REC_TYPE ] ON [dbo].[MASTER_RECORD_TYPE] ( \t [Record_Type_Code] ASC ) VỚI (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [TIỂU ] GO Bây giờ quét chỉ mục đã được chuyển thành chỉ mục tìm kiếm 100% – user1494292

+1

@ user1494292: OK - vì vậy bây giờ bạn có chỉ mục ** tìm kiếm ** - cách hiệu quả nhất (và nhanh nhất) để tìm nạp (một vài hàng trong số) dữ liệu –

0

Bạn cần thử và sử dụng chỉ mục được bao phủ. Nhưng vấn đề bạn sẽ gặp phải là bạn đang sử dụng SELECT *. Bạn có thực sự cần toàn bộ hồ sơ?

Dù bằng cách nào, hãy thêm RECORD_TYPE_CODE vào một chỉ mục khác và nó sẽ giúp với truy vấn vì ít nhất trường đó có thể được đọc ra khỏi trang chỉ mục.

+0

hi mate, cảm ơn câu trả lời nhanh chóng của bạn, mặc dù nếu tôi sử dụng lựa chọn 1 từ Master_record_type thì chi phí quét chỉ mục tương tự đã được ném – user1494292

0

Trong truy vấn của bạn, bạn đã sử dụng cột RECORD_TYPE_CODE không phải là một phần của clustered index và cũng không được bao gồm trong bất kỳ số non-clustered index nào nữa. Vì vậy, SQL Optimizer sẽ quyết định quét chỉ mục nhóm để so sánh vị từ mệnh đề where.

Why is there a scan on my clustered index?

+0

Um, vâng, nó là một phần của chỉ mục nhóm = bảng. Không có chỉ mục nào khác. – Suncat2000

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