ฉันจะทำให้ sp_BlitzIndex ของ Brent Ozar ทำงานบน Azure ได้อย่างไร


13

ฉันดาวน์โหลด SQL Server First Aid Kit จากเว็บไซต์ของ Brent Ozar เมื่อฉันพยายามเรียกใช้สคริปต์sp_BlitzIndexกับฐานข้อมูลหลักของฉันผ่าน Microsoft SQL Server จัดการ Studio ขณะที่เข้าสู่ระบบในฐานะผู้ดูแลระบบเซิร์ฟเวอร์ฐานข้อมูล Azure และฉันได้รับข้อผิดพลาดดังต่อไปนี้:

ข่าวสารเกี่ยวกับ 262, ระดับ 14, สถานะ 18, กระบวนงาน sp_BlitzIndex, บรรทัด 18 สร้างสิทธิ์ในการสร้างกระบวนการปฏิเสธในฐานข้อมูล 'ต้นแบบ'

ฉันสร้างขั้นตอนบนฐานข้อมูลอินสแตนซ์ที่ฉันต้องการทดสอบเรียบร้อยแล้ว เมื่อฉันดำเนินการตามขั้นตอนฉันพบข้อผิดพลาด:

เกี่ยวกับข่าวสาร 50000 ระดับ 16 สถานะ 1 บรรทัด 1265 ชื่อวัตถุไม่ถูกต้อง 'mydatabase.sys.partitions'

ต่อไปฉันพยายามที่จะฉลาดและเรียกใช้รหัสกระบวนงานที่เก็บไว้โดยตรงกับฐานข้อมูลหลักโดยไม่ต้องสร้างกระบวนงานที่เก็บไว้และได้รับข้อผิดพลาดต่อไปนี้:

ข่าวสารเกี่ยวกับ 50000, ระดับ 15, สถานะ 1, บรรทัด 1267 อ้างอิงถึงฐานข้อมูลและ / หรือชื่อเซิร์ฟเวอร์ใน 'mydatabase.sys.indexes' ไม่ได้รับการสนับสนุนใน SQL Server รุ่นนี้

ฉันไม่มั่นใจพอที่จะเริ่มเล่นกับผลงานภายในของ ~ 2700 บรรทัดของตรรกะฮิวริสติกของดัชนี มีวิธีที่รวดเร็วและง่ายในการทำให้ขั้นตอนการจัดเก็บนี้ทำงานบนฐานข้อมูล Azure SQL หรือฉันควรมองที่อื่นสำหรับเครื่องมือวิเคราะห์ดัชนี / ขั้นตอนการจัดเก็บ?

คำตอบ:


24

Kendra ที่นี่ (ผู้เขียนsp_BlitzIndex)

ก่อนอื่นขอขอบคุณที่สนใจขั้นตอนและลองทำดู

สีฟ้าไม่ได้เปิดเผยมุมมองการจัดการแบบไดนามิกทั้งหมดที่เราได้รับในผลิตภัณฑ์ชนิดบรรจุกล่อง ฉันอ้างอิงจริงsys.dm_db_partition_statsแต่มีข้อมูลอื่นที่ฉันต้องได้รับจากsys.partitionsสำหรับผู้ใช้รายอื่น (มันใช้การบีบอัดหรือไม่ประเภทใด?)

ฉันไม่มีเวลาเขียนแบบทดสอบเฉพาะ Azure เพียงเพราะฉันไม่มีความต้องการมาก แต่คำถามของคุณบอกฉันว่ามีความสนใจมากกว่าที่ฉันรู้

ฉันจะดูการใช้งานการจัดการข้อผิดพลาดอย่างน้อยที่สุดเพื่อให้คุณทราบได้อย่างสง่างาม (นี่เป็นเป้าหมายที่เคลื่อนไหวเล็กน้อยเนื่องจาก Azure ได้ขยายคุณสมบัติที่ผู้ใช้มีเช่นกัน)


1
เนื่องจาก V12 ทำให้ DMV มากขึ้นคุณคิดว่าคุณจะสามารถsp_BlitzIndexทำงานกับ V12 ได้หรือไม่หรือมันยังขาดบิตที่เกี่ยวข้องจำนวนมากเกินไปที่จะคุ้มค่า? ให้คุณมีเวลา / ความต้องการแน่นอน :)
Erik

@Kendra - มันยอดเยี่ยมจริงๆถ้ามันสามารถปรับปรุงให้ทำงานบน Azure ได้ !! ฉันสังเกตเห็นว่าเวอร์ชันล่าสุด 20160715 ไม่มีข้อผิดพลาดเมื่อฉันเรียกใช้sp_BlitzIndexแต่มีข้อสงสัยว่าจะไม่พบปัญหาที่สำคัญ ฉันสงสัยว่าเป็นเพราะข้อมูลที่ต้องการยังไม่สามารถใช้ได้ใน Azure เมื่อฉันทำงานด้วย@mode=4ฉันได้รับข้อผิดพลาด
โรรี่

ฉันกำลังทำงานในโครงการอื่นในขณะนี้และมันก็นานมากแล้วตั้งแต่ฉันทำงานกับ sp_BlitzIndex ซึ่งฉันไม่รู้ว่าฉันจำรหัสได้หรือไม่ แต่ข่าวดีก็คือโอเพ่นซอร์สตอนนี้! คนอื่นสามารถทำได้เช่นกัน คุณสามารถเลือกเข้าร่วมได้ที่firstresponderkit.org
kendra

1

บางส่วนของคำสั่ง 'มาตรฐาน' สำหรับการระบุดัชนีหายไปไม่ทำงานบน Azure, ตัวอย่างเช่น :

  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

พวกเขาน่าจะมีประโยชน์น้อยกว่าsp_BlitzIndexแต่ควรลองดู

ต่อไปนี้เป็นคำค้นหาที่มีประโยชน์อีกวิธีหนึ่งในการระบุข้อความค้นหายอดนิยมซึ่งคุณสามารถเรียกใช้ด้วย Execution Plan เพื่อระบุดัชนีที่ขาดหายไปผ่าน SQL Management Studio น่าเบื่อทำทีละคน แต่ดีกว่าไม่มีอะไร:

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;
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.