Модераторы: skyboy

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Выбрать оптимальный вариант запроса, Oracle6 
:(
    Опции темы
Kbl4AH
Дата 25.3.2009, 15:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 741
Регистрация: 1.4.2008
Где: Вятка

Репутация: 1
Всего: 15



Здравствуйте.
Столкнулся с такой проблемой. Делаю относительно большой, но однотипный запрос. Придумал 2 варианта реализации: много запросов объединенных union или один запрос с использованием decode().
В оптимизации я практически 0. Какой вариант лучше использовать для быстродействия?
Привожу уменьшенные запросы (возвращают только 2 строки/столбца, а готовый запрос будет содержать около 25).
1) Выполняет просмотр X строк, истинное время порядка 470 (из sql+) или около 3 сек (из PL/SQL Developer) 
Код

select sum(decode(id_material, 'пп', decode(id_brig, 18, ves_nett, 28, ves_nett, 
38, ves_nett, 48, ves_nett))) id1,
sum(decode(id_material, 'бу', decode(id_brig, 18, ves_nett, 28, ves_nett, 
38, ves_nett, 48, ves_nett))) id2
from scrap_zavalka@otgruzka where 
trunc(data_treb, 'mm') = trunc(to_date('13.08.2008'), 'mm')

2) Выполняет просмотр X * (число подзапросов) строк, истинное время порядка 430 (из sql+) или около 0,5 сек (из PL/SQL Developer) 
Код

select 1 id, sum(ves_nett) from scrap_zavalka@otgruzka where 
trunc(data_treb, 'mm') = trunc(to_date('13.08.2008'), 'mm')
and id_brig in (18, 28, 38, 48) and id_material = 'пп'
union
select 2, sum(ves_nett) from scrap_zavalka@otgruzka where 
trunc(data_treb, 'mm') = trunc(to_date('13.08.2008'), 'mm')
and id_brig in (18, 28, 38, 48) and id_material = 'бу'

То есть второй вроде строк в разы больше лопатит, но выполняется быстрее... Так какой вариант оптимальнее???
ЗЫ. В итоге буду тянуть данные из базы в прогу на делфи через DOA, если это имеет какое-то значение...
PM MAIL ICQ   Вверх
Zloxa
Дата 25.3.2009, 15:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 53
Всего: 161



Цитата(Kbl4AH @  25.3.2009,  15:25 Найти цитируемый пост)
Так какой вариант оптимальнее?

При наличии индексов по id_brig или id_material, второй запрос может их использовать, в то время как первый - full scan однозначно.
Надо смотреть планы.

А критерии оптимальности - у всех разные. Например, для энергетиков оптимальнее будет тот запрос, для выполнения которого требуется больше электричества smile

зы зачем тебе union? union это всяко сортировка, которая тут лишняя, хоть и стоит мало. Используй union all, и возьми себе в бест практис не использовать union пока это дейтсвтельно не будет нужно smile)


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
Kbl4AH
Дата 25.3.2009, 16:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 741
Регистрация: 1.4.2008
Где: Вятка

Репутация: 1
Всего: 15



Цитата(Zloxa @  25.3.2009,  15:44 Найти цитируемый пост)
А критерии оптимальности - у всех разные. Например, для энергетиков оптимальнее будет тот запрос, для выполнения которого требуется больше электричества

 smile 
Цитата(Zloxa @  25.3.2009,  15:44 Найти цитируемый пост)
зы зачем тебе union? union это всяко сортировка, которая тут лишняя, хоть и стоит мало. Используй union all, и возьми себе в бест практис не использовать union пока это дейтсвтельно не будет нужно )

хз... как раз думал об этом сейчас... просто в моей древней книжке как-то это не описано...
я использую с all когда подзапросы могут одинаковые строки возвращать и мне нужно чтобы они все выбирались, а во всех остальных случаях я без all пишу smile 
по юнион подведем краткий итог: юзать с all кроме тех случаев, когда не нужны дублирующиеся строки, правильно я понял, Zloxa?
PM MAIL ICQ   Вверх
Zloxa
Дата 25.3.2009, 16:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 53
Всего: 161



Цитата(Kbl4AH @  25.3.2009,  16:14 Найти цитируемый пост)
по юнион подведем краткий итог

Достаточно просто помнить что union инициирует сортировку. Такую же, как при указании distinct. Ты же интуитивно не лепишь дистинкт где ни попадя ;)

А чо там с планами? не покажешь?
Причем план лучше смотреть на удаленном сервере, наверняка запрос туда транслируется полностью smile


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
Kbl4AH
Дата 25.3.2009, 16:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 741
Регистрация: 1.4.2008
Где: Вятка

Репутация: 1
Всего: 15



Цитата(Zloxa @  25.3.2009,  16:21 Найти цитируемый пост)
Причем план лучше смотреть на удаленном сервере, наверняка запрос туда транслируется полностью

Это как понять? Я со своего компа делаю запросы в базу которая на сервере находится...
PM MAIL ICQ   Вверх
Zloxa
Дата 25.3.2009, 16:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 53
Всего: 161



Зачем тогда указание дибилинка?
Цитата(Kbl4AH @  25.3.2009,  15:25 Найти цитируемый пост)
@otgruzka

Или в шестерке так принято?



--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
Kbl4AH
Дата 25.3.2009, 16:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 741
Регистрация: 1.4.2008
Где: Вятка

Репутация: 1
Всего: 15



Zloxa, кажись понял... с собакой это я под своим пользователем запрос пишу... а нужно план под пользователем, которому таблица принадлежит?
PM MAIL ICQ   Вверх
Zloxa
Дата 25.3.2009, 16:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 53
Всего: 161



Цитата(Kbl4AH @  25.3.2009,  16:37 Найти цитируемый пост)
с собакой это я под своим пользователем запрос пишу... 

прости, я не знаю особенностей шестерки, но начиная с восмерки указывается схема.таблица@база_данных.
Пользователь, является владельцем схемы.
Т.о. если ты формируешь запрос к таблице в той же базе, но для таблицы из схемы другого пользователя, ты пишешь user.table.
Когда ты указываешь собаку, это подразумевает, что ты собираешься получить данные от другой базы данных(от другого сервера), не о той, с которой ты соединен.

В принципе у каждой базы данных есть dblink на самою себя. 
Если дибилинк, который ты указываешь, есть дибилинк "на себя", то тогда можно смотреть план из твоей сессии smile


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
Kbl4AH
Дата 25.3.2009, 17:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 741
Регистрация: 1.4.2008
Где: Вятка

Репутация: 1
Всего: 15



Не, я в чужую базу запрос делаю...
Планы (законнектился в чужую базу):
Код

  1  select sum(decode(id_material, 'пп', decode(id_brig, 18, ves_nett, 28, ves_nett,
  2  38, ves_nett, 48, ves_nett))) id1,
  3  sum(decode(id_material, 'бу', decode(id_brig, 18, ves_nett, 28, ves_nett,
  4  38, ves_nett, 48, ves_nett))) id2
  5  from scrap_zavalka@otgruzka where
  6* trunc(data_treb, 'mm') = trunc(to_date('13.08.2008'), 'mm')
SQL> /

      ID1       ID2
--------- ---------
    628,3        62


План выполнения
----------------------------------------------------------
   0      SELECT STATEMENT Cost=184 Optimizer=CHOOSE
   1    0   SORT (AGGREGATE)
   2    1     FILTER
   3    2       REMOTE                                                 OTGRUZKA
                                                                       .WORLD



Статистика
----------------------------------------------------------
          0  recursive calls
          0  db block gets
          0  consistent gets
          0  physical reads
          0  redo size
          1  sorts (memory)
          0  sorts (disk)
          1  rows processed

Код

  1  select 1 id, sum(ves_nett) from scrap_zavalka where
  2  trunc(data_treb, 'mm') = trunc(to_date('13.08.2008'), 'mm')
  3  and id_brig in (18, 28, 38, 48) and id_material = 'пп'
  4  union all
  5  select 2, sum(ves_nett) from scrap_zavalka where
  6  trunc(data_treb, 'mm') = trunc(to_date('13.08.2008'), 'mm')
  7* and id_brig in (18, 28, 38, 48) and id_material = 'бу'
SQL> /

       ID SUM(VES_NETT)
--------- -------------
        1         628,3
        2            62


План выполнения
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=CHOOSE
   1    0   PROJECTION
   2    1     UNION-ALL
   3    2       SORT (AGGREGATE)
   4    3         TABLE ACCESS (FULL) OF 'SCRAP_ZAVALKA'
   5    2       SORT (AGGREGATE)
   6    5         TABLE ACCESS (FULL) OF 'SCRAP_ZAVALKA'


Статистика
----------------------------------------------------------
          0  recursive calls
          6  db block gets
       2420  consistent gets
          0  physical reads
          0  redo size
          1  sorts (memory)
          0  sorts (disk)
          2  rows processed

PM MAIL ICQ   Вверх
Zloxa
Дата 25.3.2009, 17:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 53
Всего: 161



в первом плане забыл собаку убрать.
smile
Обрати внимание, что по плану, он фетчит весь набор данных с удаленного сервера, а фильтр и  группировку выполняет на своей стороне.

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




--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
Kbl4AH
Дата 25.3.2009, 20:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 741
Регистрация: 1.4.2008
Где: Вятка

Репутация: 1
Всего: 15



Цитата(Zloxa @  25.3.2009,  17:08 Найти цитируемый пост)
в первом плане забыл собаку убрать.

 smile блин, что за день сегодня, совсем невнимателен :(
завтра отредактирую нормально, т.к. сейчас нет возможности...

Добавлено через 4 минуты и 6 секунд
Zloxa, а тот запрос, который в чужой базе (где таблица) оптимальнее работает, тот и из моей базы лучше отработает или может быть наоборот?
PM MAIL ICQ   Вверх
Zloxa
Дата 26.3.2009, 09:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 53
Всего: 161



Цитата(Kbl4AH @  25.3.2009,  20:36 Найти цитируемый пост)
или может быть наоборот

По всякому может быть.
План показал второй запрос что индексы не использует.
По какой причине он отрабатывает быстрее, мне, лично не ясно.
Как гепотеза. Первый запрос выполняет фильтрацию набора данных и аггрегацию на вызывающей стороне.  Второй запрос, возможно транслируется на удаленную сторону полностью(надо посмотреть план с вызывающего сревера), принимает уже готовый результат.


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
Kbl4AH
Дата 26.3.2009, 21:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 741
Регистрация: 1.4.2008
Где: Вятка

Репутация: 1
Всего: 15



Цитата(Zloxa @  26.3.2009,  09:44 Найти цитируемый пост)
По какой причине он отрабатывает быстрее, мне, лично не ясно.

Я уже сам со временем сомневаюсь... Время не показатель, т.к. сервак другими пользователями в разные моменты времени по разному загружен...
Состряпал планы запросов в своей и чужой базе, они в архиве...
Zloxa, посоветуй что-нидь - не знаю какой вариант выбрать, т.к оценке по времени не доверяю уже...


Это сообщение отредактировал(а) Kbl4AH - 26.3.2009, 21:18

Присоединённый файл ( Кол-во скачиваний: 4 )
Присоединённый файл  Querys.rar 1,03 Kb
PM MAIL ICQ   Вверх
Zloxa
Дата 27.3.2009, 10:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 53
Всего: 161



Цитата(Kbl4AH @  26.3.2009,  21:17 Найти цитируемый пост)
Присоединённый файл

C моей точки зрения, таки первый запрос будет наименее эффективен для энергетиков, а значит более подходит нам - программистам ;)

В обоих случаях фильтрация и аггрегация производится на вызывающей стороне, во втором случае, один и тот же набор данных сканируется и фетчится дважды. Если честно, я недоумеваю, по моему запрос веьсма прост, и оракля должен бы сообразить что тянуть одну запись по линку таки проще нежели 1210. Была бы то не шестерка, пожалуй предложил бы поиграться хинтом driving_site (select /*+driving_site(t)*/ ... from table@link t ...) но уееренности в том что это помогло бы даже на десятке у меня нет. Обычно этот хинт реально помогает, когда мы объединяем два набора данных, один с вызывающей стороны, другой с удаленной. Оракля, не имея статистики удаленного узла, может не угадать на какой стороне выполнять запрос(какой набор данных больше). ОДнако в случае с одним набором данных, весьма странно, что он выбирает вызывающую сторону а не удаленную.


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
Kbl4AH
Дата 27.3.2009, 10:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 741
Регистрация: 1.4.2008
Где: Вятка

Репутация: 1
Всего: 15



Цитата(Zloxa @  27.3.2009,  10:24 Найти цитируемый пост)
C моей точки зрения, таки первый запрос будет наименее эффективен для энергетиков, а значит более подходит нам - программистам ;)

Эммм, не понял... так какой запрос ты считаешь лучше: с юнион или с декоде?
с декоде?

Это сообщение отредактировал(а) Kbl4AH - 27.3.2009, 10:44
PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Составление SQL-запросов | Следующая тема »


 




[ Время генерации скрипта: 0.0594 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.