Pertanyaan penyetelan indeks

8

Saya menyetel beberapa indeks dan melihat beberapa masalah ingin mengikuti saran Anda

Pada 1 tabel ada 3 indeks

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- Apakah saya benar-benar membutuhkan 2 indeks pertama, atau haruskah saya menjatuhkannya?

2- ada permintaan menjalankan yang menggunakan kondisi di mana profileid = xxxx dan kondisi penggunaan lainnya di mana profileid = xxxx dan InstanceID = xxxxxx. Mengapa pengoptimal memilih indeks ke-3 bukan ke-1 atau ke-2?

Saya juga menjalankan kueri yang membuat Kunci menunggu di setiap indeks. Jika saya mendapatkan jumlah ini, apa yang harus saya lakukan untuk menyetel indeks ini?

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.

struktur tabel adalah

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
 )

ini adalah contoh (kueri ini dibuat oleh hibernate sehingga terlihat aneh)

(@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 

masukkan deskripsi gambar di sini

(@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

masukkan deskripsi gambar di sini

sebeid
sumber
Setiap kesempatan Anda bisa menambahkan dalam apa struktur tabel penuh, apa kunci pengelompokan itu dan kemudian apa kolom lain yang dimasukkan dalam kueri yang mencari profilid = xxxx dan kueri dengan profilerid = xxxx dan instanceid = xxxx. Ada banyak "itu tergantung" dalam jawaban ini dan memiliki informasi itu pasti akan membantu menjelaskan apa itu tergantung
mskinner
Informasi lebih lanjut tentang data akan sangat membantu. Misalnya, jika statistik telah diperbarui di atas meja, berapa banyak catatan di tabel bersama dengan keunikan dan sebagainya.
Glen Swan
@ GlenSwan, ada catatan 567644 di tabel ini. Statistik diperbarui dua kali seminggu. Selasa dan Sabtu
sebeid
2
Silakan lakukan riset Anda sendiri tentang perbandingan fitur. Meskipun ada beberapa tumpang tindih, Failover Clusters dan Availability Groups memiliki fitur yang berbeda dan memenuhi persyaratan yang berbeda, jadi Anda tidak bisa bertanya secara umum mana yang lebih baik. Anda perlu membandingkan fitur masing-masing dengan kebutuhan bisnis Anda yang sebenarnya. Juga, masalah perizinan / biaya tidak pada topik di sini. Baca meta posting ini secara lengkap .
Aaron Bertrand

Jawaban:

6

Jawaban untuk pertanyaan 1:

Dari apa yang Anda posting, Anda dapat menjatuhkan dua indeks pertama karena yang ketiga akan mencakup semua pertanyaan yang Anda sebutkan dan pengoptimal kueri melihatnya juga ketika membangun rencana kueri (berdasarkan paket yang Anda posting.)

Jawaban untuk pertanyaan 2:

Selalu menggunakan indeks ketiga karena memiliki lebih banyak data dalam indeks dengan dua kunci indeks tambahan ( InstanceId and AddressType). Ini membuat SQL tidak perlu menarik InstanceId dan AddressType dari kunci utama (bagian pencarian kunci dari rencana eksekusi) untuk memenuhi kueri.

Apa yang saya sarankan adalah hilangkan dua indeks pertama dan bangun kembali ketiga dengan menyertakan kolom untuk mencakup kolom lain yang diminta dalam kueri

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)

Ini akan membantu dengan kueri dan harus menghapus pencarian kunci dari rencana kueri.

Lihat apakah kunci lepas setelah perubahan ini dan jika tidak, kami dapat menggali sedikit lebih dalam.

Harun
sumber
saya melakukan apa yang Anda rekomendasikan dan tidak ada lagi pencarian kunci. saya sedang memantau kunci .. saya masih perlu beberapa klarifikasi untuk jumlah ini Kunci baris menunggu: 484; total durasi: 59 menit; rata-rata durasi: 7 detik; Kunci halaman menunggu: 5; total durasi: 11 detik; rata-rata durasi: 2 detik; Upaya eskalasi kunci: 36.949; Eskalasi yang Sebenarnya: 0.
sebeid
@sebeid ketika memasukkan / memperbarui / menghapus dilakukan pada tabel Alamat apakah tabel lain juga sedang dimodifikasi oleh permintaan batch yang sama? Jika demikian, apakah bets secara eksplisit memulai transaksi untuk semua pernyataan modifikasi dalam bets dan hanya melakukan atau mengembalikan pada akhir bets?
Aaron
saya tidak tahu, dari mana saya bisa mendapatkan informasi ini. Terima kasih
sebeid
2
@sebeid jika semuanya adalah pernyataan yang dihasilkan dari hibernate Saya akan meminta pengembang Anda karena itu mungkin pendekatan yang paling sederhana, jika tidak, Anda perlu melacak atau mengatur acara yang diperluas untuk mencoba dan menjebak panggilan sehingga Anda dapat melihat apa yang terjadi di semua pernyataan batch. Extended Events Profiler Contoh
Aaron
3

Bukan pertanyaan yang dinyatakan tetapi mungkin mendapatkan paket kueri yang lebih baik dengan kueri yang lebih baik.
Anda membunuh bagian kiri luar dengan
tempat profiledmo1_.Id=@P0 mengubahnya menjadi gabungan

Pada indeks hanya dua yang pertama

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

semua yang bergabung lakukan adalah memastikan itu ada di Profil tetapi Anda tidak melaporkan apa pun dari profil
dan bagaimana itu tidak?

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

Sepertinya Anda dapat menjatuhkan indeks 1 dan 2 karena indeks 3 mencakup semua informasi (kolom) yang Anda butuhkan. Mungkin saja indeks lain masuk akal sebagai indeks berkerumun untuk mewakili kunci utama.

Dengan informasi terbatas ini kita bisa menebak. Jika Anda memerlukan lebih banyak petunjuk, silakan kirim informasi lebih rinci sebagai struktur tabel lengkap Anda (tabel, indeks, kunci, ...), kueri Anda dan rencana eksekusi.

Josh Alvo
sumber
1
Atau indeks berkerumun yang tidak mewakili kunci utama. Walaupun kedua hal ini sering dikaitkan secara erat satu sama lain, dan sementara kunci primer dibuat secara clustered, mereka tidak (dan tidak harus) hal yang sama.
Aaron Bertrand
Tentu saja itu benar. :-)
Josh Alvo