Câu hỏi điều chỉnh chỉ số


8

Tôi đang điều chỉnh một số chỉ mục và thấy một số vấn đề muốn xin lời khuyên của bạn

Trên 1 bảng có 3 chỉ mục

dbo.Address.IX_Address_ProfileId 
[1 KEY] ProfileId {int 4}
Reads: 0 Writes:10,519

dbo.Address.IX_Address 
[2 KEYS] ProfileId {int 4}, InstanceId {int 4}
Reads: 0 Writes:10,523

dbo.Address.IX_Address_profile_instance_addresstype
[3 KEYS] ProfileId {int 4}, InstanceId {int 4}, AddressType {int 4}
Reads: 149677 (53,247 seek) Writes:10,523

1- Tôi có thực sự cần 2 chỉ mục đầu tiên, hay tôi nên bỏ chúng?

2- có các truy vấn đang chạy sử dụng điều kiện trong đó profileid = xxxx và điều kiện sử dụng khác trong đó profileid = xxxx và InstanceID = xxxxxx. Tại sao trình tối ưu hóa chọn chỉ số thứ 3 chứ không phải thứ 1 hay thứ 2?

Ngoài ra tôi đang chạy một truy vấn có được Khóa chờ trên mỗi chỉ mục. Nếu tôi nhận được những số đếm này, tôi nên làm gì để điều chỉnh chỉ số này?

Row lock waits: 484; total duration: 59 minutes; avg duration: 7 seconds; 
Page lock waits: 5; total duration: 11 seconds; avg duration: 2 seconds; 
Lock escalation attempts: 36,949; Actual Escalations: 0.

cấu trúc bảng là

TABLE [dbo].[Address](
[Id] [int] IDENTITY(1,1) NOT FOR REPLICATION NOT NULL,
[AddressType] [int] NULL,
[isPreferredAddress] [bit] NULL,
[StreetAddress1] [nvarchar](255) NULL,
[StreetAddress2] [nvarchar](255) NULL,
[City] [nvarchar](50) NULL,
[State_Id] [int] NOT NULL,
[Zip] [varchar](20) NULL,
[Country_Id] [int] NOT NULL,
[CurrentUntil] [date] NULL,
[CreatedDate] [datetime] NOT NULL,
[UpdatedDate] [datetime] NOT NULL,
[ProfileId] [int] NOT NULL,
[InstanceId] [int] NOT NULL,
[County_id] [int] NULL,
 CONSTRAINT [PK__Address__3214EC075E4BE276] PRIMARY KEY CLUSTERED 
(
   [Id] ASC
 )

đây là một ví dụ (truy vấn này được tạo bởi hibernate nên trông lạ)

(@P0 bigint)select addresses0_.ProfileId as Profile15_109_1_
, addresses0_.Id as Id1_20_1_
, addresses0_.Id as Id1_20_0_
, addresses0_.AddressType as AddressT2_20_0_
, addresses0_.City as City3_20_0_
, addresses0_.Country_Id as Country_4_20_0_
, addresses0_.County_id as County_i5_20_0_
, addresses0_.CreatedDate as CreatedD6_20_0_
, addresses0_.CurrentUntil as CurrentU7_20_0_
, addresses0_.InstanceId as Instance8_20_0_
, addresses0_.isPreferredAddress as isPrefer9_20_0_
, addresses0_.ProfileId as Profile15_20_0_
, addresses0_.State_Id as State_I10_20_0_
, addresses0_.StreetAddress1 as StreetA11_20_0_
, addresses0_.StreetAddress2 as StreetA12_20_0_
, addresses0_.UpdatedDate as Updated13_20_0_
, addresses0_.Zip as Zip14_20_0_ 
from dbo.Address addresses0_ 
where addresses0_.ProfileId=@P0 

nhập mô tả hình ảnh ở đây

(@P0 bigint,@P1 bigint)
select addressdmo0_.Id as Id1_20_
, addressdmo0_.AddressType as AddressT2_20_
, addressdmo0_.City as City3_20_
, addressdmo0_.Country_Id as Country_4_20_
, addressdmo0_.County_id as County_i5_20_
, addressdmo0_.CreatedDate as CreatedD6_20_
, addressdmo0_.CurrentUntil as CurrentU7_20_
, addressdmo0_.InstanceId as Instance8_20_
, addressdmo0_.isPreferredAddress as isPrefer9_20_
, addressdmo0_.ProfileId as Profile15_20_
, addressdmo0_.State_Id as State_I10_20_
, addressdmo0_.StreetAddress1 as StreetA11_20_
, addressdmo0_.StreetAddress2 as StreetA12_20_
, addressdmo0_.UpdatedDate as Updated13_20_
, addressdmo0_.Zip as Zip14_20_ 
from dbo.Address addressdmo0_ 
left outer join dbo.Profile profiledmo1_ 
on addressdmo0_.ProfileId=profiledmo1_.Id 
where profiledmo1_.Id=@P0 and addressdmo0_.InstanceId=@P1

nhập mô tả hình ảnh ở đây


Bất kỳ cơ hội nào bạn có thể thêm vào cấu trúc bảng đầy đủ là gì, khóa phân cụm là gì và sau đó các cột khác đang được bao gồm trong các truy vấn đang tìm profileid = xxxx và truy vấn với profilerid = xxxx và instanceid = xxxx. Có rất nhiều "nó phụ thuộc" trong những câu trả lời này và có thông tin đó chắc chắn sẽ giúp giải thích những gì nó phụ thuộc vào.
mskinner

Thông tin thêm về dữ liệu sẽ hữu ích. Ví dụ: nếu số liệu thống kê đã được cập nhật trên bảng, có bao nhiêu bản ghi trong bảng cùng với tính duy nhất và vv.
Glen Swan

@GlenSwan, có 567644 bản ghi trong bảng này. Thống kê đã được cập nhật hai lần một tuần. Thứ Ba và Thứ Bảy
sebeid

2
Hãy làm nghiên cứu của riêng bạn về so sánh tính năng. Mặc dù có một số chồng chéo, các cụm chuyển đổi dự phòng và các nhóm khả dụng có các tính năng khác nhau và đáp ứng các yêu cầu khác nhau, vì vậy bạn không thể hỏi một cách khái quát cái nào tốt hơn. Bạn cần so sánh các tính năng của từng loại với nhu cầu kinh doanh thực tế của bạn. Ngoài ra, câu hỏi cấp phép / chi phí không phải là chủ đề ở đây. Xin vui lòng đọc bài meta này đầy đủ .
Aaron Bertrand

Câu trả lời:


6

Trả lời câu hỏi 1:

Từ những gì bạn đã đăng, bạn có thể bỏ hai chỉ mục đầu tiên vì thứ ba sẽ bao gồm tất cả các truy vấn bạn đề cập và trình tối ưu hóa truy vấn cũng thấy điều đó khi xây dựng kế hoạch truy vấn (dựa trên kế hoạch bạn đã đăng.)

Trả lời cho câu hỏi 2:

Nó luôn sử dụng chỉ mục thứ ba vì nó đã có nhiều dữ liệu hơn trong chỉ mục với hai khóa chỉ mục bổ sung ( InstanceId and AddressType). Điều này giúp SQL không cần phải kéo InstanceId và addressType từ khóa chính (phần tra cứu khóa của kế hoạch thực hiện) để đáp ứng truy vấn.

Những gì tôi muốn đề xuất là bỏ hai chỉ mục đầu tiên và xây dựng lại thứ ba với các cột bao gồm để bao gồm các cột khác được yêu cầu trong truy vấn

Create index IX_Address_profile_instance_addresstype 
on dbo.address  (ProfileId, InstanceId, AddressType) 
include(<put in the remaining columns comma delimited>) 
with (drop_existing=on,sort_in_tempdb=on)

Điều này sẽ giúp với các truy vấn và sẽ loại bỏ tra cứu khóa khỏi kế hoạch truy vấn.

Xem các khóa có bị mất sau những thay đổi này không và nếu chúng không, chúng ta có thể đào sâu hơn một chút.


tôi đã làm những gì bạn đề nghị và không có thêm tra cứu quan trọng. tôi đang theo dõi các khóa .. tôi vẫn cần một số giải thích rõ ràng cho các số đếm này Hàng đợi chờ: 484; tổng thời lượng: 59 phút; thời lượng avg: 7 giây; Khóa trang chờ: 5; tổng thời lượng: 11 giây; thời lượng avg: 2 giây; Khóa cố gắng leo thang: 36.949;
Tăng

@sebeid khi chèn / cập nhật / xóa được thực hiện trên bảng Địa chỉ là các bảng khác cũng được sửa đổi bởi cùng một yêu cầu lô? Nếu vậy, lô có bắt đầu một giao dịch rõ ràng cho tất cả các báo cáo sửa đổi theo đợt và chỉ cam kết hoặc khôi phục vào cuối đợt không?
Aaron

tôi không biết, từ đâu tôi có thể nhận được thông tin này. Cảm ơn
sebeid

2
@sebeid nếu mọi thứ là một tuyên bố được tạo từ hibernate, tôi sẽ hỏi các nhà phát triển của bạn vì đó có thể là cách tiếp cận đơn giản nhất, nếu không, bạn sẽ cần theo dõi hoặc thiết lập một sự kiện mở rộng để thử và bẫy các cuộc gọi để bạn có thể thấy những gì đang diễn ra báo cáo lô. Ví dụ về hồ sơ sự kiện mở rộng
Aaron

3

Không phải câu hỏi đã nêu nhưng có thể nhận được các kế hoạch truy vấn tốt hơn với các truy vấn tốt hơn
Bạn đang giết bên ngoài bên trái với
nơi profiledmo1_.Id=@P0 biến điều đó thành tham gia

Trên chỉ mục chỉ có hai

select addressdmo0_.Id as Id1_20_
     , ...
     , addressdmo0_.Zip as Zip14_20_ 
  from dbo.Address addressdmo0_ 
  join dbo.Profile profiledmo1_ 
    on addressdmo0_.ProfileId = profiledmo1_.Id 
   and profiledmo1_.Id = @P0 
   and addressdmo0_.InstanceId = @P1

tất cả những gì tham gia là đảm bảo nó có trong Hồ sơ nhưng bạn không báo cáo bất cứ điều gì từ hồ sơ
và làm thế nào không?

select addressdmo0_.Id as Id1_20_
     , ...
     , addressdmo0_.Zip as Zip14_20_ 
  from dbo.Address addressdmo0_ 
 where addressdmo0_.ProfileId  = @P0 
   and addressdmo0_.InstanceId = @P1

2

Có vẻ như bạn có thể bỏ chỉ số 1 và 2 vì chỉ mục 3 bao gồm tất cả thông tin (cột) bạn cần. Có thể là một chỉ mục khác có ý nghĩa như là một chỉ mục được nhóm để đại diện cho khóa chính.

Với thông tin hạn chế này, chúng tôi chỉ có thể đoán. Nếu bạn cần thêm gợi ý, vui lòng đăng thông tin chi tiết hơn dưới dạng cấu trúc bảng hoàn chỉnh của bạn (bảng, chỉ mục, khóa, ...), truy vấn của bạn và kế hoạch thực hiện.


1
Hoặc một chỉ mục được nhóm không đại diện cho khóa chính. Mặc dù hai thứ này thường được liên kết chặt chẽ với nhau và trong khi một khóa chính được tạo theo cụm theo mặc định, chúng không (và không phải) giống nhau.
Aaron Bertrand

Tất nhiên đó là sự thật. :-)
Josh Alvo
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.