2016-07-04 5 views
3

내 응용 프로그램에는 제품 및 범주가 있습니다. 제품은 여러 범주에 속할 수 있습니다. 따라서 CwObject (제품)와 EntityObjectLink (제품과 범주 간 링크)라는 두 개의 테이블이 있습니다. 나는 많이 사용되는 하나의 쿼리를 가지고 있지만 tweeking 일 후에조차도 매우 느립니다. CwObject에는 약 400K 레코드가 있고 EntityObjectLink에는 1.2M 레코드가 있습니다.매우 느린 쿼리 내부 참여

NONCLUSTERED INDEX [IX_ClusterEntitytypePredecessorStatusClusteraccount] 
ON [dbo].[CwObject]([CwObject_CwSiteCluster_Guid] ASC, 
        [CwObject_EntityType] ASC, 
        [CwObject_Predecessor_Guid] ASC, 
        [CwObject_Status] ASC, 
        [CwObject_ClusterAccount_Guid] ASC) 
INCLUDE (% ALL other columns%) 
     WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, 
      SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, 
      ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) 

내가 쿼리를 사용하는 경우 :

PRIMARY KEY CLUSTERED ([EntityObjectLink_LinkedCwEntity_Guid] ASC, 
         [EntityObjectLink_LinkedCwObject_Guid] ASC) 
     WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, 
      SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF, 
      ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) 

CwObject 테이블 관련 인덱스가 :

SELECT TOP (99999) 
    CwObject.* 
FROM 
    CwObject 
INNER JOIN 
    dbo.EntityObjectLink ON CwObject.CwObject_Guid = EntityObjectLink.EntityObjectLink_LinkedCwObject_Guid 
WHERE 
    EntityObjectLink_LinkedCwEntity_Guid = '9a0e41d7-a472-445e-b94f-44fe1a1506b3' 
    AND CwObject_CwSiteCluster_Guid = '0f178176-9720-41c7-9528-99fdf30005e8' 
    AND CwObject_EntityType = 1 
    AND (CwObject_Predecessor_Guid IS NULL) 
ORDER BY 
    CwObject_Name ASC 

EntityObjectLink은 관련 클러스터 된 인덱스가 있습니다

쿼리입니다 optimiser는 쿼리가 두 인덱스를 모두 사용한다고 알려줍니다. 그러나 나는 이해하지 못하는 몇 가지를 보았습니다.

  1. 엔티티 유형 및 predecessorguid에 대한 열 통계가 없다고 경고합니다. 방금 색인을 추가했기 때문일 수 있습니까?

  2. CwObjects 표에서 실제 행과 예상 행을 읽는 것과 큰 차이가 있습니다. 나는 라이브 쿼리 통계를 보면

쿼리는 인덱스 추구 (왜 찾아?)로 CwObjects에서 171K 기록을 읽습니다. 그런 다음 EntityObjectLink 테이블에서 병합 조인을 수행하여 2.5K 레코드를 읽습니다. 다른 방향으로 돌리는 것이 훨씬 더 효과적이었을 것입니다.

나는 정말로 정말로 여기 붙어 있습니다 ... 누구든지 도와 줄 수 있습니까? 여기

는 실행 계획입니다 : https://1drv.ms/u/s!AlCbN2sexrJ-hNJjeSR9cZPOEpOHww

UPDATE :

AtoStats 몇 시간 이전, ON입니다.

내가 cwObjects 테이블에 업데이트 할 통계를 강제 :

는 거의 모든 시간을

업데이트 2 ... 인덱스 CwObject에 추구에서 소비된다. 이것은 큰 차이를 만들었습니다! 쿼리가 거의 10 배 빠릅니다!

+0

('EntityObjectLink_LinkedCwEntity_Guid, CwObject_CwSiteCluster_Guid')에 복합 색인을 추가하고'CwObject_Name'에 다른 색인을 추가하는 것이 좋습니다. –

+0

실행 계획을 게시하십시오 – TheGameiswar

+0

첫 번째 키 열 뒤에 CwObject의 클러스터 된 인덱스에 CwObject_Guid를 추가하려고 시도 했습니까? –

답변

4

당신은 따라서 당신이 당신의 실행 계획이 경고를, 열 중 일부에 대한 통계가 없습니다 : 없음 통계와

열 :. [compareware]를 [DBO] [CwObject].. CwObject_EntityType; [compareware]. [DBO]. CwObject]은 행의 수가 예상 1779,2 동안이 174,480 행의 실제 수를 초래

을 .CwObject_Predecessor_Guid.

auto create statistics을 데이터베이스에서 활성화하거나 해당 열에 대한 통계를 수동으로 생성 해보십시오.

+0

자동 작성 통계가 설정되었습니다. 그러나 나는 그들을 수동으로 만들어야 만했다. 거대한 차이를 만들었습니다 (10 배 빠름). –