Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
 SQL  [new]
_vigo
Guest
Добрый день, помогите с решением проблемы. Есть select:
SELECT s.device_rec__id, s.doc__id, MAX (s.mess_time) last_time
FROM s
WHERE s.mess_time >= '28-Nov-06' AND s.doc__id IS NOT NULL
GROUP BY s.device_rec__id, s.doc__id
- отрабатывает за 1,8 секунды.

Если я в этом селекте дату указываю как данные поля другой таблицы, селект работает 89 сек.:

SELECT s.device_rec__id, s.doc__id, MAX (s.mess_time) last_time
FROM s, (SELECT a.date_from FROM a WHERE a.ID = 190165) d
WHERE s.mess_time >= d.date_from AND s.doc__id IS NOT NULL
GROUP BY s.device_rec__id, s.doc__id

Как можно оптимизировать запрос?
30 ноя 06, 13:24    [3472693]     Ответить | Цитировать Сообщить модератору
 Re: SQL  [new]
Бабичев Сергей
Member

Откуда:
Сообщений: 2498
Ты бы хоть планы запросов привел бы, что ли.
Кроме того, в таблице с датами у тебя сколько строк? Есть ли там индекс по ID.
30 ноя 06, 13:26    [3472716]     Ответить | Цитировать Сообщить модератору
 Re: SQL  [new]
Бабичев Сергей
Member

Откуда:
Сообщений: 2498
З.Ы.
НУ и извечный вопрос - где, чем и как мерил время?
30 ноя 06, 13:26    [3472719]     Ответить | Цитировать Сообщить модератору
 Re: SQL  [new]
Mikhon
Guest
А зачем ты это в подзапрос запихнул?


SELECT s.device_rec__id, s.doc__id, MAX (s.mess_time) last_time
FROM s, (SELECT a.date_from FROM a WHERE a.ID = 190165) d
WHERE s.mess_time >= d.date_from AND s.doc__id IS NOT NULL
GROUP BY s.device_rec__id, s.doc__id


Должно быть так ИМХО


SELECT s.device_rec__id, s.doc__id, MAX (s.mess_time) last_time
FROM s, a
WHERE s.mess_time >= a.date_from AND s.doc__id IS NOT NULL and a.id = 190165
GROUP BY s.device_rec__id, s.doc__id


А вообще смотри план выполнения запроса
30 ноя 06, 13:28    [3472742]     Ответить | Цитировать Сообщить модератору
 Re: SQL  [new]
_vigo
Guest
Да, индекс по ID есть, а записей около 5 тыс. (в таблице a).
30 ноя 06, 13:28    [3472747]     Ответить | Цитировать Сообщить модератору
 Re: SQL  [new]
_vigo
Guest
время мерил sql -navigator'ом
30 ноя 06, 13:29    [3472760]     Ответить | Цитировать Сообщить модератору
 Re: SQL  [new]
Бабичев Сергей
Member

Откуда:
Сообщений: 2498
А так на вскидку, могу предположить, что СВО раскрыл твое встроенное представление d, и выбрал "корявый" способ и порядок соединения таблиц и фильтрации данных...
30 ноя 06, 13:30    [3472769]     Ответить | Цитировать Сообщить модератору
 Re: SQL  [new]
Бабичев Сергей
Member

Откуда:
Сообщений: 2498
_vigo
время мерил sql -navigator'ом
Выкинь на помойку такой "замер" времени.
30 ноя 06, 13:31    [3472781]     Ответить | Цитировать Сообщить модератору
 Re: SQL  [new]
Бабичев Сергей
Member

Откуда:
Сообщений: 2498
Mikhon
А зачем ты это в подзапрос запихнул?


SELECT s.device_rec__id, s.doc__id, MAX (s.mess_time) last_time
FROM s, (SELECT a.date_from FROM a WHERE a.ID = 190165) d
WHERE s.mess_time >= d.date_from AND s.doc__id IS NOT NULL
GROUP BY s.device_rec__id, s.doc__id


Должно быть так ИМХО


SELECT s.device_rec__id, s.doc__id, MAX (s.mess_time) last_time
FROM s, a
WHERE s.mess_time >= a.date_from AND s.doc__id IS NOT NULL and a.id = 190165
GROUP BY s.device_rec__id, s.doc__id


А вообще смотри план выполнения запроса
Скорее всего СВО именно так запрос и преобразовал. Но это без плана не узнаешь...
30 ноя 06, 13:32    [3472787]     Ответить | Цитировать Сообщить модератору
 Re: SQL  [new]
alex-ls
Member

Откуда: Иркутская обл - Пенза - Москва
Сообщений: 6918
1. Называйте нормально тему топика, а то уже мозолит глаза "SQL"
2. Используйте тег SRC для оформления кода
3. Время не измеряют с помощью SQL Navigator. Откройте для себя SQL Plus
4. Если вопрос по оптимизации приводите планы, статистику по меньшей мере SET AUTOTRACE. Как вариант отчет tkprof.
30 ноя 06, 13:35    [3472812]     Ответить | Цитировать Сообщить модератору
 Re: SQL  [new]
_vigo
Guest
SQL Statement from editor:


SELECT s.device_rec__id, s.doc__id, MAX (s.mess_time) last_time
FROM status_message s /*, (SELECT l.date_from
FROM local_constants l
WHERE l.ID = 190165) d*/
WHERE s.mess_time >= '28-Nov-06' --d.date_from
AND s.doc__id IS NOT NULL
GROUP BY s.device_rec__id, s.doc__id

------------------------------------------------------------

Statement Id=100 Type=
Cost=1,95696055713317E-307 TimeStamp=30-11-06::14::33:06

(1) SELECT STATEMENT CHOOSE
Est. Rows: 2 Cost: 318
(4) SORT GROUP BY
Est. Rows: 2 Cost: 318
(3) TABLE ACCESS BY INDEX ROWID OWS.STATUS_MESSAGE [Analyzed]
(3) Blocks: 276 503 Est. Rows: 2 of 31 482 340 Cost: 316
Tablespace: OWACQ_D
(2) UNIQUE INDEX SKIP SCAN OWS.ST_MESS_STAT [Analyzed]
Est. Rows: 3 Cost: 3 158
30 ноя 06, 14:34    [3473353]     Ответить | Цитировать Сообщить модератору
 Re: SQL  [new]
_vigo
Guest
SQL Statement from editor:


SELECT s.device_rec__id, s.doc__id, MAX (s.mess_time) last_time
FROM status_message s, (SELECT l.date_from
FROM local_constants l
WHERE l.ID = 190165) d
WHERE s.mess_time >= d.date_from
AND s.doc__id IS NOT NULL
GROUP BY s.device_rec__id, s.doc__id

------------------------------------------------------------

Statement Id=100 Type=
Cost=1,95696055700086E-307 TimeStamp=30-11-06::14::34:48

(1) SELECT STATEMENT CHOOSE
Est. Rows: 973 410 Cost: 11 744
(6) SORT GROUP BY
Est. Rows: 973 410 Cost: 11 744
(5) NESTED LOOPS
Est. Rows: 973 410 Cost: 6 769
(3) TABLE ACCESS BY INDEX ROWID OWS.LOCAL_CONSTANTS [Analyzed]
(3) Blocks: 246 Est. Rows: 1 of 3 914 Cost: 1
Tablespace: OWMEDIUM_D
(2) UNIQUE INDEX UNIQUE SCAN OWS.PK_LOCAL_CONSTANTS [Analyzed]
Est. Rows: 1 Cost: 1
(4) TABLE ACCESS FULL OWS.STATUS_MESSAGE [Analyzed]
(4) Blocks: 276 503 Est. Rows: 973 410 of 31 482 340 Cost: 6 768
Tablespace: OWACQ_D
30 ноя 06, 14:35    [3473355]     Ответить | Цитировать Сообщить модератору
 Re: SQL  [new]
_vigo
Guest
up...
посоветуйте как-нибудь можно оптимизировать?
30 ноя 06, 15:26    [3473810]     Ответить | Цитировать Сообщить модератору
 Re: SQL  [new]
alex-ls
Member

Откуда: Иркутская обл - Пенза - Москва
Сообщений: 6918
_vigo
up...
посоветуйте как-нибудь можно оптимизировать?

используйте тег SRC!
30 ноя 06, 15:27    [3473816]     Ответить | Цитировать Сообщить модератору
 Re: SQL  [new]
Jannny
Member

Откуда: Спб
Сообщений: 6424
alex-ls
используйте тег SRC!
А про название темы - уже не надееетесь?
30 ноя 06, 15:29    [3473833]     Ответить | Цитировать Сообщить модератору
 Re: SQL  [new]
Jannny
Member

Откуда: Спб
Сообщений: 6424
Jannny
alex-ls
используйте тег SRC!
А про название темы - уже не надееетесь?
сорри, глюкануло
30 ноя 06, 15:30    [3473842]     Ответить | Цитировать Сообщить модератору
 Re: SQL  [new]
alex-ls
Member

Откуда: Иркутская обл - Пенза - Москва
Сообщений: 6918
Jannny
alex-ls
используйте тег SRC!
А про название темы - уже не надееетесь?

сейчас будем шантажировать автора хотя бы на тег SRC и использование SQL Plus для плана и статистики... Название темы насколько я знаю может только модератор изменить... :(
30 ноя 06, 15:30    [3473846]     Ответить | Цитировать Сообщить модератору
 Re: SQL  [new]
_vigo
Guest
       (1)  SELECT STATEMENT  CHOOSE 
     Est. Rows: 2  Cost: 6 771
       (5)  SORT GROUP BY 
     Est. Rows: 2  Cost: 6 771
           (4)  NESTED LOOPS 
                Est. Rows: 2  Cost: 6 769
               (2)  UNIQUE INDEX UNIQUE SCAN OWS.PK_LOCAL_CONSTANTS  [Analyzed] 
                    Est. Rows: 1  Cost: 1
               (3)  TABLE ACCESS FULL OWS.STATUS_MESSAGE  [Analyzed] 
               (3)   Blocks: 276 503 Est. Rows: 2 of 31 482 340  Cost: 6 768 
                    Tablespace: OWACQ_D
30 ноя 06, 15:38    [3473927]     Ответить | Цитировать Сообщить модератору
 Re: SQL  [new]
_vigo
Guest
если я правильно понял, в первом случае используется индекс ST_MESS_STAT, а во втором случае full scan
30 ноя 06, 15:42    [3473948]     Ответить | Цитировать Сообщить модератору
 Re: SQL  [new]
Jannny
Member

Откуда: Спб
Сообщений: 6424
_vigo
индекс ST_MESS_STAT
А это по какому полю индекс?
30 ноя 06, 15:46    [3474000]     Ответить | Цитировать Сообщить модератору
 Re: SQL  [new]
alex-ls
Member

Откуда: Иркутская обл - Пенза - Москва
Сообщений: 6918
_vigo
если я правильно понял, в первом случае используется индекс ST_MESS_STAT, а во втором случае full scan

мы не торопимся вообщем-то. Откройте SQL Plus получите в нем два плана и выложите их через тег SRC на форум в одном окне ответа.
30 ноя 06, 15:50    [3474035]     Ответить | Цитировать Сообщить модератору
 Re: SQL  [new]
_vigo
Guest
по полям: DEVICE_REC__ID, STATUS, ERROR_LEVEL, MESS_TIME, ID
30 ноя 06, 15:53    [3474063]     Ответить | Цитировать Сообщить модератору
 Re: SQL  [new]
jenyz
Member

Откуда:
Сообщений: 261
Бабичев Сергей

SELECT s.device_rec__id, s.doc__id, MAX (s.mess_time) last_time
FROM s, (SELECT a.date_from FROM a WHERE a.ID = 190165) d
WHERE s.mess_time >= d.date_from AND s.doc__id IS NOT NULL
GROUP BY s.device_rec__id, s.doc__id

Должно быть так ИМХО

SELECT s.device_rec__id, s.doc__id, MAX (s.mess_time) last_time
FROM s, a
WHERE s.mess_time >= a.date_from AND s.doc__id IS NOT NULL and a.id = 190165
GROUP BY s.device_rec__id, s.doc__id


если есть индекс для s.doc__id, то лучше заменить
s.doc__id IS NOT NULL ->  s.doc__id > 0
30 ноя 06, 15:55    [3474076]     Ответить | Цитировать Сообщить модератору
 Re: SQL  [new]
Jannny
Member

Откуда: Спб
Сообщений: 6424
alex-ls
мы не торопимся вообщем-то. Откройте SQL Plus получите в нем два плана и выложите их через тег SRC на форум в одном окне ответа.
Пардон, что вмешалась в процесс ;)

jenyz
Бабичев Сергей

SELECT s.device_rec__id, s.doc__id, MAX (s.mess_time) last_time
FROM s, (SELECT a.date_from FROM a WHERE a.ID = 190165) d
WHERE s.mess_time >= d.date_from AND s.doc__id IS NOT NULL
GROUP BY s.device_rec__id, s.doc__id

Должно быть так ИМХО

SELECT s.device_rec__id, s.doc__id, MAX (s.mess_time) last_time
FROM s, a
WHERE s.mess_time >= a.date_from AND s.doc__id IS NOT NULL and a.id = 190165
GROUP BY s.device_rec__id, s.doc__id
Вы поаккуратней цитируйте - авторские права и все такое ;)
30 ноя 06, 15:58    [3474109]     Ответить | Цитировать Сообщить модератору
 Re: SQL  [new]
alex-ls
Member

Откуда: Иркутская обл - Пенза - Москва
Сообщений: 6918
Jannny
alex-ls
мы не торопимся вообщем-то. Откройте SQL Plus получите в нем два плана и выложите их через тег SRC на форум в одном окне ответа.
Пардон, что вмешалась в процесс ;)

да лана, если Вам нравится глаза ломать и скроллингом туда-сюда ездить, чтобы помочь автору, то флаг Вам в руки. Я буду ждать пока автор соизволит выложит исходные данные в нормальном виде :)
30 ноя 06, 16:00    [3474126]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
Все форумы / Oracle Ответить