Оракловые чудеса

User avatar
Uzito
Уже с Приветом
Posts: 8239
Joined: 06 Feb 2002 10:01
Location: NJ, USA

Оракловые чудеса

Post by Uzito »

Продакшен внезапно встал колом, пытаюсь понять что за чудеса. Есть репорт который высасывает данные из вьюшки средней сложности.

Это выполняется из SQL Dev за 10 секунд:

Code: Select all

SELECT *
  FROM v_report_abc
 WHERE condition1 = 'QQQQ' AND condition2 = 'ABC'
Это умирает и не возращает никакого результата даже после 3 часов:

Code: Select all

SELECT field1, field2, field3, field4, field5
  FROM v_report_abc
 WHERE condition1 = 'QQQQ' AND condition2 = 'ABC'
Это опять выполняется нормально:

Code: Select all

SELECT field1, field2, field3, field4, field5
  FROM (SELECT *
          FROM v_report_abc
         WHERE condition1 = 'QQQQ' AND condition2 = 'ABC')
Чо за ботва?
mskmel
Уже с Приветом
Posts: 946
Joined: 24 Sep 2013 05:58
Location: US\GA

Re: Оракловые чудеса

Post by mskmel »

"Доктор, у меня это..."
Описанная Вами ситуация вполне воспроизводима при определённых условиях. То что выполняется нормально - найдено, вот это и выполняйте.
zgur
Уже с Приветом
Posts: 329
Joined: 09 Sep 2002 17:42
Location: NH

Re: Оракловые чудеса

Post by zgur »

Планы запросов нужны чтоб понять точно. Когда в select выбираются только несколько полей oracle делает оптимизацию и, возможно, выбрасывает некоторые таблицы из joinа во view. Эта оптимизация, в вашем случае, приводит к худшим ресультатам
iDesperado
Уже с Приветом
Posts: 1349
Joined: 28 Nov 2008 17:50

Re: Оракловые чудеса

Post by iDesperado »

смотри планы запросов. просто разные планы
User avatar
Uzito
Уже с Приветом
Posts: 8239
Joined: 06 Feb 2002 10:01
Location: NJ, USA

Re: Оракловые чудеса

Post by Uzito »

iDesperado wrote: 15 Mar 2018 15:54 смотри планы запросов. просто разные планы
План первого и второго запроса совершено одинаковый. :pain1:
Easbayguy
Уже с Приветом
Posts: 10632
Joined: 17 Jul 2003 22:11

Re: Оракловые чудеса

Post by Easbayguy »

Попробуйте добавить hint /*+ OPT_PARAM('_optimizer_adaptive_plans', 'false') */ иногда Oracle на лету меняет plan.
Пх'нглуи мглв'нафх Ктулху Р'лайх угахнагл фхтагн
iDesperado
Уже с Приветом
Posts: 1349
Joined: 28 Nov 2008 17:50

Re: Оракловые чудеса

Post by iDesperado »

Uzito wrote: 15 Mar 2018 16:05
iDesperado wrote: 15 Mar 2018 15:54 смотри планы запросов. просто разные планы
План первого и второго запроса совершено одинаковый. :pain1:
не верю. делаю ставку что ты смотришь предполагаемый план, а не в процессе исполнения
поставь toad, посмотри план в session browser, там же long operations.
мухобой
Уже с Приветом
Posts: 1104
Joined: 11 Apr 2015 17:10

Re: Оракловые чудеса

Post by мухобой »

Скорее всего плохой план, либо менее вероятно запрос может залипнуть на парсинге. Есть и другие более экзотические причины.
User avatar
Uzito
Уже с Приветом
Posts: 8239
Joined: 06 Feb 2002 10:01
Location: NJ, USA

Re: Оракловые чудеса

Post by Uzito »

iDesperado wrote: 15 Mar 2018 19:09 не верю. делаю ставку что ты смотришь предполагаемый план, а не в процессе исполнения
поставь toad, посмотри план в session browser, там же long operations.
AUTOTRACE издох на попытке показать реальный план. Прибил его через два часа.
User avatar
Uzito
Уже с Приветом
Posts: 8239
Joined: 06 Feb 2002 10:01
Location: NJ, USA

Re: Оракловые чудеса

Post by Uzito »

Easbayguy wrote: 15 Mar 2018 16:49 Попробуйте добавить hint /*+ OPT_PARAM('_optimizer_adaptive_plans', 'false') */ иногда Oracle на лету меняет plan.
Это не помогло, зато помогло добавить ORDERED hint.
Припаяли этот хинт к сиквелю через SQL Patch.
iDesperado
Уже с Приветом
Posts: 1349
Joined: 28 Nov 2008 17:50

Re: Оракловые чудеса

Post by iDesperado »

Uzito wrote: 15 Mar 2018 19:42
iDesperado wrote: 15 Mar 2018 19:09 не верю. делаю ставку что ты смотришь предполагаемый план, а не в процессе исполнения
поставь toad, посмотри план в session browser, там же long operations.
AUTOTRACE издох на попытке показать реальный план. Прибил его через два часа.
set autotrace on из sqlplus ? он на сколько я помню после отработки запроса показывает. если есть доступ в вебную админку, там еще реальный план можно увидеть. еще вариант врубить трейс. перед тем как запустить глючный запрос
ALTER SESSION SET sql_trace = TRUE;
или более объемный вариант
ALTER SYSTEM SET EVENTS '10046 trace name context forever, level 8';

найти куда он задампил и трейс через tkprof отформатировать в человеческий вид. ALTER SESSION SET sql_trace = TRUE; мне кажется план показывал
StrangerR
Уже с Приветом
Posts: 38016
Joined: 14 Dec 2006 20:13
Location: USA

Re: Оракловые чудеса

Post by StrangerR »

Поставьте OEM (или даже db console) и походите по плану, вейтинг событиям, статистике, и быстро все найдете. А так как тут написано, только самые-самые ораклиные гуру могут разобраться.
User avatar
Mark
Уже с Приветом
Posts: 1982
Joined: 10 Oct 2000 09:01
Location: New England

Re: Оракловые чудеса

Post by Mark »

проше всего запустить STA в OEM (или TOAD) на этот запрос и посмотреть STA report. если написано поменять план или построить индекс - сделать и прогнать еще раз.
User avatar
Ion Tichy
Уже с Приветом
Posts: 13339
Joined: 07 Dec 2004 04:00
Location: Москва->CO

Re: Оракловые чудеса

Post by Ion Tichy »

Транзакции-изоляции?
Как же это вы без гравицаппы пепелац выкатываете из гаража? Это непорядок...
User avatar
ALV00
Уже с Приветом
Posts: 1494
Joined: 08 Mar 2002 10:01
Location: NJ

Re: Оракловые чудеса

Post by ALV00 »

Чтобы не плодить топики
Еще одна загадка от Ларри:
Почему из пустого множества получается такой результат?

Code: Select all

SQL> select c1, sum(c2)
  2  from (
  3     select 123 as c1, 10 as c2
  4     from dual
  5     where 1=2
  6  )
  7  /

        C1    SUM(C2)
---------- ----------
       123
User avatar
Uzito
Уже с Приветом
Posts: 8239
Joined: 06 Feb 2002 10:01
Location: NJ, USA

Re: Оракловые чудеса

Post by Uzito »

ALV00 wrote: 02 May 2019 17:45 Чтобы не плодить топики
Еще одна загадка от Ларри:
Почему из пустого множества получается такой результат?
Вы, гражданин, забыли написать GROUP BY C1 в конце.

Как написано, Ваш запрос аналогичен

Code: Select all

SELECT 123 AS c1, SUM (10) c2
  FROM DUAL
 WHERE 1 = 2
и результат вполне ожидаемый. С1 константа + аггрегат пустого множества (null).

Если добавить GROUP BY C1 но возращается 0 записей, как и хотелось Вам.
User avatar
liamkin
Уже с Приветом
Posts: 2603
Joined: 19 Jun 2003 20:22
Location: USA

Re: Оракловые чудеса

Post by liamkin »

там же в Оракле надо какую-то Оптимайзерную статистику пересчитывать регулярно - две простые но иногда долго выполняющиеся команды. Плюс включите затем AWR - он вам все скажет.
User avatar
KVA
Уже с Приветом
Posts: 5347
Joined: 03 Feb 1999 10:01
Location: NJ, USA

Re: Оракловые чудеса

Post by KVA »

А почему это вообще выполняется? Вроде как синтаксис неверен и вообще не должно выполнятся. MS SQL ругается например
----
Incorrect syntax near ')'.

А на что-то такое уже совсем конкретную ошибку дает.
----
Column 't.c1' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.

Code: Select all

select t.c1, sum(t.c2)
from (
    select 123 as c1, 10 as c2
    from Contacts
    where 1=2
) t
User avatar
Uzito
Уже с Приветом
Posts: 8239
Joined: 06 Feb 2002 10:01
Location: NJ, USA

Re: Оракловые чудеса

Post by Uzito »

KVA wrote: 02 May 2019 18:24 А почему это вообще выполняется? Вроде как синтаксис неверен и вообще не должно выполнятся. MS SQL ругается например
Почему неверен? Неужели Вас смущают запросы типа

Code: Select all

SELECT 'Дятлы' label, COUNT (1) cnt
  FROM birds
 WHERE family = 'Woodpecker'
UNION ALL
SELECT 'Вороны' label, COUNT (1) cnt
  FROM birds
 WHERE family = 'Crow'
Стандартное правило - аггрегационный запрос требует, чтобы все колонки по которым происходит группировака были в спике group by. В данном случае список группировки пустой, значит происходит аггрегация всех записей после наложения фильтра и к результату прилепляется константа. Запрос возвращает две записи (дятлы и вороны) + посчитаное количество отфильтрованых записей для каждого поздапроса.

Если взять реальную колонку из таблицы вместо константы "Дятлы", то получите сообщение об ошибке что отсутсвует GROUP BY по этой колонке.
Если добавить дятлов в group by, то в зависимости от наличия отфильтрованых записей получите либо количество, либо пустой ответ.
User avatar
KVA
Уже с Приветом
Posts: 5347
Joined: 03 Feb 1999 10:01
Location: NJ, USA

Re: Оракловые чудеса

Post by KVA »

MS SQL изначальный SQL очень даже смущает.

Я как бы не очень эксперт в базах и изначальный SQL выглядит для меня на уровне

x = a++ + ++a + a++;

Что-то там получится. Может даже правильно, но писать так не стоит.
User avatar
ALV00
Уже с Приветом
Posts: 1494
Joined: 08 Mar 2002 10:01
Location: NJ

Re: Оракловые чудеса

Post by ALV00 »

Да, пропущено group by. Это из реального баг кейса. База - теоретически - должна ругаться на такое выражение. db2 ругается, MS SQL - как говорят - тоже ругается. Оракл почему-то нет и выдает странный результат. У Ларри все не как у людей.
User avatar
KVA
Уже с Приветом
Posts: 5347
Joined: 03 Feb 1999 10:01
Location: NJ, USA

Re: Оракловые чудеса

Post by KVA »

Даже если Оракл позволяет пропустить group by странно что выдалась строка. Вот такой эквивалент в MS SQL server выдает пустой результат.

Code: Select all

select t.c1, sum(t.c2)
  from (
       select 123 as c1, 10 as c2
       from Contacts
      where 1=2
   ) t
   group by t.c1
User avatar
Uzito
Уже с Приветом
Posts: 8239
Joined: 06 Feb 2002 10:01
Location: NJ, USA

Re: Оракловые чудеса

Post by Uzito »

KVA wrote: 03 May 2019 16:37 Даже если Оракл позволяет пропустить group by странно что выдалась строка. Вот такой эквивалент в MS SQL server выдает пустой результат.
Этот код тоже выдает 0 rows в оракле. Разница в том, что group by есть или нет в конце.
User avatar
Мальчик-Одуванчик
Уже с Приветом
Posts: 15526
Joined: 27 Sep 2007 22:53

Re: Оракловые чудеса

Post by Мальчик-Одуванчик »

Lazy444 wrote: 06 May 2019 20:02 Еще ни разу не встретил погроммиста, который бы признал, что он чего то не знает. Все "Билли виноват". Или Линус ( который Торвальд). Или Ларри :D
Что странно - даже Страуструп признавал что он очень многого не знает из придуманного им языка С++.
deev_a_v
Уже с Приветом
Posts: 4667
Joined: 07 Apr 2018 15:16

Re: Оракловые чудеса

Post by deev_a_v »

Lazy444 wrote: 06 May 2019 20:02 Еще ни разу не встретил погроммиста, который бы признал, что он чего то не знает. Все "Билли виноват". Или Линус ( который Торвальд). Или Ларри :D
Ага. Сколько я видел начинающих, которые с ходу находили баги в MS SQL Server :D

Return to “Вопросы и новости IT”