Тюнинг запроса.

WWWeb
Дата: 19.03.2011 13:37:29
Здравствуйте.
Мне требуется помощь с уменьшением времени выполнения запроса.
В Базе Данных имеется 2 таблицы - tracking и area;
tracking содержит GPS данные. (idresource (number), x (number), y(number), crdate (date) )
area содержит полигоны (areaname(varchar2), polygonpoints(spatial) )

Каждые 5 минут требуется выяснять в каком полигоне находится ресурс.
Для этого я выполняю следующий sql запрос:

SELECT T.IDRESOURCE, A.AREANAME
FROM TRACKING T, AREA A
WHERE SDO_RELATE(A.POLYGONPOINTS,
                                MDSYS.SDO_GEOMETRY(2001,NULL,
                                                                    MDSYS.SDO_POINT_TYPE(T.X,T.Y,NULL),
                                                                                                              NULL, NULL), 'mask=ANYINTERACT'
) = 'TRUE'
В среднем из tracking выбирается 1200 записей, а из AREA 60 полигонов стандартно.
После некоторого наблюдения я выяснил, что запрос использует только 1 cpu / 2 cores.
Время выполнения запроса ~3 минуты.
Как сделать чтобы запрос работал со всеми процессорами на сервере.

Заранее спасибо.
andreymx
Дата: 19.03.2011 15:11:13
а сколько всего строк в таблицах?
WWWeb
Дата: 19.03.2011 15:23:48
Tracking ~25 млн строк
Area 60 строк
WWWeb
Дата: 19.03.2011 15:27:09
В запросе ещё есть условие ограничиваешее кол-во выбранных строк из Tracking. Всреднем, как я выше писал, из трекинга выбирается 1200 записей.
Всего в tracking ~25 млн строк.
Area 60 строк
ArtPaul
Дата: 19.03.2011 16:48:42
Статистику по таблицам давно собирал?
Alexander Ryndin
Дата: 19.03.2011 19:25:25
WWWeb
Здравствуйте.
Мне требуется помощь с уменьшением времени выполнения запроса.
В Базе Данных имеется 2 таблицы - tracking и area;
tracking содержит GPS данные. (idresource (number), x (number), y(number), crdate (date) )
area содержит полигоны (areaname(varchar2), polygonpoints(spatial) )

Каждые 5 минут требуется выяснять в каком полигоне находится ресурс.
Для этого я выполняю следующий sql запрос:

SELECT T.IDRESOURCE, A.AREANAME
FROM TRACKING T, AREA A
WHERE SDO_RELATE(A.POLYGONPOINTS,
                                MDSYS.SDO_GEOMETRY(2001,NULL,
                                                                    MDSYS.SDO_POINT_TYPE(T.X,T.Y,NULL),
                                                                                                              NULL, NULL), 'mask=ANYINTERACT'
) = 'TRUE'
В среднем из tracking выбирается 1200 записей, а из AREA 60 полигонов стандартно.
После некоторого наблюдения я выяснил, что запрос использует только 1 cpu / 2 cores.
Время выполнения запроса ~3 минуты.
Как сделать чтобы запрос работал со всеми процессорами на сервере.

Заранее спасибо.

Есть 3 рекомендации
1) Глянуть в сторону SDO_JOIN - ну очень полезная вещь.
2) Стоит заглянуть вот сюда. Почитать про primary и secondary filter.
3) Сделайте
ALTER TABLE TRACKING PARALLEL 16; 
ALTER TABLE AREA PARALLEL 16;
Alexander Ryndin
Дата: 19.03.2011 19:26:39
Alexander Ryndin,

PARALLEL 16 - это временно. Потом лучше вернуть будет в PARALLEL DEFAULT и полагаться на оптимизатор.
WWWeb
Дата: 19.03.2011 20:00:10
ArtPaul
Статистику по таблицам давно собирал?

Собирается каждые 3 часа
WWWeb
Дата: 19.03.2011 20:03:34
Alexander Ryndin
Alexander Ryndin,

PARALLEL 16 - это временно. Потом лучше вернуть будет в PARALLEL DEFAULT и полагаться на оптимизатор.


Я пробовал PARALLEL(TRACKING, 32). Никакого эффекта, хотя я плохо разбираюсь в параллелизме.
Но как я понял из документации, то паралельно он производит чтение в буфер, а не выполняет функцию SDO_RELATE.
Поправьте меня если я не прав.
Alexander Ryndin
Дата: 19.03.2011 21:03:33
WWWeb
Alexander Ryndin
Alexander Ryndin,

PARALLEL 16 - это временно. Потом лучше вернуть будет в PARALLEL DEFAULT и полагаться на оптимизатор.


Я пробовал PARALLEL(TRACKING, 32). Никакого эффекта, хотя я плохо разбираюсь в параллелизме.
Но как я понял из документации, то паралельно он производит чтение в буфер, а не выполняет функцию SDO_RELATE.
Поправьте меня если я не прав.
план запроса покажите