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

Третий день парюсь над 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
Выборка данных без дубликатов из таблицы в 200000 записей
    #32240124
Фотография Dnico
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А кто мешает выполнить
Код: plaintext
1.
SELECT * FROM PROCEDURE(...);
...
Рейтинг: 0 / 0
Выборка данных без дубликатов из таблицы в 200000 записей
    #32240129
Фотография Johnmen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Выборка данных без дубликатов из таблицы в 200000 записей
    #32240146
Moses
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А индекс на EDIT_TIME есть?
...
Рейтинг: 0 / 0
Выборка данных без дубликатов из таблицы в 200000 записей
    #32240154
Фотография Dnico
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну так-то оно так, но сколько будет выполнять ся этот запрос?
Можно прикинуть 200000 * 200000 ? Или я ошибаюсь ?
...
Рейтинг: 0 / 0
Выборка данных без дубликатов из таблицы в 200000 записей
    #32240168
Фотография Johnmen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Dnico

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

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

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

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

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

Количество запросов = 1*200000.
А что такое у тебя "24 мульена " ? И где это видно ?
...
Рейтинг: 0 / 0
Выборка данных без дубликатов из таблицы в 200000 записей
    #32240279
Nikita Krivtsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Зделал, как посоветовал 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
Выборка данных без дубликатов из таблицы в 200000 записей
    #32240283
Фотография Dnico
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Johnmen

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

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

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

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

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

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

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

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

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

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

Код: 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
Выборка данных без дубликатов из таблицы в 200000 записей
    #32240319
Nikita Krivtsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вчера делал такой запрос:

Код: 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
Выборка данных без дубликатов из таблицы в 200000 записей
    #32240495
Фотография Johnmen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>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
Выборка данных без дубликатов из таблицы в 200000 записей
    #32240615
Vagoo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может быть так:

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
Выборка данных без дубликатов из таблицы в 200000 записей
    #32240661
Фотография Johnmen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Vagoo

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

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

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


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