Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Выборка данных без дубликатов из таблицы в 200000 записей / 25 сообщений из 47, страница 1 из 2
19.08.2003, 12:28
    #32240073
Nikita Krivtsov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка данных без дубликатов из таблицы в 200000 записей
Господа! Хелп!!

Третий день парюсь над SQL-запросом, ничего не получается, скорее всего туплю, и решение должно быть очевидным...

Задача:
выбрать из таблицы: ID товара (GOOD_ID) и его цену(PRICE_I), причем цена должна быть выбрана для самой последней дате изменения товара (EDIT_TIME).



В таблице 200000 записей! Т.е. сложные запросы с подзапросами вешают сервак намертво :)

Сама таблица: GOOD_ID, PRICE_I, EDIT_TIME, ....

Для примера данные:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
GOOD_ID     PRICE_I      EDIT_TIME
 4103          12 , 56          17 . 04 . 2001 
 4103          12 , 11          19 . 11 . 2003          <- нужно
 4103          9 , 78            22 . 05 . 2002 
 4103          9 , 32            13 . 09 . 2002 
 4104          2 , 26            26 . 02 . 2001 
 4104          2 , 11            26 . 03 . 2002 
 4104          3 , 51            26 . 08 . 2003     <- нужно


Вариант с процедурами не подходит, нужен именно SQL-запрос.

Подозреваю, что нужно юзать псевдонимы и RDB$DB_KEY???
...
Рейтинг: 0 / 0
19.08.2003, 12:47
    #32240124
Dnico
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка данных без дубликатов из таблицы в 200000 записей
А кто мешает выполнить
Код: plaintext
1.
SELECT * FROM PROCEDURE(...);
...
Рейтинг: 0 / 0
19.08.2003, 12:49
    #32240129
Johnmen
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка данных без дубликатов из таблицы в 200000 записей
SELECT T1.GOOD_ID, T1.PRICE_I FROM Table T1
WHERE T1.EDIT_TIME=
(SELECT MAX(T2.EDIT_TIME) FROM Table T2
WHERE T2.GOOD_ID=T1.GOOD_ID)
...
...
Рейтинг: 0 / 0
19.08.2003, 13:00
    #32240146
Moses
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка данных без дубликатов из таблицы в 200000 записей
А индекс на EDIT_TIME есть?
...
Рейтинг: 0 / 0
19.08.2003, 13:05
    #32240154
Dnico
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка данных без дубликатов из таблицы в 200000 записей
Ну так-то оно так, но сколько будет выполнять ся этот запрос?
Можно прикинуть 200000 * 200000 ? Или я ошибаюсь ?
...
Рейтинг: 0 / 0
19.08.2003, 13:11
    #32240168
Johnmen
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка данных без дубликатов из таблицы в 200000 записей
>Dnico

200000*200000 - это количество минут или секунд ?
:)
...
Рейтинг: 0 / 0
19.08.2003, 13:20
    #32240192
Moses
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка данных без дубликатов из таблицы в 200000 записей
>200000*200000 - это количество минут или секунд ?
Это видимо двести тысяч РАЗ по двести тыщ запросов.
Секунды зависят от железки;-)
И, осмелюсь предположить, _от индексов_.
...
Рейтинг: 0 / 0
19.08.2003, 13:21
    #32240194
Fighter
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка данных без дубликатов из таблицы в 200000 записей
> 200000*200000 - это количество минут или секунд ?
Количество проходов причём натурал!
...
Рейтинг: 0 / 0
19.08.2003, 13:23
    #32240198
Johnmen
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка данных без дубликатов из таблицы в 200000 записей
>Moses

Если запросов, то я вижу 1*200000
И, конечно, индексирование влияет... (на скорость)...
:)
...
Рейтинг: 0 / 0
19.08.2003, 13:32
    #32240222
Dnico
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка данных без дубликатов из таблицы в 200000 записей
Johnmen
А самому проверить ? Я вот ради интереса проверил ... у меня зашкалило за 24 мульена ... а зписей 17000.

Ну так как?
...
Рейтинг: 0 / 0
19.08.2003, 13:38
    #32240240
Johnmen
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка данных без дубликатов из таблицы в 200000 записей
>Dnico

Что проверить ?
Количество выполненных запросов ? Количество времени ? Другое ?
...
Рейтинг: 0 / 0
19.08.2003, 13:40
    #32240247
Dnico
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка данных без дубликатов из таблицы в 200000 записей
Johnmen

Кол-во запросов!
А время зависит от индексов. Это как раз самое простое - добавил индекс и гуляй себе ...
...
Рейтинг: 0 / 0
19.08.2003, 13:48
    #32240271
Johnmen
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка данных без дубликатов из таблицы в 200000 записей
>Dnico

Количество запросов = 1*200000.
А что такое у тебя "24 мульена " ? И где это видно ?
...
Рейтинг: 0 / 0
19.08.2003, 13:51
    #32240279
Nikita Krivtsov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка данных без дубликатов из таблицы в 200000 записей
Зделал, как посоветовал Johnmen:

SELECT T1.GOOD_ID, T1.PRICE_I FROM PRICES T1
WHERE T1.EDIT_TIME=
(SELECT MAX(T2.EDIT_TIME) FROM PRICES T2
WHERE T2.GOOD_ID=T1.GOOD_ID)

И пошёл курить:

------ Performance info ------
Prepare time = 0ms
Execute time = 6m 27s 953ms
Avg fetch time = 15 518,12 ms
Current memory = 11 717 858
Max memory = 12 439 626
Memory buffers = 2 048
Reads from disk to cache = 9 410
Writes from cache to disk = 6
Fetches from cache = 6 716 061

P.S. Индекса на EDIT_TIME нет.
...
Рейтинг: 0 / 0
19.08.2003, 13:52
    #32240283
Dnico
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка данных без дубликатов из таблицы в 200000 записей
Johnmen

Откуда взяться 1*200000 ?

Для каждой записи из T1 используется проход по всем записям в T2.

Умножаем ... получаем !!!
...
Рейтинг: 0 / 0
19.08.2003, 14:02
    #32240307
Johnmen
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка данных без дубликатов из таблицы в 200000 записей
>Nikita Krivtsov

Если идет борьба за производительность, то делай, как уже советовал Dnico, ХП. Тогда достаточно будет одного запроса с соотвествующим ORDER BY и прописанной логикой "отброса" ненужных записей в ХП.

>Dnico
>Откуда взяться 1*200000 ?

Основной запрос - 1, для каждой записи основного (200000)- вложенный запрос. Итого 1*200000 запросов.

>Для каждой записи из T1 используется проход по всем записям в T2.

Ну да, кто спорит ?

>Умножаем ... получаем !!!

Так что же получаем ? Чего и в каких единицах ?
...
Рейтинг: 0 / 0
19.08.2003, 14:08
    #32240318
Dnico
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка данных без дубликатов из таблицы в 200000 записей
Лучше всего всеже использовать процедуру:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
CREATE PROCEDURE  "proc"  
RETURNS (
    ID VARCHAR( 10 ),
    DT DATE,
    PRICE FLOAT)
AS
BEGIN
  FOR SELECT ID, MAX(DT) FROM TABLE GROUP BY ID INTO :ID, :DT DO BEGIN
    SELECT DISTINCT PRICE FROM TABLE WHERE ID = :ID AND DT = :DT INTO :PRICE;
    SUSPEND;
  END
END
...
Рейтинг: 0 / 0
19.08.2003, 14:08
    #32240319
Nikita Krivtsov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка данных без дубликатов из таблицы в 200000 записей
Вчера делал такой запрос:

Код: plaintext
1.
2.
3.
4.
5.
SELECT
a.GOOD_ID, a.price_i
FROM PRICES a
where exists (
SELECT GOOD_ID, max(EDIT_TIME)
FROM PRICES where pricelist_id= 2  and a.RDB$DB_KEY=prices.RDB$DB_KEY group by GOOD_ID


(where pricelist_id=2 ) -идентификатор прайс-листа, впринципе не столь важен для нашего запроса

Он не совсем правильный, но может быть от него отталкиваться???
По крайней мере выполнялся несколько секунд.


P.S. Да забыл указать, что после выборки из таблицы где 200000 записей, в результате должно получиться 10000 записей.

И еще такая проблема: изменять базу я не могу, т.е. не могу индексы добавить, не могу процедуры и т.д.
...
Рейтинг: 0 / 0
19.08.2003, 15:14
    #32240495
Johnmen
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка данных без дубликатов из таблицы в 200000 записей
>Dnico

Это те же 200000 запросов...

>Nikita Krivtsov

Максимально быстро, в один запрос (ХП) :

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
CREATE PROCEDURE MyProc 
RETURNS (I INTEGER, P NUMERIC( 15 ,  2 ), D TIMESTAMP)
AS
DECLARE VARIABLE ICURR INTEGER;
BEGIN
  ICURR= 0 ;
  FOR SELECT GOOD_ID, pr, dt FROM PRICES
      ORDER BY GOOD_ID, PRICE_I DESC INTO :I, :P, :D DO BEGIN
      IF (I<>ICURR) THEN SUSPEND;
      ICURR=I;
      END
  END


Обращение к ХП - как обычно, SELECT * FROM MyProc
...
Рейтинг: 0 / 0
19.08.2003, 16:31
    #32240615
Vagoo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка данных без дубликатов из таблицы в 200000 записей
Может быть так:

select GOOD_ID, EDIT_TIME, max(PRICE_I)
from TABLE
order by GOOD_ID
having EDIT_TIME = (select max(EDIT_TIME) from TABLE)
...
Рейтинг: 0 / 0
19.08.2003, 16:59
    #32240661
Johnmen
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка данных без дубликатов из таблицы в 200000 записей
>Vagoo

Не может быть так...:)
...
Рейтинг: 0 / 0
19.08.2003, 17:50
    #32240750
Maks_f
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка данных без дубликатов из таблицы в 200000 записей
Осмелюсь предположить что записи в таблице просто не разграничены периодами предположим по месячно, предлагаю завести поле которое будет обозначать период и ес-но индекс по этому полю, а далее я думаю ни какой вложеный запрос не положит сервак, так как будет выбираться не все ко-во записей а только по текущему периоду, однако надо бы устаканить случай когда запись по данному критерю последний раз появлялась в предыдущих периодах , однако это очень просто реализовать в процедуре. У нас так все прекрасно работает проблем нет.
...
Рейтинг: 0 / 0
20.08.2003, 04:15
    #32240980
Fighter
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка данных без дубликатов из таблицы в 200000 записей
2 Johnmen
> Основной запрос - 1, для каждой записи основного (200000)- вложенный
> запрос. Итого 1*200000 запросов.

Для основного прохода считывается 200000 записей и для каждой записи опять же считывается 200000 записей! Отсюда и 200000*200000!
...
Рейтинг: 0 / 0
20.08.2003, 04:58
    #32240986
StarWind
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка данных без дубликатов из таблицы в 200000 записей
Народ, начнем с того что давайте заведем индексы по дате...
это первое...
далее декартово произведение кол-ва записей это при джойнах...
в данном случае будет просто сумма.
подобный запрос который предлагали у меня работает менее секунды, при индексах разумеется. А Having вообще враги придумали, по крайней мереэто более чем не подходит для данного случая, потому как последний вообще не ходит по индексам и отрабатывает он после получение результатов от секции Where после группировки и подсчета агрегатных функций. ТОбишь когда про индексы и вспоминать как-то поздно...
...
Рейтинг: 0 / 0
20.08.2003, 09:31
    #32241142
Johnmen
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка данных без дубликатов из таблицы в 200000 записей
>Fighter

Чего 200000*200000 ??? Убитых енотов ? Буказоидов ? Другое ?
Вообще непонятно, о чем спор...
...
Рейтинг: 0 / 0
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Выборка данных без дубликатов из таблицы в 200000 записей / 25 сообщений из 47, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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