Может кто-нибудь, пожалуйста, скажите мне, как оптимизировать запрос?

#sql #sql-server #tsql #query-optimization

#sql #sql-сервер #tsql #запрос-оптимизация

Вопрос:

У меня есть этот запрос ниже, и я выполняю много подзапросов. Это хороший способ сделать это? Если нет, может кто-нибудь, пожалуйста, скажите мне, как лучше написать / оптимизировать этот запрос? Я пытаюсь научиться лучше оптимизировать запросы. пожалуйста, укажите мне правильное направление.

 SELECT DISTINCT 
      cases.case_sk 
    , cases.case_number
    , cases.lawtype_code
    , cases.closed_ind
    , cases.date_received 
    , cases.[style]
    , COALESCE ((select initials from employee where employee_sk=cases.atty1_sk),'') as 'Atty1' 
    , COALESCE ((select initials from employee where employee_sk=cases.atty2_sk),'') as 'Atty2'
    , (select description from group_items where item_sk =case_parties.role_sk) as 'Role'
    , COALESCE ((select description from group_items where item_sk =case_pick.item_sk ),'') as 'Case Type'
FROM cases
LEFT JOIN case_parties
    on case_parties.case_sk =cases.case_sk
    and case_parties.role_sk in  (select item_sk from group_items where group_code='ROLES' /*and item_sk='1312'*/)
LEFT JOIN case_pick
    on case_pick.case_sk = cases.case_sk
    and group_code='CTYPE'
 

Образец данных
введите описание изображения здесь
Спасибо

Комментарии:

1. Я бы использовал соединение вместо вложенных запросов, его легче отлаживать и анализировать, а также в некоторых случаях вы можете уменьшить количество операций извлечения / чтения из таблицы, в вашем случае, если вы можете предоставить образцы данных и желаемый результат, вам будет легче помочь.

2. @eshirvana, я понял. Я также добавил образец изображения данных. Спасибо

3. Оптимизация запроса обычно начинается с фактического плана выполнения . Оттуда вы можете определить, какие индексы могут быть подходящими для повышения производительности. Пожалуйста, смотрите раздел Вставить план , чтобы узнать, как включить план выполнения в ваш вопрос. Совет: для улучшения удобства обслуживания используйте псевдонимы таблиц во всех ссылках на столбцы, даже в подзапросах.

Ответ №1:

Попробуйте это…

Вы можете добиться того же, используя CTE

 ;WITH CTE_case_parties AS(  SELECT *
FROM case_parties
INNER JOIN group_items ON case_parties.role_sk =item_sk
where group_code='ROLES')

SELECT DISTINCT 
  cases.case_sk 
, cases.case_number
, cases.lawtype_code
, cases.closed_ind
, cases.date_received 
, cases.[style]
, CASE WHEN employee_sk=cases.atty1_sk THEN initials ELSE'' END as 'Atty1' 
, CASE WHEN employee_sk=cases.atty2_sk THEN initials ELSE'' END as 'Atty2'
, CASE WHEN item_sk =case_parties.role_sk THEN description END as 'Role'
, CASE WHEN item_sk =case_pick.item_sk  THEN description ELSE'' END as 'Case Type'
FROM cases
LEFT JOIN CTE_case_parties on case_parties.case_sk =cases.case_sk
LEFT JOIN case_pic on case_pick.case_sk = cases.case_sk and group_code='CTYPE'
CROSS JOIN employee E
CROSS JOIN group_items G
 

Комментарии:

1. В вашем ответе, похоже, нет CTE, и подзапросы совершенно не нужны, т. Е. Вы можете использовать ... cross join Employee as E cross join Group_Items as G; . Мне любопытно, использует ли оптимизатор запросов case выражения для ограничения перекрестных соединений или он просто перебирает все это.

2. @HABO Я отредактировал код сейчас, пожалуйста, проверьте сейчас…..