2012-06-15 2 views
-2

다음 쿼리가 최적화되어 있는지 알고 싶습니다.실행 시간을 향상시키기 위해 쿼리를 단순화

select 
    SUM(payments.paid_amt) as paid_amt, 
    SUM(payments.copay_amt) as copay_amt, 
    SUM(payments.CO_INSURANCE_AMT) as co_ins_amt, 
    payor_group.PAYOR_GROUP as payor_group, 
    DATEPART(MM,accession.XIFIN_LOAD_DATE) as load_month, 
    DATEPART(yyyy,accession.XIFIN_LOAD_DATE) as load_year 

    from 
    [F_PAYOR_PAYMENTS_monthly] payments 

    join D_PAYOR payor 
    on payor.PAYOR_ID=payments.PAYMENT_PAYOR_ID 

    join D_PAYOR_GROUP payor_group 
    on payor.PAYOR_GROUP_KEY=payor_group.PAYOR_GROUP_KEY 

    join F_ACCESSION_DAILY accession 
    on accession.ACCESSION_ID=payments.ACCESSION_ID 

    group by payor_group.PAYOR_GROUP, DATEPART(MM,accession.XIFIN_LOAD_DATE), 
    DATEPART(yyyy,accession.XIFIN_LOAD_DATE) 

약 1.5 시간 동안 실행되었습니다. 아직 어떤 테이블에도 색인이 없습니다!

모든 테이블에는 약 10,000,000 개의 행이 있습니다.

실행 시간을 향상시키기 위해이 쿼리를 단순화 할 수있는 방법이 있습니까?

안내 및 시간을 내 주셔서 대단히 감사드립니다.

+2

필요 사항 !!!!! – zebediah49

+0

예, 절대적으로,하지만 그 안에 넣기 전에 내 쿼리를 향상시킬 수 있는지 알고 싶습니다 –

+0

모든 그룹을 동시에 수행하는 것과는 대조적으로 중첩 된 선택을 수행하는 이유가 확실하지 않습니다. 단일 쿼리를 만들면 도움이 될 수도 있고 도움이되지 않을 수도 있습니다. – zebediah49

답변

1

함께 사용하는 이유는 무엇입니까?

select 
    SUM(payments.paid_amt) as paid_amt, 
    SUM(payments.copay_amt) as copay_amt, 
    SUM(payments.CO_INSURANCE_AMT) as co_ins_amt, 
    payor_group.PAYOR_GROUP as payor_group, 
    DATEPART(MM,accession.XIFIN_LOAD_DATE) as load_month, 
    DATEPART(yyyy,accession.XIFIN_LOAD_DATE) as load_year 

    from 
    [F_PAYOR_PAYMENTS_monthly] payments 

    join D_PAYOR payor 
    on payor.PAYOR_ID=payments.PAYMENT_PAYOR_ID 

    join D_PAYOR_GROUP payor_group 
    on payor.PAYOR_GROUP_KEY=payor_group.PAYOR_GROUP_KEY 

    join F_ACCESSION_MONTHLY accession 
    on accession.ACCESSION_ID=payments.ACCESSION_ID 

    group by payor_group.PAYOR_GROUP, DATEPART(MM,accession.XIFIN_LOAD_DATE), 
    DATEPART(yyyy,accession.XIFIN_LOAD_DATE) 
+0

정말 고마워요! –

2

10m 행의 테이블에 인덱스가 없으면 성능이 저하 될 가능성이 큽니다. 1 시간 동안 실행되는 쿼리는 최적화되지 않았으므로주의가 필요합니다. 대부분의 쿼리는 몇 초 안에 실행되어야합니다.

키 열 (payor.payor_id, payments.payment_payor_id, payor.payor_group_key, paygor_group.payor_group_key, payments.accession_id)에 색인을 추가하는 것이 좋습니다. 그 후에 SSMS에서 "실제 실행 계획 포함"옵션이 활성화 된 쿼리 파일 메뉴에서 쿼리를 실행하십시오. 쿼리를 실행하면 추가 인덱스를 제안 할 것이므로 적용을 고려해야합니다.

테이블이 다른 프로세스에서 많은로드를 받고 있습니까? 그들은 많은 수신 데이터를 받아들입니까?

쿼리 구문을 변경하거나 "다른"최적화를 수행하기 전에 인덱스를 적용해야합니다. 인덱스를 입력하고 쿼리가 정상 속도 (< 1 분)로 수행 된 후에는 추가 인덱스 튜닝을 보거나 필요한 경우 테이블/쿼리 힌트를 추가 할 수 있습니다.

+0

감사합니다. NO LOCK은 무엇을합니까? 우리는 하루에 한 번만 LOAD 프로세스에서 들어오는 데이터를 받아들입니다. –

+5

제발 놀잇에게 이렇게 조언하지 마세요. nolock은 거의 필요하지 않으며 위험합니다. 또한, 여기에 문제가되지 않습니다. – usr

+1

'WITH (READPAST)'가 더 좋은 아이디어 일 수 있습니다. 잠금 (WITH (NOLOCK)과 같은)을 피하고 더티 읽기 (*와는 달리 * WITH (NOLOCK))를 발생시키지 않습니다. –

1

첫 번째 쿼리에서 해당 날짜의 월/연도 대신에 accession.XIFIN_LOAD_DATE으로 그룹화 했으므로 두 번째 그룹이 필요합니다. 이 문제를 해결하면 단 하나의 쿼리 일뿐입니다. 이렇게하면 성능이 향상되지만 색인이 가장 큰 도움이됩니다.

관련 문제