#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 Я отредактировал код сейчас, пожалуйста, проверьте сейчас…..