powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / EJB QL оптимизация запроса
12 сообщений из 12, страница 1 из 1
EJB QL оптимизация запроса
    #38809205
zharenkov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день, в проекте имеется запрос, который отрабатывает очень долго, если база больщая. Хотел бы его оптимизировать. Как видно - в запросе все вложенные селекты довольно похожи, отличаются обычно 1-2 условиями. Возможно ли как то снизить количество джоинов? Или как то ускорить такой запрос?
Вот сам запрос:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
select u.lastName || ' ' || u.firstName || ' ' || u.middleName,  
                               
(select count(p1) from Kontroller k1 join k1.gossrvcDocPackage p1 where k1.user = k.user   
 and (p1.externalSystem = 1 or p1.externalSystem = 4) and p1.completedDate = NULL),  
                               
(select count(p4) from Kontroller k1 join k1.gossrvcDocPackage p4 where k1.user = k.user  
and p4.externalSystem = NULL and p4.completedDate = NULL),  
                               
(select count(p2)  from Kontroller k1, GossrvcDocPackageItem item, CardElementFieldValue cv, CardField cf  join k1.gossrvcDocPackage p2  
where  k1.user = k.user and (p2.externalSystem = 1 or p2.externalSystem = 4) and p2.completedDate <> NULL and item.isResult = true   
 and item.gossrvcDocPackage.id = p2.id  
 and cv.cardElement = item.docTypeId  
 and cf.fieldId = cv.cardField.id   
 and cf.fieldName='typeResult'  
 and item.docValue = true   
 and cv.fieldIntegerValue = 0   and p2.testPackage <> true),  
                               
 (select count(p5)   
 from Kontroller k1, GossrvcDocPackageItem item, CardElementFieldValue cv, CardField cf  join k1.gossrvcDocPackage p5  
 where  k1.user = k.user and p5.externalSystem = NULL and p5.completedDate <> NULL and item.isResult = true   
 and item.gossrvcDocPackage.id = p5.id   
 and cv.cardElement = item.docTypeId   
 and cf.fieldId = cv.cardField.id   
 and cf.fieldName='typeResult'   
 and item.docValue = true   
 and cv.fieldIntegerValue = 0   
 and p5.testPackage <> true),   
                               
 (select count(p3)   
 from Kontroller k1, GossrvcDocPackageItem item, CardElementFieldValue cv, CardField cf  join k1.gossrvcDocPackage p3  
 where  k1.user = k.user and (p3.externalSystem = 1 or p3.externalSystem = 4) and p3.completedDate <> NULL and item.isResult = true   
 and item.gossrvcDocPackage.id = p3.id   
 and cv.cardElement = item.docTypeId   
 and cf.fieldId = cv.cardField.id   
 and cf.fieldName='typeResult'   
 and item.docValue = true   
 and cv.fieldIntegerValue = 1   
 and p3.testPackage <> true),   
                               
 (select count(p6)   
 from Kontroller k1, GossrvcDocPackageItem item, CardElementFieldValue cv, CardField cf  join k1.gossrvcDocPackage p6  
 where  k1.user = k.user and p6.externalSystem = NULL and p6.completedDate <> NULL and item.isResult = true   
 and item.gossrvcDocPackage.id = p6.id   
 and cv.cardElement = item.docTypeId   
 and cf.fieldId = cv.cardField.id   
 and cf.fieldName='typeResult'   
 and item.docValue = true   
 and cv.fieldIntegerValue = 1  
 and p6.testPackage <> true)   
                               
 from Kontroller k   
 left join k.user u where u.owner = 'RSOC'   
 group by u.lastName || ' ' || u.firstName || ' ' || u.middleName, k.user, k.gossrvcDocPackage;  



Буду благодарен за наставления и советы. Спасибо.
...
Рейтинг: 0 / 0
EJB QL оптимизация запроса
    #38809213
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Используйте средства разработки для вашей БД, чтобы составить и посмотреть план запроса. Может тупо индексов в базе не хватает?
...
Рейтинг: 0 / 0
EJB QL оптимизация запроса
    #38809259
YamahaR1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
zharenkov,

Какая у вас СУБД? Попробуйте задать этот вопрос в ветке которая соответствует названию вашей СУБД на этом форуме.
...
Рейтинг: 0 / 0
EJB QL оптимизация запроса
    #38809315
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уже вот это:
Код: sql
1.
2.
3.
4.
5.
6.
 (select count(p1)
  from Kontroller k1
  join k1.gossrvcDocPackage p1
  where k1.user = k.user and (p1.externalSystem = 1 or p1.externalSystem = 4) and
        p1.completedDate = NULL
 )

бредятина.
1. ANSI-соединение использует ON, а условие отбора (только) фильтрует результирующий набор;
2. В SQL - трёхзначая логика и должно быть IS NULL, а не ваша отсебятина;
3. Думать лень, но, обычно, агрегатные функции используют в колонках без всяких подзапросов.
Лично мне, в своё время, помогло " Использование неявных и явных JOIN ". Хотя в соседнем топике указывают, что ANSI-соединения Oracle - глюкодром и баготрах.

P.S. Если требуется самосоединение, то так и пишут:
Код: sql
1.
2.
3.
select count(k1) "Счётчик"
from kontroller k
join kontroller k1 on k1.user = k.user
...
Рейтинг: 0 / 0
EJB QL оптимизация запроса
    #38809341
ivanra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
1)
Код: plsql
1.
left join k.user u where u.owner = 'RSOC'

выдаст результаты такие же, как c inner join, но со скоростью left join, поэтому убираем left
2) = NULL нельзя писать, надо IS NULL
3) избавиться от Kontroller k1 в подзапросах
4) вероятно, count в подзапросах можно посчитать за 1 проход используя case when, но это уже sql
...
Рейтинг: 0 / 0
EJB QL оптимизация запроса
    #38809391
zharenkov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
По поводу сравнения на null и joinа без on - для EJB QL это нормально. База у меня постргессовская, вот так выглядит запрос, которым выцепляю данные из базы через squirell.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
select u.last_Name, 
(select count(p1.id) from Kontroller k1 join gossrvc_doc_package p1 on p1.id = k1.doc_package_id
where k.user_id = k1.user_id and (p1.externalsystem=1 or p1.externalsystem=4) and p1.completed_date IS NULL),

(select count(p4.id) from Kontroller k1 join gossrvc_doc_package p4 on p4.id = k1.doc_package_id
where k.user_id = k1.user_id and p4.externalsystem is null and p4.completed_date is null),

(select count(p2.id) from Kontroller k1 join gossrvc_doc_package p2 on p2.id = k1.doc_package_id, gossrvc_doc_package_item item, card_element_field_value cv, card_field cf
where k.user_id = k1.user_id and (p2.externalsystem=1 or p2.externalsystem=4) and p2.completed_date IS NULL
and item.is_result = true and p2.id = item.doc_package_id and cv.card_element_id = item.doc_type_id and cf.field_id = cv.field_id
and cf.field_name = 'typeResult' and item.doc_value = true and cv.field_integer_value = 0 and p2.test != true),

(select count(p5.id) from Kontroller k1 join gossrvc_doc_package p5 on p5.id = k1.doc_package_id, gossrvc_doc_package_item item, card_element_field_value cv, card_field cf
where k.user_id = k1.user_id and p5.externalsystem is null and p5.completed_date IS NULL
and item.is_result = true and p5.id = item.doc_package_id and cv.card_element_id = item.doc_type_id and cf.field_id = cv.field_id
and cf.field_name = 'typeResult' and item.doc_value = true and cv.field_integer_value = 0 and p5.test != true),

(select count(p3.id) from Kontroller k1 join gossrvc_doc_package p3 on p3.id = k1.doc_package_id, gossrvc_doc_package_item item, card_element_field_value cv, card_field cf
where k.user_id = k1.user_id and (p3.externalsystem=1 or p3.externalsystem=4) and p3.completed_date IS NULL
and item.is_result = true and p3.id = item.doc_package_id and cv.card_element_id = item.doc_type_id and cf.field_id = cv.field_id
and cf.field_name = 'typeResult' and item.doc_value = true and cv.field_integer_value = 1 and p3.test != true),

(select count(p6.id) from Kontroller k1 join gossrvc_doc_package p6 on p6.id = k1.doc_package_id, gossrvc_doc_package_item item, card_element_field_value cv, card_field cf
where k.user_id = k1.user_id and p6.externalsystem is null and p6.completed_date IS NULL
and item.is_result = true and p6.id = item.doc_package_id and cv.card_element_id = item.doc_type_id and cf.field_id = cv.field_id
and cf.field_name = 'typeResult' and item.doc_value = true and cv.field_integer_value = 1 and p6.test != true)

from Kontroller k inner join  user_ref u on k.user_id = u.id where u.owner = 'RSOC'
group by u.last_name, k.user_id, k.doc_package_id



Про иннер джоин хорошее замечание, с ним скрипт такой отработал менее чем за 2 секунды, а с лефтом за 3.5. Не совсем понятно, как в таком запросе избавиться от Kontroller k1 ибо по его полю идет join c табличкой gossrvc_doc_package. Тут не самосоединение.
...
Рейтинг: 0 / 0
EJB QL оптимизация запроса
    #38809417
ivanra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
zharenkov,
с выражением = null повезло, а вот <>null превратилось в is null
...
Рейтинг: 0 / 0
EJB QL оптимизация запроса
    #38809479
ivanra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
zharenkov, насчет Kontroller k1:
- в группировке стоит k.doc_package_id
- в то же время подзапросы написаны так, что они не зависят от k.doc_package_id, а только от пользователя, для каждого k.doc_package_id на пользователе будут получены одни и те же результаты.
Поэтому где-то лишнее, либо в группировке, либо в подзапросах. Правильный ответ зависит от того, что требовалось в задании )
...
Рейтинг: 0 / 0
EJB QL оптимизация запроса
    #38809592
zharenkov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ivanra , спасибо, Вы правы. Не заметил, что у меня выводились только первые 100 записей выборки, расширил до 1000 и там куча одинаковых резльтатов, убрал группировку и их стало всего 44)
Ради личного интереса - а в подзапросах как бы Вы поменяли, не трогая группировку по doc_package_id? Думал-думал и не придумал
...
Рейтинг: 0 / 0
EJB QL оптимизация запроса
    #38809618
ivanra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Если с группировкой по k.doc_package_id , то в подзапросах выкинуть Kontroller k1, соединение на верхний Kontroller k:
Код: sql
1.
select count(p) from k.gossrvcDocPackage p where p....
...
Рейтинг: 0 / 0
EJB QL оптимизация запроса
    #38809620
zharenkov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ivanra, понял, еще раз спасибо.
...
Рейтинг: 0 / 0
EJB QL оптимизация запроса
    #38809693
Alexey Tomin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. Sidorov Хотя в соседнем топике указывают, что ANSI-соединения Oracle - глюкодром и баготрах.

Так было в 9й версии. В 10й уже нормально, в 11й ANSI- это база.
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / EJB QL оптимизация запроса
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]