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;