2012-01-27 4 views
1

У меня довольно большой SQL-запрос, который большинство из них пришло из экспорта объектов Business Objects SQL, который должен быть реплицирован на SQL Server для целей отчетности.Большое заполнение SQL-запросов tempdb нуждается в оптимизации

Теперь вид завершен и работает, однако из-за большого количества предложений очень быстро заполняется tempdb и падает.

Насколько мне известно, мне нужно все в предложениях WHERE, однако я считаю, что это можно оптимизировать, чтобы не заполнить tempdb.

Где положения следующим образом:

WHERE 

dbo.VIEW1.ABSENCE_TYPE IN ('leavetype1', 'leavetype2', 'leavetype3', 'leavetype4', 'leavetype5') 

AND 
    ( 
    (ALIAS1.link_type_id='PN_RP_UNIT' or ALIAS1.link_type_id IS NULL) ) 
    AND (ALIAS2.OBJECT_TYPE='POSITION' ) 
    AND (ALIAS3.object_type='UNIT' ) 
    AND (CONTRACT_NAME.object_type='CONT' ) 
    AND ((POST_LNK.link_type_id='POSITION' OR POST_LNK.link_type_id IS NULL) ) 
    AND (dbo.table1.link_type_id = 'CONT' ) 
    AND (dbo.table1.team_party_id IS NULL ) 
    AND (EMP_TPERSON.non_emp_s='0' ) 
    --AND (((dbo.tleaver.starting_d) <= @Prompt('Report To Date','D',,Mono,Free) AND ((dbo.tleaver.leaving_d) >= @Prompt('Report From Date','D',,Mono,Free) OR (dbo.tleaver.leaving_d) is null) ) 
    AND dbo.VIEW4.UNIT_NM_01 = 'Orgainisation Name' 

    AND ALIAS2.PARTY_NM NOT LIKE '%occ1%' 
    AND ALIAS2.PARTY_NM NOT LIKE '%occ2%' 
    AND dbo.VIEW2.CONTRACTUAL_HOURS != 0 
    AND dbo.VIEW6.FTE_HOURS != 0 
AND ((ALIAS1.PARTY_LNK_D <= (dbo.VIEW3.ABS_DAY_DATE) OR ALIAS1.PARTY_LNK_D IS NULL) AND (ALIAS1.PARTY_LNK_ED >= (dbo.VIEW3.ABS_DAY_DATE) OR ALIAS1.PARTY_LNK_ED IS NULL) ) 
    AND (((dbo.table1.PARTY_LNK_D) <= (dbo.VIEW3.ABS_DAY_DATE) OR (dbo.table1.PARTY_LNK_D) is null) AND ((dbo.table1.PARTY_LNK_ED) >= (dbo.VIEW3.ABS_DAY_DATE) OR (dbo.table1.PARTY_LNK_ED) is null) ) 
    --AND dbo.VIEW1.ABSENCE_START_DATE <= @variable('report to date') 
    --AND (dbo.VIEW1.ABSENCE_END_DATE >= @variable('report from date') 
-- OR dbo.VIEW1.ABSENCE_END_DATE IS NULL ) 
    --AND dbo.VIEW3.ABS_DAY_DATE >= @variable('report from date') 
    --AND dbo.VIEW3.ABS_DAY_DATE <= @variable('report to date') 
    AND ((POST_LNK.PARTY_LNK_D <= (dbo.VIEW3.ABS_DAY_DATE) OR POST_LNK.PARTY_LNK_D is null) AND (POST_LNK.PARTY_LNK_ED >= (dbo.VIEW3.ABS_DAY_DATE) OR POST_LNK.PARTY_LNK_ED is null) ) 
    AND ((dbo.VIEW2.INHERITED_FROM_DATE<=(dbo.VIEW3.ABS_DAY_DATE) OR dbo.VIEW2.INHERITED_FROM_DATE IS NULL) AND (dbo.VIEW2.INHERITED_TO_DATE>=(dbo.VIEW3.ABS_DAY_DATE) OR dbo.VIEW2.INHERITED_TO_DATE IS NULL) AND (dbo.VIEW2.HOURS_START_DATE<=(dbo.VIEW3.ABS_DAY_DATE) OR dbo.VIEW2.HOURS_START_DATE IS NULL) AND (dbo.VIEW2.HOURS_END_DATE>=(dbo.VIEW3.ABS_DAY_DATE) OR dbo.VIEW2.HOURS_END_DATE IS NULL) ) 
    AND ((dbo.VIEW6.INHERITED_FROM_DATE<=(dbo.VIEW3.ABS_DAY_DATE) OR dbo.VIEW6.INHERITED_FROM_DATE IS NULL) AND (dbo.VIEW6.INHERITED_TO_DATE>=(dbo.VIEW3.ABS_DAY_DATE) OR dbo.VIEW6.INHERITED_TO_DATE IS NULL) AND (dbo.VIEW6.HOURS_START_DATE<=(dbo.VIEW3.ABS_DAY_DATE) OR dbo.VIEW6.HOURS_START_DATE IS NULL) AND (dbo.VIEW6.HOURS_END_DATE>=(dbo.VIEW3.ABS_DAY_DATE) OR dbo.VIEW6.HOURS_END_DATE IS NULL) ) 
    AND ((dbo.VIEW4.LNK_01_02_D <= (dbo.VIEW3.ABS_DAY_DATE) OR dbo.VIEW4.LNK_01_02_D IS NULL) AND (dbo.VIEW4.LNK_02_03_D <= (dbo.VIEW3.ABS_DAY_DATE) OR dbo.VIEW4.LNK_02_03_D IS NULL) AND (dbo.VIEW4.LNK_03_04_D <= (dbo.VIEW3.ABS_DAY_DATE) OR dbo.VIEW4.LNK_03_04_D IS NULL) AND (dbo.VIEW4.LNK_04_05_D <= (dbo.VIEW3.ABS_DAY_DATE) OR dbo.VIEW4.LNK_04_05_D IS NULL) AND (dbo.VIEW4.LNK_05_06_D <= (dbo.VIEW3.ABS_DAY_DATE) OR dbo.VIEW4.LNK_05_06_D IS NULL) AND (dbo.VIEW4.LNK_06_07_D <= (dbo.VIEW3.ABS_DAY_DATE) OR dbo.VIEW4.LNK_06_07_D IS NULL) AND (dbo.VIEW4.LNK_07_08_D <= (dbo.VIEW3.ABS_DAY_DATE) OR dbo.VIEW4.LNK_07_08_D IS NULL) AND (dbo.VIEW4.LNK_08_09_D <= (dbo.VIEW3.ABS_DAY_DATE) OR dbo.VIEW4.LNK_08_09_D IS NULL) AND (dbo.VIEW4.LNK_09_10_D <= (dbo.VIEW3.ABS_DAY_DATE) OR dbo.VIEW4.LNK_09_10_D IS NULL) AND (dbo.VIEW4.LNK_01_02_ED >= (dbo.VIEW3.ABS_DAY_DATE) OR dbo.VIEW4.LNK_01_02_ED IS NULL) AND (dbo.VIEW4.LNK_02_03_ED >= (dbo.VIEW3.ABS_DAY_DATE) OR dbo.VIEW4.LNK_02_03_ED IS NULL) AND (dbo.VIEW4.LNK_03_04_ED >= (dbo.VIEW3.ABS_DAY_DATE) OR dbo.VIEW4.LNK_03_04_ED IS NULL) AND (dbo.VIEW4.LNK_04_05_ED >= (dbo.VIEW3.ABS_DAY_DATE) OR dbo.VIEW4.LNK_04_05_ED IS NULL) AND (dbo.VIEW4.LNK_05_06_ED >= (dbo.VIEW3.ABS_DAY_DATE) OR dbo.VIEW4.LNK_05_06_ED IS NULL) AND (dbo.VIEW4.LNK_06_07_ED >= (dbo.VIEW3.ABS_DAY_DATE) OR dbo.VIEW4.LNK_06_07_ED IS NULL) AND (dbo.VIEW4.LNK_07_08_ED >= (dbo.VIEW3.ABS_DAY_DATE) OR dbo.VIEW4.LNK_07_08_ED IS NULL) AND (dbo.VIEW4.LNK_08_09_ED >= (dbo.VIEW3.ABS_DAY_DATE) OR dbo.VIEW4.LNK_08_09_ED IS NULL) AND (dbo.VIEW4.LNK_09_10_ED >= (dbo.VIEW3.ABS_DAY_DATE) OR dbo.VIEW4.LNK_09_10_ED IS NULL) ) 

    AND ALIAS2.PARTY_NM NOT LIKE 'pos1' 
    AND dbo.VIEW5.contract_category IN ('pos2', 'pos3', 'pos4', 'pos4') 
    AND (((dbo.VIEW5.inherited_from_date)<=(dbo.VIEW3.ABS_DAY_DATE) OR (dbo.VIEW5.inherited_from_date) IS NULL) AND ((dbo.VIEW5.inherited_to_date)>=(dbo.VIEW3.ABS_DAY_DATE) OR (dbo.VIEW5.inherited_to_date) IS NULL) AND ((dbo.VIEW5.contract_category_d)<=(dbo.VIEW3.ABS_DAY_DATE) OR (dbo.VIEW5.contract_category_d) IS NULL) AND ((dbo.VIEW5.contract_category_ed)>=(dbo.VIEW3.ABS_DAY_DATE) OR (dbo.VIEW5.contract_category_ed) IS NULL) ) 
    AND ALIAS2.PARTY_NM NOT LIKE 'role1' 
    AND ALIAS2.PARTY_NM NOT LIKE 'role2' 
    AND ALIAS2.PARTY_NM NOT LIKE '%role3%' 

    AND (((dbo.VIEW4.inherited_from_date)<=(dbo.VIEW3.ABS_DAY_DATE) OR (dbo.VIEW4.inherited_from_date) IS NULL) AND ((dbo.VIEW4.inherited_to_date)>=(dbo.VIEW3.ABS_DAY_DATE) OR (dbo.VIEW4.inherited_to_date) IS NULL) AND ((dbo.VIEW4.contract_basis_d)<=(dbo.VIEW3.ABS_DAY_DATE) OR (dbo.VIEW4.contract_basis_d) IS NULL) AND ((dbo.VIEW4.contract_basis_ed)>=(dbo.VIEW3.ABS_DAY_DATE) OR (dbo.VIEW4.contract_basis_ed) IS NULL) ) 
    AND dbo.VIEW5.contract_category IN ('pos1', 'pos2', 'pos3', 'pos4') 
    AND (((dbo.VIEW5.inherited_from_date)<=(dbo.VIEW3.ABS_DAY_DATE) OR (dbo.VIEW5.inherited_from_date) IS NULL) AND ((dbo.VIEW5.inherited_to_date)>=(dbo.VIEW3.ABS_DAY_DATE) OR (dbo.VIEW5.inherited_to_date) IS NULL) AND ((dbo.VIEW5.contract_category_d)<=(dbo.VIEW3.ABS_DAY_DATE) OR (dbo.VIEW5.contract_category_d) IS NULL) AND ((dbo.VIEW5.contract_category_ed)>=(dbo.VIEW3.ABS_DAY_DATE) OR (dbo.VIEW5.contract_category_ed) IS NULL) 

Onece побежал это должно вернуть около 50 000 строк данных, кто может делать какие-либо предложения о том, как я могу остановить положить столько давления на данной TempDb и запустить этот запрос ,

+1

Да настроен на автозагрузку, но ограничен, увеличивается до 130 гб – JsonStatham

+1

Предложение 'where' само по себе не дает нам возможности оптимизировать - можете ли вы включить остальную часть запроса? Кроме того, это отчетность от хранилища данных или операционной системы? (130 ГБ временного пространства для DWH не особенно велико.) –

+0

@Mark Bannister: не очень большая операционная система DWH, если вы запускаете запрос без предложения WHERE, он занимает 6 секунд, чтобы противостоять 30 нечетным минутам, поэтому это WHERE, которая нуждается в оптимизации. – JsonStatham

ответ

4

Все конструкции, как это:

(POST_LNK.link_type_id='POSITION' OR POST_LNK.link_type_id IS NULL) 

Может быть повторно учтены в

ISNULL(POST_LNK.link_type_id,'POSITION') = 'POSITION' 

Просто потому, где положение является «замедление» не означает, что не повторно -факторинг, который может произойти с остальной частью запроса. Часто соединения и подзапросы могут быть изменены, чтобы иметь ограничения и давать большие ускорения скорости, потому что во внешнем запросе проверяется меньшее количество записей.


Кроме того, если бы я был в WAG я бы сказал, что ваша проблема с тем, где элементы, как это:

AND ALIAS2.PARTY_NM NOT LIKE '%occ1%' 
AND ALIAS2.PARTY_NM NOT LIKE '%occ2%' 
AND ALIAS2.PARTY_NM NOT LIKE '%role3%' 

Вы могли бы рассмотреть рефакторинга, чтобы удалить эту часть, если это проблема (например, добавление occ булева столбца и обновляя его вставку и изменений.)


Я также заметил, что вы присоединяетесь к количеству просмотров, что может быть проблемой, если мнение s делают что-то немое, как вызов функций. Если столбец не используется, SQL может оптимизировать эти медленные сокращения, но повторно добавлять их, если вы используете элемент в месте.

+1

+1 Для 'LIKE', являющегося вероятным источником проблем с производительностью –

+0

+1 Для намека на вызовы функций во взглядах ... обнаружил, что это проблема во многих случаях. – scarpacci

Смежные вопросы