2010-12-13 4 views
0

옛날에 많은 많은과 함께보기가 있었다 조인 :Biggest View ever! 이 괴물을 어떻게 줄일 수 있습니까 ??

CREATE VIEW [dbo].[V_BIGGEST_VIEW_EVER] 
AS 
SELECT {many many columns} 
FROM (SELECT * FROM dbo.T_CUS_TSK_TASK WHERE is_deleted=0) T 
    INNER JOIN dbo.V_CUS_GRP_GROUP G ON (T.group_id = G.group_id) 
    INNER JOIN dbo.T_BKK_DISCOUNT_TYPE DT ON (DT.discount_type_id=T.discount_type_id) 
    INNER JOIN dbo.T_BKK_CURRENCY DC ON (T.debit_currency_id=DC.currency_id) 
    INNER JOIN dbo.T_BKK_CURRENCY PC ON (T.payback_currency_id=PC.currency_id) 
    INNER JOIN dbo.T_BKK_CURRENCY FC ON (T.final_debit_currency_id=FC.currency_id) 
    INNER JOIN dbo.T_GLOBAL_COUNTER D1C ON (D1C.company_id=T.company_id AND 
    D1C.counter_name='PROFORMA_INVOICE_COUNTER') 
    INNER JOIN dbo.T_GLOBAL_COUNTER D2C ON (D2C.company_id=T.company_id AND 
    D2C.counter_name='TAX_INVOICE_COUNTER') 
    INNER JOIN dbo.T_GLOBAL_COUNTER D3C ON (D3C.company_id=T.company_id AND 
    D3C.counter_name='INVOICE_RECEIPT_COUNTER') 
    INNER JOIN dbo.T_GLOBAL_COUNTER D4C ON (D4C.company_id=T.company_id AND 
    D4C.counter_name='DELIVERY_NOTE_COUNTER') 
    INNER JOIN dbo.T_GLOBAL_COUNTER D5C ON (D5C.company_id=T.company_id AND 
    D5C.counter_name='BILL_OF_LADING_COUNTER') 
    INNER JOIN dbo.T_GLOBAL_COUNTER D6C ON (D6C.company_id=T.company_id AND 
    D6C.counter_name='CREDIT_INVOICE_COUNTER') 
    LEFT JOIN dbo.V_SYS_BRANCH BR ON (T.branch_id = BR.branch_id) 
    LEFT JOIN dbo.T_CUS_TSK_TASKS_ARRAY AR ON (T.array_id = AR.array_id) 
    LEFT JOIN dbo.T_DRIVER D ON (T.driver_id = D.driver_id) 
    LEFT JOIN dbo.T_VEHICLE V ON (T.vehicle_id = V.vehicle_id) 
    LEFT JOIN dbo.T_STF_INVITER I ON (T.inviter_id = I.inviter_id) 
    LEFT JOIN dbo.T_STF_SUBCONTRACTOR SC1 ON (SC1.subcontractor_id = D.subcontractor_id) 
    LEFT JOIN dbo.T_STF_SUBCONTRACTOR SC2 ON (SC2.subcontractor_id = T.subcontractor_id) 
    LEFT JOIN dbo.T_CUS_TSK_TASK_STATUS S ON (S.task_status_id=T.task_status_id) 
    LEFT JOIN dbo.V_STF_SUB_LOCATION SL1 ON (SL1.sub_location_id=T.start_sub_location_id) 
    LEFT JOIN dbo.V_STF_SUB_LOCATION SL2 ON (SL2.sub_location_id=T.end_sub_location_id) 
    LEFT JOIN dbo.T_STF_CUSTOMER CU ON (CU.customer_id=T.customer_id) 
    LEFT JOIN dbo.T_STF_CUSTOMER_SPLITTING_CODE SP ON (SP.splitting_id=T.splitting_id) 
    LEFT JOIN dbo.V_CUS_TSK_CREDIT_FOR_TASK CR ON CR.task_id=T.task_id 
    LEFT JOIN dbo.T_BKK_PROFORMA_INVOICE D1 ON (T.proforma_invoice_id=D1.proforma_invoice_id) 
    LEFT JOIN dbo.T_BKK_TAX_INVOICE D2 ON (T.tax_invoice_id=D2.tax_invoice_id) 
    LEFT JOIN dbo.T_BKK_INVOICE_RECEIPT D3 ON (T.invoice_receipt_id=D3.invoice_receipt_id) 
    LEFT JOIN dbo.T_BKK_DELIVERY_NOTE D4 ON (T.delivery_note_id=D4.delivery_note_id) 
    LEFT JOIN dbo.T_BKK_BILL_OF_LADING D5 ON (T.bill_of_lading_id=D5.bill_of_lading_id) 
    LEFT JOIN dbo.V_CUS_TSK_CONTAINER CONTAINER1 ON (CONTAINER1.container_id=T.container1_id) 
    LEFT JOIN dbo.V_CUS_TSK_CONTAINER CONTAINER2 ON (CONTAINER2.container_id=T.container2_id) 
    LEFT JOIN dbo.V_STF_TRAILER TRAILER1 ON (TRAILER1.trailer_id=T.trailer1_id) 
    LEFT JOIN dbo.V_STF_TRAILER TRAILER2 ON (TRAILER2.trailer_id=T.trailer2_id) 
    LEFT JOIN dbo.T_STF_LUGGAGE_TYPE LUGGAGE_TYPE ON (LUGGAGE_TYPE.luggage_type_id=T.luggage_type_id) 

어느 날 사용자가 쿼리에 대한보기 질문 :

SELECT {many many columns} 
FROM V_BIGGEST_VIEW_EVER 
WHERE {column1}=1 AND 
     {column2}=2 AND 
     ....... 
     {and so and so} 
     ....... 
     {columnN}=N 

을 그리고 게으른 가장 큰 뷰는 사상 근무 5 분 (!!) 이후에 결과를 반환합니다.

이러한 테이블에는 기본 키와 외래 키가 있습니다.

쿼리를 실행하는 시간을 줄일 수있는 방법은 무엇입니까? 어떻게이보기를 줄일 수 있습니까?

Google에서 검색했지만 도움이되는 항목을 찾을 수 없습니다.

+2

모든 쿼리에 이러한 조인의 정보가 모두 필요합니까? –

+0

오. 나의. 하나님. 나는 둘째로 마르셀로 (Marcelo)의 질문은 정말 필요한 것인가? – slezica

+0

Thirded. 그건 끔찍한 일입니다. 불행에서 벗어나십시오. – SimonJ

답변

3

쿼리가 유효한 비즈니스 요구 사항을 나타내는 지 잠시 생각해보십시오.

보기가 크다고해서 그것이 잘못 수행해야한다는 것을 의미하지는 않습니다. 이보기에서 선택하는 성능은 기본 테이블의 레이아웃에 의해 주로 결정됩니다. 심지어 20 개의 조회 테이블에 조인을 남겨 두었다 고해도 SQL Server는 수행되는 쿼리에 대해 테이블 ​​T_CUS_TSK_TASK이 적절하게 인덱싱되면 해당 결과를 밀리 초 단위로 반환해야합니다.

다른 쿼리 최적화와 마찬가지로이 방법을 사용해야합니다. 주요 IO 요인 (SET STATISTICS IO ON)을 조사하고, 쿼리 계획을 조사하고, 카디널리티 예상치를 살펴보고, 통계가 올바른지 고려하고, 쿼리 힌트가없는 쿼리를 살펴보고 이에 따라 테이블 스키마를 어떻게 변경할 수 있는지 고려하십시오. 출발점은 Designing Indexes이어야합니다. (이 가장 왼쪽의 클러스터 된 인덱스 키가 아니라면 분명히 문제가 있음을 알 수있을 것입니다.

텍스트을 기반으로하는 쿼리에서 맹목적으로 해킹하는 현재의 접근 방식은 완전히 비전문적입니다.

이제는 물론 하드입니다.이 쿼리는 유효한 비즈니스 요구 사항을 나타냅니다. 그러나 쿼리 최적화 및 데이터 모델 디자인 ('해당 테이블에 기본 키 및 외래 키가 있음')에 대한 귀하의 관점은 온화한 용어를 사용하기위한 원시적입니다. 색인 디자인에 대해 읽고 색인을 다루고 책을 구입하십시오 (예 : Inside Microsoft SQL Server 2005: Query Tuning and Optimization).

관련 문제