Форум программистов, компьютерный форум, киберфорум
Oracle
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.70/40: Рейтинг темы: голосов - 40, средняя оценка - 4.70
3 / 3 / 1
Регистрация: 22.10.2014
Сообщений: 106
1

Запрос работает очень медленно

20.08.2015, 08:58. Показов 7703. Ответов 11
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Помогите мне ускорить работу запроса. Сам запрос имеет такой вид
SQL
1
2
3
4
5
6
7
SELECT  x2.столбец1, x2.столбец2, xx.столбец1, x.столбец1, x.столбец2, x1.столбец1
  FROM
 (подзапрос1) x,
 (подзапрос2) xx,
 (подзапрос3) x1,
 (подзапрос4) x2
 WHERE x.столбец1(+)=х1.столбец1 AND х1.столбец1(+)=х2.столбец1 AND хх.столбец1(+)=х1.столбец1 ;
Каждый из подзапросов работает моментально(максимум 2 сек). Очень медленно начинает работать(несколько минут), когда в запросе участвует такое условие. Можно его как-нибудь изменить, чтоб все работало нормально?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.08.2015, 08:58
Ответы с готовыми решениями:

Urllib работает очень медленно (> 4 секунд на запрос)
urlib выполняет запросы ооооочень медленно (4-5 секунд), такое ощущение что он открывает IE,...

Интернет работает очень медленно на одном ПК, на другом работает быстрее.
Такая проблема, интернет очень плохо работает,скорость совсем маленькая (14м) подключаю другой комп...

Очень медленно работает 1С 8.3?
С чем может быть связана медленная работа 1С? Есть терминальный сервер Windows Server 2003...

Очень медленно работает ПК
День добрый. Помогите решить проблему. Имеется компьютер с Win 7 64. Машинка жестко тормозит....

11
11 / 11 / 7
Регистрация: 23.07.2015
Сообщений: 62
20.08.2015, 09:33 2
лучше приведи запрос в оригинале, без "подзапрос" и "столбец"
0
3 / 3 / 1
Регистрация: 22.10.2014
Сообщений: 106
20.08.2015, 09:47  [ТС] 3
Тут в запросе куча самописных функций, которые только запутают. Надо вроде вот это (+)= джойнами заменить может быстрее будет.
0
11 / 11 / 7
Регистрация: 23.07.2015
Сообщений: 62
20.08.2015, 09:57 4
Цитата Сообщение от osetr Посмотреть сообщение
джойнами заменить может быстрее будет
ничего быстрее не будет, (+) оракловая интерпретация join'а
при желании можно заменить для читабельности

Добавлено через 1 минуту
Oracle 11 SQL
1
2
3
4
5
6
SELECT  x2.столбец1, x2.столбец2, xx.столбец1, x.столбец1, x.столбец2, x1.столбец1
  FROM
 (подзапрос4) x2
 left join  (подзапрос3) x1 ON х1.столбец1=х2.столбец1
 left join (подзапрос1) x ON x.столбец1=х1.столбец1
 left join (подзапрос2) xx ON хх.столбец1=х1.столбец1
1
8 / 8 / 5
Регистрация: 20.10.2013
Сообщений: 49
20.08.2015, 10:00 5
Надо комментить отдельные части запроса для локализации лагов. А потом индексы повесить, например, куда надо. Буквально вчера запрос длинной в 6 минут так сократил до секунд 3х.
0
11 / 11 / 7
Регистрация: 23.07.2015
Сообщений: 62
20.08.2015, 10:08 6
еще можно посмотреть план запроса и проверить запрос профайлером, он покажет что именно больше всего тормозит запрос
0
3 / 3 / 1
Регистрация: 22.10.2014
Сообщений: 106
20.08.2015, 12:04  [ТС] 7
Комментить пробовал. Лаги появляется когда в запросе участвуют соединения подзапросов. На подзапрос индекс можно как-нибудь установить? или он только для таблиц предназначен? Вот сам запрос, если интересно.
SQL
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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
SELECT DISTINCT X2.k_lpu k_lpu, X2.lpu  lpu , 
nvl2(xx.kolvo,xx.kolvo,'') dy_null, decode(x.dy, NULL, 0,x.dy) dy,
nvl2(X.kolvo,X.kolvo,'') kolvo, decode(x1.kolv,NULL,0,x1.kolv)  kolv
FROM 
(SELECT   b2.lnk_id_obj k_lpu, b2.v_prm_obj lpu,
COUNT (DISTINCT a.id_obj) kolvo, gasedit.upp.getprmobj (a.id_obj, 1578393) dy
    FROM gasedit.up_obj a,
         gasedit.up_prm_obj b1,
         gasedit.up_prm_obj b2,
         gasedit.up_prm_obj b3
   WHERE a.id_type_obj = 1825664 
     AND b1.id_obj = a.id_obj
     AND b1.id_prm_type_obj = 1825667
     AND b1.lnk_id_obj = b2.id_obj 
     AND b2.id_prm_type_obj = 1493940 
AND  gasedit.upp.getprmobj (a.id_obj, 1578393) IS NOT NULL
     AND gasedit.upp.getclassid(gasedit.upp.getprmobjid(b1.lnk_id_obj,1837923))  NOT IN (1609245, 990007689977) 
     AND b2.lnk_id_obj = b3.id_obj
     AND b3.id_prm_type_obj = 1052082
AND b3.lnk_id_obj = 1052015    /*$k_dp$*/
  AND gasedit.upp.getprmobj(a.id_obj,990006547372) IS NULL
/*$if($tip$,' and gasedit.upp.getprmobjid(a.id_obj,1578392)='$tip$)
$if($nazn$,' and gasedit.upp.getprmobjid(a.id_obj,1865920)='$nazn$)
$if($izg$,' and gasedit.upp.getprmobjid(a.id_obj,1578397)='$izg$)*/
GROUP BY  b2.lnk_id_obj, b2.v_prm_obj, gasedit.upp.getprmobj (a.id_obj, 1578393)) x,
(SELECT   b2.lnk_id_obj k_lpu, b2.v_prm_obj lpu,
COUNT (DISTINCT a.id_obj) kolvo, decode(gasedit.upp.getprmobj (a.id_obj, 1578393),NULL,0,
gasedit.upp.getprmobj (a.id_obj, 1578393)) dy
    FROM gasedit.up_obj a,
         gasedit.up_prm_obj b1,
         gasedit.up_prm_obj b2,
         gasedit.up_prm_obj b3
   WHERE a.id_type_obj = 1825664 
     AND b1.id_obj = a.id_obj
     AND b1.id_prm_type_obj = 1825667
     AND b1.lnk_id_obj = b2.id_obj
     AND b2.id_prm_type_obj = 1493940 AND  gasedit.upp.getprmobj (a.id_obj, 1578393) IS  NULL
     AND gasedit.upp.getclassid(gasedit.upp.getprmobjid(b1.lnk_id_obj,1837923))  NOT IN (1609245, 990007689977) 
     AND b2.lnk_id_obj = b3.id_obj
     AND b3.id_prm_type_obj = 1052082
  AND gasedit.upp.getprmobj(a.id_obj,990006547372) IS NULL
AND b3.lnk_id_obj = 1052015    /*$k_dp$*/
/*$if($tip$,' and gasedit.upp.getprmobjid(a.id_obj,1578392)='$tip$)
$if($nazn$,' and gasedit.upp.getprmobjid(a.id_obj,1865920)='$nazn$)
$if($izg$,' and gasedit.upp.getprmobjid(a.id_obj,1578397)='$izg$)*/
GROUP BY  b2.lnk_id_obj, b2.v_prm_obj, gasedit.upp.getprmobj (a.id_obj, 1578393)) xx,
(SELECT b.lnk_id_obj k_lpu, b.v_prm_obj lpu,
COUNT (DISTINCT a.id_obj) kolv
 FROM gasedit.up_obj a,
 gasedit.up_prm_obj b,
 gasedit.up_prm_obj c
 WHERE id_type_obj = 1493939 
 AND a.id_obj=b.id_obj
 AND b.id_prm_type_obj = 1493940
AND gasedit.upp.getclassid(gasedit.upp.getprmobjid(a.id_obj,1837923))  NOT IN (1609245, 990007689977) 
 AND b.lnk_id_obj=C.ID_OBJ
 AND c.id_prm_type_obj=1052082 AND c.lnk_id_obj = 1052015  /*$k_dp$*/
 GROUP BY b.lnk_id_obj, b.v_prm_obj) x1, 
(SELECT DISTINCT c.lnk_id_obj k_lpu , c.v_prm_obj lpu
 FROM gasedit.up_obj a,
 gasedit.up_prm_obj b,
 gasedit.up_prm_obj c,
 gasedit.up_prm_obj d
 WHERE a. id_type_obj = 1166068
 AND a.id_obj=b.id_obj
 AND b.id_prm_type_obj = 1609259 
AND gasedit.upp.getprmobjid(b.lnk_id_obj,1597918)   NOT IN (1609245, 990007689977) 
AND b.lnk_id_obj=c.id_obj
 AND c.id_prm_type_obj = 1597920
AND c.lnk_id_obj=d.id_obj
 AND d.id_prm_type_obj = 1052082
AND d.lnk_id_obj = 1052015    /*$k_dp$*/
) x2
 WHERE X.k_lpu(+)=X1.k_lpu AND  X1.k_lpu(+)=X2.k_lpu AND
XX.k_lpu(+)=X1.k_lpu
0
8 / 8 / 5
Регистрация: 20.10.2013
Сообщений: 49
20.08.2015, 13:16 8
На подзапросы нельзя. Вешать их надо на те поля таблиц, которые участвуют в подзапросах. Главное не переборщить.
0
105 / 49 / 26
Регистрация: 01.09.2014
Сообщений: 140
20.08.2015, 13:21 9
Во всех подзапросах участвуют одни и те же таблици, практически с одними и теми же условиями. Может имеет смысл переписать запрос в один?
Как вариант просмотри план выполнения и используй хинты (user hints). Но лучше всетаки переписать запрос, т.к. все сводится к одним и тем же таблицам/функция.
0
0 / 0 / 0
Регистрация: 21.08.2015
Сообщений: 3
21.08.2015, 18:10 10
план запроса посмотрите

а так-то да, какая-то дичь
0
105 / 49 / 26
Регистрация: 01.09.2014
Сообщений: 140
22.08.2015, 12:56 11
У тебя не просто обьеденение 4 запросов, у тебя дистинкт стоит для всего селекта, вот он (я так думаю) и дает тебе наибольшую задержку. Если у тебя есть дублирующие строки, то исключи их в подзапросах.
P.S. А лучше и вовсе весь запрос переписать, т.к. одни и теже таблици участвуют в каждом подзапросе.
0
22 / 20 / 3
Регистрация: 21.05.2013
Сообщений: 408
26.08.2015, 08:39 12
В общем читал я читал ваш запрос и знаете, что у меня предложение могли бы вы рассказать людям чего вы хотите получить какой результат какое задание у вас ТЗ? Так как по запросу не совсем понятно почему написано именно так. Расскажите и может быть народ вам совсем другой запрос напишет, таблицы которые участвуют, что в них, структуры, что в результате надо получить.
А то честно говоря вы тут свою фантазию показываете мне лично трудно понять почему были использованы такие операторы, а не другие и у вас много что повторяется наверняка это можно объединить что уменьшит запрос.
Надо так сказать в глубь вопроса заглянуть.
0
26.08.2015, 08:39
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.08.2015, 08:39
Помогаю со студенческими работами здесь

Почему PDO выполняет простой запрос очень медленно?
$id=$params; $sql="SELECT Brend,Model, size, number,price, summa FROM view_purchase_order WHERE...

Очень медленно выполняется запрос SQL на ТСД Windows CE 6.0
Добрый день ! начал писать некоторые программы для терминала сбора данных Моторола. сделал на...

Очень медленно работает ноутбук
В последнее время ноутбук стал работать очень медленно, возможно нужно провести глубокую проверку...

комп очень медленно работает
комп вначале просто долго загружался, но потом нормально работал, потом стал виснуть постоянно и...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru