SQL Server 2008을 사용하고 있으며 DMV를 사용하여 누락 된 인덱스를 찾습니다. 그러나 새 인덱스를 만들기 전에 proc/query가 해당 인덱스를 원하고 있는지 파악하려고합니다. 내가 얻을 수있는 가장 많은 정보를 원한다면 색인에 대한 정보에 입각 한 결정을 내릴 수 있습니다. 때로는 SQL Server에서 원하는 인덱스가 이해가되지 않는 경우가 있습니다. 아무도 내가 원하는 것을 알아낼 수있는 방법을 알고 있습니까?SQL Server - 누락 된 인덱스 - 인덱스는 무엇을 사용합니까?
답변
마지막 일 것입니다 :
with xmlnamespaces(default 'http://schemas.microsoft.com/sqlserver/2004/07/showplan') , CachedPlans as (
select
query_plan,
n.value('../../../@StatementText' ,'varchar(1000)') as [Statement],
n.value('../../../@StatementSubTreeCost' ,'varchar(1000)') as [Cost],
n.value('../../../@StatementEstRows' ,'varchar(1000)') as [Rows],
n.value('@Impact' ,'float') as Impact,
n.value('MissingIndex[1]/@Database' ,'varchar(128)') as [Database],
n.value('MissingIndex[1]/@Table' ,'varchar(128)') as [TableName],
(
select dbo.concat(c.value('@Name' ,'varchar(128)'))
from n.nodes('MissingIndex/ColumnGroup[@Usage="EQUALITY"][1]') as t(cg)
cross apply cg.nodes('Column') as r(c)
) as equality_columns,
(
select dbo.concat(c.value('@Name' ,'varchar(128)'))
from n.nodes('MissingIndex/ColumnGroup[@Usage="INEQUALITY"][1]') as t(cg)
cross apply cg.nodes('Column') as r(c)
) as inequality_columns,
(
select dbo.concat(c.value('@Name' ,'varchar(128)'))
from n.nodes('MissingIndex/ColumnGroup[@Usage="INCLUDE"][1]') as t(cg)
cross apply cg.nodes('Column') as r(c)
) as include_columns
from (
select query_plan
from sys.dm_exec_cached_plans p
outer apply sys.dm_exec_query_plan(p.plan_handle) tp
) as tab(query_plan)
cross apply query_plan.nodes('//MissingIndexGroup') as q(n)
)
select *
from CachedPlans
프로파일 러 추적을 실행하고 실행중인 절차와 인덱스 검색/사용에 대한 효율성을 확인할 수 있습니다.
모든 사람의 모든 색인을 작성하는 것이 아니라 가장 큰 문제를 최적화하는 것이 좋습니다. 일반적으로 가장 큰 이점을 얻을 수 있습니다.
프로파일 러 추적에서 저장된 proc/tsql 문이 가장 많은 횟수로 실행되고 대부분의 리소스를 사용하는지 확인합니다. 그것들은 당신이 정말로 가고 싶어하는 것들입니다.
이 내가 요구하고 무엇을 정말하지 않습니다. SQL의 DMV (sys.dm_db_missing_index_details)는 누락 된 인덱스 목록을 제공합니다. 색인을 만들면 색인을 어떻게 사용하는지 알고 싶습니다. – BankZ
@BankZ 프로파일 러 경로를 지정해야하는 이유는 dm_db_missing_index_details가 누락 된 색인이 무엇인지 알려주지 만 얻을 수있는 이득이 얼마인지 알 수 없기 때문입니다. IMO는 실제로 가장 큰 문제를 일으키는 쿼리를 최적화하는 것이 더 나은 옵션입니다. –
DMV가 우리가 사용하는 유일한 것이 아니라는 것을 이해합니다. 우리는 추적을하고 실행 계획을 살펴 봅니다. 그러나 24/7을 추적 할 수 없으며 DMV에는 많은 정보가 있습니다 (누락 된 색인 비용 및 일부 이점에 대한 견적을 제공합니다). 그러나, 그 말했다, 그것은 여전히 내 질문에 대답하지 않습니다 :) – BankZ
당신은 QUERYTEXT를 나열이 쿼리처럼 뭔가를 시도 할 수 :
;WITH XMLNAMESPACES(DEFAULT N'http://schemas.microsoft.com/sqlserver/2004/07/showplan')
, CachedPlans AS
(SELECT
RelOp.op.value(N'../../@NodeId', N'int') AS ParentOperationID
,RelOp.op.value(N'@NodeId', N'int') AS OperationID
,RelOp.op.value(N'@PhysicalOp', N'varchar(50)') AS PhysicalOperator
,RelOp.op.value(N'@LogicalOp', N'varchar(50)') AS LogicalOperator
,RelOp.op.value(N'@EstimatedTotalSubtreeCost ', N'float') AS EstimatedCost
,RelOp.op.value(N'@EstimateIO', N'float') AS EstimatedIO
,RelOp.op.value(N'@EstimateCPU', N'float') AS EstimatedCPU
,RelOp.op.value(N'@EstimateRows', N'float') AS EstimatedRows
,cp.plan_handle AS PlanHandle
,qp.query_plan AS QueryPlan
,st.TEXT AS QueryText
,cp.cacheobjtype AS CacheObjectType
,cp.objtype AS ObjectType
,cp.usecounts AS UseCounts
FROM sys.dm_exec_cached_plans cp
CROSS APPLY sys.dm_exec_sql_text(cp.plan_handle) st
CROSS APPLY sys.dm_exec_query_plan(cp.plan_handle) qp
CROSS APPLY qp.query_plan.nodes(N'//RelOp') RelOp (op)
)
SELECT
PlanHandle
,ParentOperationID
,OperationID
,PhysicalOperator
,LogicalOperator
,UseCounts
,CacheObjectType
,ObjectType
,EstimatedCost
,EstimatedIO
,EstimatedCPU
,EstimatedRows
,QueryText
FROM CachedPlans
WHERE CacheObjectType = N'Compiled Plan'
AND PhysicalOperator IN ('nothing will ever match this one!'
--,'Assert'
--,'Bitmap'
--,'Clustered Index Delete'
--,'Clustered Index Insert'
,'Clustered Index Scan'
--,'Clustered Index Seek'
--,'Clustered Index Update'
--,'Compute Scalar'
--,'Concatenation'
--,'Constant Scan'
,'Deleted Scan'
--,'Filter'
--,'Hash Match'
,'Index Scan'
--,'Index Seek'
--,'Index Spool'
,'Inserted Scan'
--,'Merge Join'
--,'Nested Loops'
--,'Parallelism'
,'Parameter Table Scan'
--,'RID Lookup'
--,'Segment'
--,'Sequence Project'
--,'Sort'
--,'Stream Aggregate'
--,'Table Delete'
--,'Table Insert'
,'Table Scan'
--,'Table Spool'
--,'Table Update'
--,'Table-valued function'
--,'Top'
)
그냥 UseCounts 및 EstimatedCost의 조합과 같은에 의해 주문을 추가 할 수 있습니다. 여기
아주 흥미로운 출발점. 나는 내가 이것으로 무엇을 할 수 있는지 알게 될 것이다. 고맙습니다. – BankZ
- 1. 힙 테이블에서 클러스터되지 않은 인덱스는 행에 대한 포인터로 무엇을 사용합니까?
- 2. SQL Server 인덱스 비용
- 3. SQL Server DTA 누락
- 4. SQL Server 인덱스
- 5. SQL Server 보완 누락 된 행
- 6. SQL Server 2008의 필터링 된 인덱스
- 7. SQL Server - 필터링 된 인덱스 만들기
- 8. SQL Server 2008 필터링 된 인덱스
- 9. SQL Server - 계산 된 열의 인덱스?
- 10. SQL Server 인덱스 통계
- 11. SQL Server 및 인덱스
- 12. 정적 SQL Server 인덱스
- 13. 조인에 대한 SQL Server 인덱스 성능
- 14. SQL Server 인덱스 - LIKE 쿼리의 향상?
- 15. Sql Server 2005 인덱스 열 순서
- 16. SQL Server; TEXT 열의 인덱스
- 17. SQL Server : 인덱스 성능 비교
- 18. 커서에 대한 SQL Server 인덱스
- 19. SQL Server 2000 인덱스 삭제
- 20. 비트 필드의 Sql Server 인덱스
- 21. SQL Server - 인덱스 손실 시나리오
- 22. SQL Server "Write Once"테이블 클러스터 된 인덱스
- 23. SQL Server - 분할 된 테이블과 클러스터 된 인덱스 비교
- 24. 레일 3 - 누락 된 인덱스 경로?
- 25. SQL : 기본 키와 인덱스는 정확히 무엇을합니까?
- 26. MS SQL Server 2005의 인덱스 varchar
- 27. Sql Server 2008에서 누락 된 전체 텍스트 색인 시스템보기
- 28. 인덱스 작성시 필드를 정렬하는 방법 (SQL Server 2005 이상)?
- 29. SQL Server -보기의 계산 된 열에 XML 인덱스 추가
- 30. SQL Server 쿼리 성능 - 클러스터 된 인덱스 검색
dbo.concat은 무엇인지 명확히 할 수 있습니까? –
dbo.concat을 다음과 같이 바 꾸었습니다 :'SELECT STUFF (([...] FOR XML PATH ('')), 1, 2, '')', [...]를 쿼리 내가 열을 concat 싶어요; n.nodes ('MissingIndex/ColumnGroup [@ Usage = "EQUALITY"] [1]')에서 SELECT STUFF ((select c.value ('@ Name', 'varchar (128)')) cg.nodes ('Column')을 r (c) FOR XML PATH (''), 1, 2, '')로 교차 적용 –