Brent Ozar'ın sp_BlitzIndex'in Azure'da çalışmasını nasıl sağlayabilirim?


13

SQL Server İlk Yardım Seti'ni Brent Ozar'ın web sitesinden indirdim. Azure veritabanı sunucusu düzeyinde yönetici olarak oturum açmışken Microsoft Sql Server Management Studio aracılığıyla ana veritabanım karşı sp_BlitzIndex komut dosyasını çalıştırmaya çalıştığımda ve aşağıdaki hatayı aldım:

Msg 262, Seviye 14, Durum 18, Prosedür sp_BlitzIndex, Satır 18 'Master' veritabanında PROSEDÜR OLUŞTURMA izni verilmedi.

Yordamı sınamak istediğim veritabanı örneğinde başarıyla oluşturdum. Yordamı yürüttüğümde bir hata mesajı aldım:

Msg 50000, Seviye 16, Durum 1, Satır 1265 Geçersiz nesne adı 'mydatabase.sys.partitions'.

Sonra zeki olmaya çalıştım ve saklı yordam oluşturmadan doğrudan ana veritabanına depolanan yordam kodu çalıştırmak ve aşağıdaki hatayı aldım:

Msg 50000, düzey 15, durum 1, satır 1267 'mydatabase.sys.indexes' veritabanı ve / veya sunucu adı başvurusu, SQL Server'ın bu sürümünde desteklenmez.

2700 endeks buluşsal mantığının iç işleyişiyle oynamaya başlayacak kadar kendimi güvende hissetmiyorum. Bu saklı yordamı Azure SQL Veritabanı üzerinde güzel çalışması için hızlı ve kolay bir yolu var mı veya bir dizin analiz aracı / saklı yordamı için başka bir yere bakmak gerekir?

Yanıtlar:


24

Kendra burada (yazarı sp_BlitzIndex)

İlk olarak, prosedüre ilgi duyduğunuz ve denediğiniz için teşekkürler.

Azure, kutulu üründe elde ettiğimiz tüm dinamik yönetim görünümlerini göstermez. Aslında referans veriyorum sys.dm_db_partition_stats, ancak sys.partitionsdiğer kullanıcılar için almam gereken başka bilgiler var . (Sıkıştırma kullanıyor mu? Ne tür?)

Azure'a özgü bir sürümü test etmek için zamanım olmadı, çünkü bunun için çok fazla talebim olmadı. Ama sorunuz bana bildiğimden daha fazla ilgi olduğunu söylüyor - işte bu!

En azından bazı hata işlemeyi uygulamaya bakacağım, böylece zarif bir şekilde bilmenizi sağlar. (Azure, kullanıcıların da kullanabileceği özellikleri genişlettiği için bu, hareketli bir hedeftir.)


1
V12, daha fazla DMV ortaya çıkardığındansp_BlitzIndex , V12 üzerinde çalışabileceğinizi mi düşünüyorsunuz , yoksa hala değerli olmak için çok fazla ilgili bit mi eksik? Tabii ki boş zaman / talep varsa. :)
Erik

@Kendra - Bu Azure üzerinde çalışmak için güncellenmiş olsaydı gerçekten harika olurdu !! 20160715'in son çalıştırdığımda hata olmadığını fark ediyorum sp_BlitzIndexama şüpheyle önemli bir sorun bulunamadı diyor. Bunun gerekli bilgilerin Azure'da hala mevcut olmadığından şüpheleniyorum. Birlikte çalıştığımda @mode=4bir hata alıyorum.
Rory

Şu anda diğer projeler üzerinde çalışıyorum ve sp_BlitzIndex üzerinde çalıştığımdan beri çok uzun zaman geçti, hatta kodu tanıyabileceğimi bile bilmiyorum. Ama iyi haber, şimdi açık kaynak! Diğer insanlar da yapabilir. Firstresponderkit.org
kendra

1

Eksik dizinleri tanımlamak için bazı 'standart' sorgular Azure'da çalışır, örneğin :

  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

Muhtemelen daha az yararlı olacaklar sp_BlitzIndexama denemeye değerler.

İşte en iyi sorguları tanımlamak için başka bir kullanışlı sorgu, daha sonra SQL Management Studio aracılığıyla eksik dizinleri tanımlamak için Yürütme Planı ile çalıştırabilirsiniz. Bunları tek tek yapmak ama hiç olmamasından daha iyi:

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;
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.