Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 ежесекундный селект  [new]
Ora1999
Guest
Привет есть селект который выполняется каждую секунду, этот не хороший селект интенсивно потребляет ресурсы.. Мне почему то кажется что есть какой ты выход но я никак не дотукаю, может есть у вас мысли?
SELECT MAX(changed_date) FROM 
( SELECT MAX(created_date) changed_date FROM tt        WHERE source_id=:1  UNION ALL
   SELECT MAX(created_date) changed_date FROM tp       WHERE source_id=:2  UNION ALL
   SELECT MAX(created_date) changed_date FROM st         WHERE source_id=:3  UNION ALL
   SELECT MAX(updated_date) changed_date FROM tt        WHERE source_id=:4  UNION ALL
   SELECT MAX(updated_date) changed_date FROM tp      WHERE source_id=:5  UNION ALL
   SELECT MAX(updated_date) changed_date FROM st        WHERE source_id=:6 )
20 май 08, 12:53    [5688078]     Ответить | Цитировать Сообщить модератору
 Re: ежесекундный селект  [new]
KoTTT
Member

Откуда: Екб
Сообщений: 1511
select
	max(changed_date)
from 
	changed_date
where
	source_id in (:1, :2, :3, :4, :5, :6)

А лучше будет или хуже - зависит от размера таблички и наличия/отсутствия типа и вида индекса по source_id :-)
20 май 08, 12:57    [5688118]     Ответить | Цитировать Сообщить модератору
 Re: ежесекундный селект  [new]
Madness
Member

Откуда: Москва
Сообщений: 648
KoTTT
...

По-моему Вы недопоняли насчет имени таблицы :)
20 май 08, 12:59    [5688131]     Ответить | Цитировать Сообщить модератору
 Re: ежесекундный селект  [new]
KoTTT
Member

Откуда: Екб
Сообщений: 1511
Вах :)
И точно. Бегу куда-то...
20 май 08, 12:59    [5688137]     Ответить | Цитировать Сообщить модератору
 Re: ежесекундный селект  [new]
Охрименко
Member

Откуда: Украина, Киев
Сообщений: 1440
KoTTT
select
	max(changed_date)
from 
	changed_date
where
	source_id in (:1, :2, :3, :4, :5, :6)

А лучше будет или хуже - зависит от размера таблички и наличия/отсутствия типа и вида индекса по source_id :-)



не,так не правильно, автору нужно обьединить максимумы change_date для каждой переменной, а у вас все значения объединяются
20 май 08, 13:00    [5688145]     Ответить | Цитировать Сообщить модератору
 Re: ежесекундный селект  [new]
Охрименко
Member

Откуда: Украина, Киев
Сообщений: 1440
ну и таблицы разные :)
20 май 08, 13:01    [5688149]     Ответить | Цитировать Сообщить модератору
 Re: ежесекундный селект  [new]
KoTTT
Member

Откуда: Екб
Сообщений: 1511
Да ваще прогнал :-)
Больше не буду!
20 май 08, 13:02    [5688159]     Ответить | Цитировать Сообщить модератору
 Re: ежесекундный селект  [new]
miksoft
Member

Откуда:
Сообщений: 38545
я бы предложил по каждой из таблиц сделать индексы (source_id, created_date) и (source_id,updated_date)
20 май 08, 13:06    [5688196]     Ответить | Цитировать Сообщить модератору
 Re: ежесекундный селект  [new]
Двоюшник
Member

Откуда: Киев
Сообщений: 1135
Bind variable :1 и :4 случаем не одинаковые?
---
Ну ты заходи ежели чё...
20 май 08, 13:15    [5688274]     Ответить | Цитировать Сообщить модератору
 Re: ежесекундный селект  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 54383
возможно, где-то в идеологии системы не всё хорошо
20 май 08, 13:15    [5688279]     Ответить | Цитировать Сообщить модератору
 Re: ежесекундный селект  [new]
SimonInBlues
Member

Откуда: Балаково
Сообщений: 264
Ora1999
Привет есть селект который выполняется каждую секунду, этот не хороший селект интенсивно потребляет ресурсы.. Мне почему то кажется что есть какой ты выход но я никак не дотукаю, может есть у вас мысли?
SELECT MAX(changed_date) FROM 
( SELECT MAX(created_date) changed_date FROM tt        WHERE source_id=:1  UNION ALL
   SELECT MAX(created_date) changed_date FROM tp       WHERE source_id=:2  UNION ALL
   SELECT MAX(created_date) changed_date FROM st         WHERE source_id=:3  UNION ALL
   SELECT MAX(updated_date) changed_date FROM tt        WHERE source_id=:4  UNION ALL
   SELECT MAX(updated_date) changed_date FROM tp      WHERE source_id=:5  UNION ALL
   SELECT MAX(updated_date) changed_date FROM st        WHERE source_id=:6 )

проверь. есть ли индексы по source_id. А вообще так интересно, зачем ежесекундно выполняется этот селект, сбор какой-то статистики?
20 май 08, 13:19    [5688308]     Ответить | Цитировать Сообщить модератору
 Re: ежесекундный селект  [new]
RA\/EN
Member

Откуда:
Сообщений: 3659
Есть подозрение, что :1=:4, :2=:5, :3=:6.
Проведем тест при всех переменных, равных одному значению (NULL-ы в качестве переменных привязки и дат не рассматриваю - можно доработать).

WITH tt AS (
  SELECT /*+inline*/o.created created_date,
         o.last_ddl_time updated_date,
         o.object_id source_id  FROM user_objects o),
tp AS (SELECT /*+inline*/ * FROM tt),
st AS (SELECT /*+inline*/ * FROM tt)

SELECT MAX(changed_date) FROM 
( SELECT MAX(created_date) changed_date FROM tt WHERE source_id=:1 UNION ALL
  SELECT MAX(created_date) changed_date FROM tp WHERE source_id=:2 UNION ALL
  SELECT MAX(created_date) changed_date FROM st WHERE source_id=:3 UNION ALL
  SELECT MAX(updated_date) changed_date FROM tt WHERE source_id=:4 UNION ALL
  SELECT MAX(updated_date) changed_date FROM tp WHERE source_id=:5 UNION ALL
  SELECT MAX(updated_date) changed_date FROM st WHERE source_id=:6 )
18 Logical Reads

WITH tt AS (
  SELECT /*+inline*/o.created created_date,
         o.last_ddl_time updated_date,
         o.object_id source_id  FROM user_objects o),
tp AS (SELECT /*+inline*/ * FROM tt),
st AS (SELECT /*+inline*/ * FROM tt)

SELECT MAX(changed_date) FROM 
( SELECT greatest(MAX(created_date),MAX(updated_date)) changed_date FROM tt WHERE source_id=:1  UNION ALL
  SELECT greatest(MAX(created_date),MAX(updated_date)) changed_date FROM tp WHERE source_id=:2  UNION ALL
  SELECT greatest(MAX(created_date),MAX(updated_date)) changed_date FROM st WHERE source_id=:3  UNION ALL
  SELECT MAX(updated_date) changed_date FROM tt WHERE source_id=:4 AND :1<>:4 UNION ALL
  SELECT MAX(updated_date) changed_date FROM tp WHERE source_id=:5 AND :2<>:5  UNION ALL
  SELECT MAX(updated_date) changed_date FROM st WHERE source_id=:6 AND :3<>:6 )
9 Logical Reads

Вот так.
20 май 08, 13:27    [5688371]     Ответить | Цитировать Сообщить модератору
 Re: ежесекундный селект  [new]
Dihotom
Member

Откуда:
Сообщений: 453
Может, так быстрее будет?

SELECT MAX(changed_date) 
  FROM (SELECT MAX(CASE WHEN created_date > updated_date THEN created_date ELSE updated_date END) changed_date 
          FROM tt 
         WHERE source_id IN (:1, :4)  
        UNION ALL
        SELECT MAX(CASE WHEN created_date > updated_date THEN created_date ELSE updated_date END) changed_date 
          FROM tp 
         WHERE source_id IN (:2, :5)  
        UNION ALL
        SELECT MAX(CASE WHEN created_date > updated_date THEN created_date ELSE updated_date END) changed_date 
          FROM st 
         WHERE source_id IN (:3, :6))

Кстати, кто-нибудь в курсе, есть функция для определения максимального значения аргумента из переданных? Типа MAX(a, b) == a > b ? a : b.
20 май 08, 13:30    [5688402]     Ответить | Цитировать Сообщить модератору
 Re: ежесекундный селект  [new]
Dihotom
Member

Откуда:
Сообщений: 453
Блин, увидел пост RA\/EN и понял, что ошибся :(
И на счет MAX'а ответ получил :)
20 май 08, 13:31    [5688416]     Ответить | Цитировать Сообщить модератору
 Re: ежесекундный селект  [new]
stax..
Guest
Dihotom

Кстати, кто-нибудь в курсе, есть функция для определения максимального значения аргумента из переданных? Типа MAX(a, b) == a > b ? a : b.

greatest
.....
stax
20 май 08, 13:36    [5688454]     Ответить | Цитировать Сообщить модератору
 Re: ежесекундный селект  [new]
Dihotom
Member

Откуда:
Сообщений: 453
И все-таки... Так, по-моему, уже правильно:

SELECT MAX(changed_date) 
  FROM (SELECT MAX(DECODE(source_id, :1, created_date, :4, updated_date, NULL)) changed_date FROM tt WHERE source_id IN (:1, :4) UNION ALL
        SELECT MAX(DECODE(source_id, :2, created_date, :5, updated_date, NULL)) changed_date FROM tp WHERE source_id IN (:2, :5) UNION ALL
        SELECT MAX(DECODE(source_id, :3, created_date, :6, updated_date, NULL)) changed_date FROM st WHERE source_id IN (:3, :6))
20 май 08, 13:39    [5688480]     Ответить | Цитировать Сообщить модератору
 Re: ежесекундный селект  [new]
Ora1999
Guest
Извините ребята, я выходил на собрание, сейчас опять бегу...

Заранее спасибо за отзыв, обязательно посмотрю как освобожусь
Кстати первый ответ тоже мне сразу в голову пришел, когда увидел в чем засада, посмеялся вдоволь :)

Мне тоже кажется что система не доработана, хотя на не были потрачены угугугу баксы :)
20 май 08, 13:58    [5688626]     Ответить | Цитировать Сообщить модератору
 Re: ежесекундный селект  [new]
RA\/EN
Member

Откуда:
Сообщений: 3659
Dihotom
И все-таки... Так, по-моему, уже правильно:

SELECT MAX(changed_date) 
  FROM (SELECT MAX(DECODE(source_id, :1, created_date, :4, updated_date, NULL)) changed_date FROM tt WHERE source_id IN (:1, :4) UNION ALL
        SELECT MAX(DECODE(source_id, :2, created_date, :5, updated_date, NULL)) changed_date FROM tp WHERE source_id IN (:2, :5) UNION ALL
        SELECT MAX(DECODE(source_id, :3, created_date, :6, updated_date, NULL)) changed_date FROM st WHERE source_id IN (:3, :6))

Уже правильнее, но не до конца: при :1=:4 не будет учитываться updated_date. От использования GREATEST убежать не получится :)
20 май 08, 14:03    [5688663]     Ответить | Цитировать Сообщить модератору
 Re: ежесекундный селект  [new]
Dihotom
Member

Откуда:
Сообщений: 453
Да, точно :) Тогда внутри каждого MAX'а нужно вставить что-то типа
CASE WHEN :1 = :4 THEN GREATEST(created_date, updated_date) ELSE DECODE(...) END
20 май 08, 14:16    [5688766]     Ответить | Цитировать Сообщить модератору
 Re: ежесекундный селект  [new]
Йопто_id
Member [заблокирован]

Откуда:
Сообщений: 38
Ora1999
Привет есть селект который выполняется каждую секунду, этот не хороший селект интенсивно потребляет ресурсы.. Мне почему то кажется что есть какой ты выход но я никак не дотукаю, может есть у вас мысли?
SELECT MAX(changed_date) FROM 
( SELECT MAX(created_date) changed_date FROM tt        WHERE source_id=:1  UNION ALL
   SELECT MAX(created_date) changed_date FROM tp       WHERE source_id=:2  UNION ALL
   SELECT MAX(created_date) changed_date FROM st         WHERE source_id=:3  UNION ALL
   SELECT MAX(updated_date) changed_date FROM tt        WHERE source_id=:4  UNION ALL
   SELECT MAX(updated_date) changed_date FROM tp      WHERE source_id=:5  UNION ALL
   SELECT MAX(updated_date) changed_date FROM st        WHERE source_id=:6 )


А так не пойдет?
(Все что в условии where будет обработано за один проход вместо кучи селектов)
select max( max(created_date) over (partition by source_id ) )
from   changed_date 
where  source_id in(...:1,:2,...)
20 май 08, 15:24    [5689307]     Ответить | Цитировать Сообщить модератору
 Re: ежесекундный селект  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
andreymx
возможно, где-то в идеологии системы не всё хорошо

+1
если такая ботва и взаправду нужна 1 раз в секунду - думайте,
за её материализацию в базе
20 май 08, 15:30    [5689358]     Ответить | Цитировать Сообщить модератору
 Re: ежесекундный селект  [new]
Двоюшник
Member

Откуда: Киев
Сообщений: 1135
Йопто_id

Вы что зговорились с KoTTT или как?
20 май 08, 15:50    [5689537]     Ответить | Цитировать Сообщить модератору
 Re: ежесекундный селект  [new]
RA\/EN
Member

Откуда:
Сообщений: 3659
orawish
andreymx
возможно, где-то в идеологии системы не всё хорошо

+1
если такая ботва и взаправду нужна 1 раз в секунду - думайте,
за её материализацию в базе

Тут нужно не сходу "материализацию" рекомендовать исходя из частоты запроса, а учесть, что это значение может и запрашивается раз в секунду, но меняется за ту же секунду 10 раз
20 май 08, 16:07    [5689703]     Ответить | Цитировать Сообщить модератору
 Re: ежесекундный селект  [new]
nsome
Guest
miksoft
я бы предложил по каждой из таблиц сделать индексы (source_id, created_date) и (source_id,updated_date)


+1
Будет крайне шустро.
20 май 08, 23:36    [5691658]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить