태그 보관물: azure-sql-database

azure-sql-database

Azure에서 Brent Ozar의 sp_BlitzIndex를 실행하려면 어떻게해야합니까? 프로 시저 sp_BlitzIndex, 줄 18

Brent Ozar의 웹 사이트에서 SQL Server 응급 처치 키트를 다운로드했습니다. Azure 데이터베이스 서버 수준 관리자로 로그인 한 상태에서 Microsoft Sql Server Management Studio를 통해 마스터 데이터베이스에 대해 sp_BlitzIndex 스크립트 를 실행하려고 하면 다음 오류가 발생했습니다.

메시지 262, 수준 14, 상태 18, 프로 시저 sp_BlitzIndex, 줄 18 CREATE PROCEDURE 권한이 데이터베이스 ‘master’에서 거부되었습니다.

테스트하려는 데이터베이스 인스턴스에서 프로 시저를 작성했습니다. 절차를 실행할 때 오류가 발생했습니다.

메시지 50000, 수준 16, 상태 1, 줄 1265 잘못된 개체 이름 ‘mydatabase.sys.partitions’입니다.

다음으로 저장 프로 시저를 만들지 않고 영리하고 저장 데이터베이스를 마스터 데이터베이스에 대해 직접 실행하려고 시도했지만 다음 오류가 발생했습니다.

메시지 50000, 수준 15, 상태 1, 줄 1267이 버전의 SQL Server에서는 ‘mydatabase.sys.indexes’의 데이터베이스 및 / 또는 서버 이름에 대한 참조가 지원되지 않습니다.

나는 ~ 2700 행의 색인 휴리스틱 로직의 내부 작업을 시작하기에 충분히 자신감이 없다. 이 저장 프로 시저를 Azure SQL Database에서 훌륭하게 작동하도록하는 빠르고 쉬운 방법이 있습니까? 아니면 인덱스 분석 도구 / 저장 프로 시저를 다른 곳에서 찾아봐야합니까?



답변

켄드라 여기 (의 작가 sp_BlitzIndex)

먼저 절차에 관심을 갖고 시험해 주셔서 감사합니다.

Azure는 박스형 제품에서 얻는 모든 동적 관리 뷰를 공개하지 않습니다. 실제로 참조 sys.dm_db_partition_stats하지만 sys.partitions다른 사용자 를 위해 필요한 다른 정보 가 있습니다. (압축을 사용하고 있습니까? 어떤 유형입니까?)

많은 수요가 없었기 때문에 Azure 특정 버전으로 테스트를 작성할 시간이 없었습니다. 그러나 당신의 질문은 내가 알고있는 것보다 더 많은 관심이 있다고 말해줍니다.

최소한 오류 처리를 구현하여 우아하게 알 수 있도록하겠습니다. (Azure는 사용자도 사용할 수있는 기능을 확장했기 때문에 이것은 약간의 이동 대상입니다.)


답변

누락 된 인덱스를 식별하기위한 ‘표준’쿼리 중 일부는 예를 들어 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시도하는 것보다 훨씬 덜 유용 하지만 가치가 있습니다.

다음은 최상위 쿼리를 식별하는 또 다른 편리한 쿼리입니다. 그런 다음 실행 계획을 실행하여 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;


답변