Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Запросик: вытащить записи с максимальным значением в поле / 16 сообщений из 16, страница 1 из 1
31.03.2003, 10:19
    #32129884
Eugg1e
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запросик: вытащить записи с максимальным значением в поле
Виноват, что отнимаю у вашего гения время, но ответьте, пожалуйста, один раз - мне этого хватит, запомню надолго ;-)

Вопрос в следующем:

существует таблица вида:
артикул - время изменения - статус
артикул - время изменения - статус
...
артикул - время изменения - статус

Мне нужно вытаскивать все поля записи с максимальным временем изменения с минимальным временем ожидания и нагрузкой на сервер. Единственное, до чего додумался (не бейте сильно) - работает ужасно долго (оно и понятно):

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
select *
from таблица
where
(артикул, время изменения) in

(
select артикул, max(время изменения) from таблица group by артикул
)


Спасибо заранее за ваши советы и объяснения! Решпект!
...
Рейтинг: 0 / 0
31.03.2003, 10:26
    #32129889
softy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запросик: вытащить записи с максимальным значением в поле
А план не можешь опубликовать?
...
Рейтинг: 0 / 0
31.03.2003, 10:29
    #32129891
softy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запросик: вытащить записи с максимальным значением в поле
А если так попробовать:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
select 
  a.*
 from 
  таблица a,
  (select 
      артикул, 
      max(время изменения) 
    from 
      таблица 
    group by 
      артикул) b
where
 a.артикул = b.артикул and 
 a.время изменения = b.время изменения 
...
Рейтинг: 0 / 0
31.03.2003, 10:56
    #32129930
Eugg1e
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запросик: вытащить записи с максимальным значением в поле
Неа, не катит... В среднем тянется на полчаса и тот и другой запрос. Удивительно. Но ведь выборка артикул, max(время изменения) выполняется мгновенно. Неужели нет способа выбрать все поля?

План по вашему запросу:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
select statement
    merge join
        sort join
            view
                sort (group by)
                    index (full scan) of 'tableindex_pk'
        sort (join)
            table access (full) of 'table'




План моего запроса:
Код: plaintext
1.
2.
3.
4.
5.
6.
select statement
    nested loops
        view of 'sys.vw_nso_1'
            sort (group by)
                index (full scan) of 'tableindex_pk'
        table access (by rowid) of 'table'
            index (range scan) of 'tableindex_pk'
...
Рейтинг: 0 / 0
31.03.2003, 11:04
    #32129941
va_kochnev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запросик: вытащить записи с максимальным значением в поле
А индекс (артикул, время выполнения) есть ?
Индекс 'tableindex_pk' что из себя представляет ?
...
Рейтинг: 0 / 0
31.03.2003, 11:12
    #32129949
Eugg1e
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запросик: вытащить записи с максимальным значением в поле
'tableindex_pk' содержит первые три поля: артикул, время изменения, статус.
Отдельно по 'артикулу-времени изменения' индекса нет.
...
Рейтинг: 0 / 0
31.03.2003, 11:30
    #32129968
softy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запросик: вытащить записи с максимальным значением в поле
Странно, что в плане моего запроса нет NESTED LOOPS, что логично для соединения таблиц. А у тебя наоборот есть
...
Рейтинг: 0 / 0
31.03.2003, 12:25
    #32130035
Eugg1e
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запросик: вытащить записи с максимальным значением в поле
Странно. То ли я чего-то не так написал, то ли Oracle решил поменять план, но факт, при вторичном исполнении моего запроса Oracle выдал такой план:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
select statement
    merge join
         sort (join)
             view of 'sys_vw_nso_1'
                 sort (group by)
                     index (full scan) of 'tableindex_pk'
         sort (join)
             table access (full) of 'table'


Тем не менее, вопрос остаётся открытым:
Как с минимальным временем ожидания выбрать все записи из таблицы, каждая из которых будет иметь максимальное значение по определенному полю (например, дата) среди прочих?
...
Рейтинг: 0 / 0
31.03.2003, 12:26
    #32130037
Fedorchenko Aleksey
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запросик: вытащить записи с максимальным значением в поле
Я тут тоже попробовал малость...
Вот таблица:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
create table art_test
(
article varchar2( 10 ),
modtime date,
status  varchar2( 10 )
);
create index idx_art_test_article on art_test(article);
create index idx_art_test_modtime on art_test(modtime);


Вот мой вариант запроса:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
select * 
from art_test 
where 
  article in (
    select article 
    from art_test 
    where 
      modtime = (select max(modtime) from art_test));


А вот его план на моем 9.2.0.1.0:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
SELECT STATEMENT
 TABLE ACCESS BY INDEX ROWID ART_TEST
  NESTED LOOPS
   VIEW  VW_NSO_1
    SORT UNIQUE
     TABLE ACCESS BY INDEX ROWID ART_TEST
      INDEX RANGE SCAN IDX_ART_TEST_MODTIME
       SORT AGGREGATE
        INDEX FULL SCAN (MIN/MAX) IDX_ART_TEST_MODTIME
   INDEX RANGE SCAN IDX_ART_TEST_ARTICLE


С виду все монстровидно, но на практике должно работать быстрее предложенных выше двух запросов, т.к. нет ни полного сканирования таблицы (softbuilder@inbox.ru), ни полного сканирования индекса (Eugg1e и softbuilder@inbox.ru) - используются куда более быстрые операции.
...
Рейтинг: 0 / 0
31.03.2003, 12:30
    #32130041
Fedorchenko Aleksey
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запросик: вытащить записи с максимальным значением в поле
Пока думал и писал появилось несколько других ответов :)
Может стоит перестроить индексы? Тогда и запрос будет шустрее работать.
...
Рейтинг: 0 / 0
31.03.2003, 12:45
    #32130058
Eugg1e
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запросик: вытащить записи с максимальным значением в поле
Записей с одинаковым артикулом может быть несколько. Ваш запрос выберет их все, по-моему; т.е. будет выбрана вся таблица. Нет?
...
Рейтинг: 0 / 0
31.03.2003, 13:11
    #32130079
Fedorchenko Aleksey
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запросик: вытащить записи с максимальным значением в поле
Да, именно!

Тогда встречный вопрос: а что собственно требуется на выходе?

Вариант 1.
Результирующая выборка:
артикул1 - время изменения - статус
артикул2 - время изменения - статус
...
артикул3 - время изменения - статус
Условие выбора: все строки, в которых содержится максимальное время изменения, сгруппированные по артикулу.

Вариант 2.
Результирующая выборка:
артикул - время изменения - статус
артикул - время изменения - статус
...
артикул - время изменения - статус
Условие выбора: все строки, в которых содержится артикул, имеющий максимальное время изменения.

Вариант 3.
Результирующая выборка:
артикул - время изменения - статус
Условие выбора: строка, в которой содержится артикул, имеющий максимальное время изменения.

Я понял, что требуется второй вариант. Похоже, что это не так. А как?
...
Рейтинг: 0 / 0
31.03.2003, 13:16
    #32130082
Eugg1e
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запросик: вытащить записи с максимальным значением в поле
артикул - время изменения - статус ,

где артикул будет уникальным, а время изменения максимальным, то есть последним.
...
Рейтинг: 0 / 0
31.03.2003, 13:18
    #32130085
Eugg1e
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запросик: вытащить записи с максимальным значением в поле
Прошу прощения, уточню:

артикул1 - время изменения - статус
артикул2 - время изменения - статус
артикул3 - время изменения - статус
...
Рейтинг: 0 / 0
31.03.2003, 14:05
    #32130148
Chira
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запросик: вытащить записи с максимальным значением в поле
Код: plaintext
1.
2.
SELECT tb.*,MAX(tb.change_time) over(PARTITION BY tb.articul)
FROM table tb
...
Рейтинг: 0 / 0
31.03.2003, 15:35
    #32130258
Eugg1e
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запросик: вытащить записи с максимальным значением в поле
Результат не удовлетворяет указанным требованиям. Выводятся все артикула, когда надо уникальные с последней датой модификации.

Мимоходом: а нельзя уточнить каким образом работает over(partition by table)? Что это даёт?
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Запросик: вытащить записи с максимальным значением в поле / 16 сообщений из 16, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]