Заполнение большого SQL-запроса tempdb нуждается в оптимизации - PullRequest
2 голосов
/ 27 января 2012

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

Теперь представление завершено и работает, однако из-за большого количества предложений очень быстро заполняется база данных 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 Ответ

4 голосов
/ 27 января 2012

Все конструкции похожи на это:

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

Может быть перефакторизован в

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

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


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

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

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


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

...