Bagaimana cara mendapatkan sp_BlitzIndex dari Brent Ozar untuk dijalankan pada Azure?

13

Saya mengunduh Kit Pertolongan Pertama SQL Server dari situs web Brent Ozar. Ketika saya mencoba menjalankan skrip sp_BlitzIndex terhadap database master saya melalui Microsoft Sql Server Management Studio saat masuk sebagai admin tingkat server database Azure dan saya mendapat kesalahan berikut:

Msg 262, Level 14, Negara 18, Prosedur sp_BlitzIndex, Baris 18 CREATE PROCEDURE izin ditolak di 'master' database.

Saya berhasil membuat prosedur pada instance database yang ingin saya uji. Ketika saya menjalankan prosedur saya mendapat kesalahan yang menyatakan:

Msg 50000, Level 16, State 1, Line 1265 Nama objek tidak valid 'mydatabase.sys.partitions'.

Selanjutnya saya mencoba untuk menjadi pintar dan menjalankan kode prosedur yang tersimpan secara langsung terhadap database master tanpa membuat prosedur yang tersimpan dan mendapatkan kesalahan berikut:

Msg 50000, Level 15, State 1, Line 1267 Referensi ke database dan / atau nama server di 'mydatabase.sys.indexes' tidak didukung dalam versi SQL Server ini.

Saya tidak merasa cukup percaya diri untuk mulai bermain-main dengan cara kerja dalam ~ 2700 baris logika heuristik indeks. Apakah ada cara cepat, dan mudah untuk mendapatkan prosedur tersimpan ini berfungsi dengan baik pada Azure SQL Database atau haruskah saya mencari di tempat lain untuk alat penganalisa indeks / prosedur tersimpan?

Erik
sumber

Jawaban:

24

Kendra di sini (penulis sp_BlitzIndex)

Pertama, terima kasih telah tertarik pada prosedur dan mencobanya.

Azure tidak memaparkan semua pandangan manajemen dinamis yang kami dapatkan dalam produk kotak. Saya benar-benar referensi sys.dm_db_partition_stats, tetapi ada info lain yang saya perlukan sys.partitionsuntuk pengguna lain. (Apakah menggunakan kompresi? Jenis apa?)

Saya belum punya waktu untuk menulis tes versi khusus Azure, hanya karena saya belum punya banyak permintaan untuk itu. Tetapi pertanyaan Anda memang memberi tahu saya bahwa ada minat yang lebih besar daripada yang saya ketahui - jadi begitulah!

Saya setidaknya akan melihat menerapkan beberapa penanganan kesalahan sehingga memungkinkan Anda tahu dengan cara yang anggun. (Ini sedikit target yang bergerak, karena Azure telah memperluas fitur yang tersedia untuk pengguna juga.)

kendra
sumber
1
Karena V12 mengekspos lebih banyak DMV, apakah Anda pikir Anda akan dapat sp_BlitzIndexbekerja pada V12, atau apakah masih kehilangan bit yang relevan terlalu banyak untuk menjadi berharga? Asalkan Anda punya waktu luang / permintaan tentunya. :)
Erik
@Kendra - Ini akan sangat bagus jika ini bisa diperbarui untuk bekerja pada Azure !! Saya melihat versi terbaru 20160715 tidak kesalahan ketika saya menjalankan sp_BlitzIndextetapi curiga ia mengatakan tidak ada masalah besar yang ditemukan. Saya menduga ini karena info yang diperlukan masih belum tersedia di Azure. Ketika saya menjalankan dengan @mode=4saya mendapatkan kesalahan.
Rory
Saya sedang mengerjakan proyek lain sekarang, dan sudah begitu lama sejak saya mengerjakan sp_BlitzIndex sehingga saya tidak tahu apakah saya akan mengenali kodenya. Tapi kabar baiknya, sekarang open source! Orang lain juga bisa melakukannya. Anda dapat membuka
kendra
1

Beberapa kueri 'standar' untuk mengidentifikasi indeks yang hilang berjalan di Azure, misalnya :

  SELECT
  migs.avg_total_user_cost * (migs.avg_user_impact / 100.0) * (migs.user_seeks + migs.user_scans) AS improvement_measure,
  'CREATE INDEX [missing_index_' + CONVERT (varchar, mig.index_group_handle) + '_' + CONVERT (varchar, mid.index_handle)
  + '_' + LEFT (PARSENAME(mid.statement, 1), 32) + ']'
  + ' ON ' + mid.statement
  + ' (' + ISNULL (mid.equality_columns,'')
    + CASE WHEN mid.equality_columns IS NOT NULL AND mid.inequality_columns IS NOT NULL THEN ',' ELSE '' END
    + ISNULL (mid.inequality_columns, '')
  + ')'
  + ISNULL (' INCLUDE (' + mid.included_columns + ')', '') AS create_index_statement,
  migs.*, mid.database_id, mid.[object_id]
FROM sys.dm_db_missing_index_groups mig
INNER JOIN sys.dm_db_missing_index_group_stats migs ON migs.group_handle = mig.index_group_handle
INNER JOIN sys.dm_db_missing_index_details mid ON mig.index_handle = mid.index_handle
WHERE migs.avg_total_user_cost * (migs.avg_user_impact / 100.0) * (migs.user_seeks + migs.user_scans) > 10
ORDER BY migs.avg_total_user_cost * migs.avg_user_impact * (migs.user_seeks + migs.user_scans) DESC

Mereka cenderung jauh kurang berguna daripada sp_BlitzIndextetapi patut dicoba.

Berikut ini adalah kueri praktis lain untuk mengidentifikasi kueri teratas, yang kemudian dapat Anda jalankan dengan Rencana Eksekusi untuk mengidentifikasi indeks yang hilang melalui SQL Management Studio. Lelah melakukannya satu per satu tetapi lebih baik daripada tidak sama sekali:

SELECT TOP 1000 qs.execution_count, 
       qs.total_worker_time, 
       qs.total_worker_time / qs.execution_count AS 'Avg CPU Time', 
       qs. total_physical_reads, 
       qs.total_physical_reads / qs.execution_count AS 'Avg Physical Reads', 
       qs.total_logical_reads, 
       qs.total_logical_reads / qs.execution_count AS 'Avg Logical Reads', 
       qs.total_logical_writes, 
       qs.total_logical_writes / qs.execution_count AS 'Avg Logical Writes', 
       SUBSTRING(st.text, qs.statement_start_offset / 2 + 1, 
        (CASE qs.statement_end_offset
                     WHEN-1 THEN DATALENGTH(st.text)
                     ELSE qs.statement_end_offset
                     END
           - qs.statement_start_offset) / 2 + 1)AS statement_text
  FROM sys.dm_exec_query_stats AS qs 
  CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle)AS st
  ORDER BY qs.execution_count DESC;
Rory
sumber