|
|
|
Выборка данных без дубликатов из таблицы в 200000 записей
|
|||
|---|---|---|---|
|
#18+
Господа! Хелп!! Третий день парюсь над SQL-запросом, ничего не получается, скорее всего туплю, и решение должно быть очевидным... Задача: выбрать из таблицы: ID товара (GOOD_ID) и его цену(PRICE_I), причем цена должна быть выбрана для самой последней дате изменения товара (EDIT_TIME). В таблице 200000 записей! Т.е. сложные запросы с подзапросами вешают сервак намертво :) Сама таблица: GOOD_ID, PRICE_I, EDIT_TIME, .... Для примера данные: Код: plaintext 1. 2. 3. 4. 5. 6. 7. Вариант с процедурами не подходит, нужен именно SQL-запрос. Подозреваю, что нужно юзать псевдонимы и RDB$DB_KEY??? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2003, 12:28 |
|
||
|
Выборка данных без дубликатов из таблицы в 200000 записей
|
|||
|---|---|---|---|
|
#18+
А кто мешает выполнить Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2003, 12:47 |
|
||
|
Выборка данных без дубликатов из таблицы в 200000 записей
|
|||
|---|---|---|---|
|
#18+
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) ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2003, 12:49 |
|
||
|
Выборка данных без дубликатов из таблицы в 200000 записей
|
|||
|---|---|---|---|
|
#18+
А индекс на EDIT_TIME есть? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2003, 13:00 |
|
||
|
Выборка данных без дубликатов из таблицы в 200000 записей
|
|||
|---|---|---|---|
|
#18+
Ну так-то оно так, но сколько будет выполнять ся этот запрос? Можно прикинуть 200000 * 200000 ? Или я ошибаюсь ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2003, 13:05 |
|
||
|
Выборка данных без дубликатов из таблицы в 200000 записей
|
|||
|---|---|---|---|
|
#18+
>Dnico 200000*200000 - это количество минут или секунд ? :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2003, 13:11 |
|
||
|
Выборка данных без дубликатов из таблицы в 200000 записей
|
|||
|---|---|---|---|
|
#18+
>200000*200000 - это количество минут или секунд ? Это видимо двести тысяч РАЗ по двести тыщ запросов. Секунды зависят от железки;-) И, осмелюсь предположить, _от индексов_. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2003, 13:20 |
|
||
|
Выборка данных без дубликатов из таблицы в 200000 записей
|
|||
|---|---|---|---|
|
#18+
> 200000*200000 - это количество минут или секунд ? Количество проходов причём натурал! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2003, 13:21 |
|
||
|
Выборка данных без дубликатов из таблицы в 200000 записей
|
|||
|---|---|---|---|
|
#18+
>Moses Если запросов, то я вижу 1*200000 И, конечно, индексирование влияет... (на скорость)... :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2003, 13:23 |
|
||
|
Выборка данных без дубликатов из таблицы в 200000 записей
|
|||
|---|---|---|---|
|
#18+
Johnmen А самому проверить ? Я вот ради интереса проверил ... у меня зашкалило за 24 мульена ... а зписей 17000. Ну так как? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2003, 13:32 |
|
||
|
Выборка данных без дубликатов из таблицы в 200000 записей
|
|||
|---|---|---|---|
|
#18+
>Dnico Что проверить ? Количество выполненных запросов ? Количество времени ? Другое ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2003, 13:38 |
|
||
|
Выборка данных без дубликатов из таблицы в 200000 записей
|
|||
|---|---|---|---|
|
#18+
Johnmen Кол-во запросов! А время зависит от индексов. Это как раз самое простое - добавил индекс и гуляй себе ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2003, 13:40 |
|
||
|
Выборка данных без дубликатов из таблицы в 200000 записей
|
|||
|---|---|---|---|
|
#18+
>Dnico Количество запросов = 1*200000. А что такое у тебя "24 мульена " ? И где это видно ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2003, 13:48 |
|
||
|
Выборка данных без дубликатов из таблицы в 200000 записей
|
|||
|---|---|---|---|
|
#18+
Зделал, как посоветовал 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 нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2003, 13:51 |
|
||
|
Выборка данных без дубликатов из таблицы в 200000 записей
|
|||
|---|---|---|---|
|
#18+
Johnmen Откуда взяться 1*200000 ? Для каждой записи из T1 используется проход по всем записям в T2. Умножаем ... получаем !!! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2003, 13:52 |
|
||
|
Выборка данных без дубликатов из таблицы в 200000 записей
|
|||
|---|---|---|---|
|
#18+
>Nikita Krivtsov Если идет борьба за производительность, то делай, как уже советовал Dnico, ХП. Тогда достаточно будет одного запроса с соотвествующим ORDER BY и прописанной логикой "отброса" ненужных записей в ХП. >Dnico >Откуда взяться 1*200000 ? Основной запрос - 1, для каждой записи основного (200000)- вложенный запрос. Итого 1*200000 запросов. >Для каждой записи из T1 используется проход по всем записям в T2. Ну да, кто спорит ? >Умножаем ... получаем !!! Так что же получаем ? Чего и в каких единицах ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2003, 14:02 |
|
||
|
Выборка данных без дубликатов из таблицы в 200000 записей
|
|||
|---|---|---|---|
|
#18+
Лучше всего всеже использовать процедуру: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2003, 14:08 |
|
||
|
Выборка данных без дубликатов из таблицы в 200000 записей
|
|||
|---|---|---|---|
|
#18+
Вчера делал такой запрос: Код: plaintext 1. 2. 3. 4. 5. (where pricelist_id=2 ) -идентификатор прайс-листа, впринципе не столь важен для нашего запроса Он не совсем правильный, но может быть от него отталкиваться??? По крайней мере выполнялся несколько секунд. P.S. Да забыл указать, что после выборки из таблицы где 200000 записей, в результате должно получиться 10000 записей. И еще такая проблема: изменять базу я не могу, т.е. не могу индексы добавить, не могу процедуры и т.д. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2003, 14:08 |
|
||
|
Выборка данных без дубликатов из таблицы в 200000 записей
|
|||
|---|---|---|---|
|
#18+
>Dnico Это те же 200000 запросов... >Nikita Krivtsov Максимально быстро, в один запрос (ХП) : Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. Обращение к ХП - как обычно, SELECT * FROM MyProc ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2003, 15:14 |
|
||
|
Выборка данных без дубликатов из таблицы в 200000 записей
|
|||
|---|---|---|---|
|
#18+
Может быть так: select GOOD_ID, EDIT_TIME, max(PRICE_I) from TABLE order by GOOD_ID having EDIT_TIME = (select max(EDIT_TIME) from TABLE) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2003, 16:31 |
|
||
|
Выборка данных без дубликатов из таблицы в 200000 записей
|
|||
|---|---|---|---|
|
#18+
>Vagoo Не может быть так...:) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2003, 16:59 |
|
||
|
Выборка данных без дубликатов из таблицы в 200000 записей
|
|||
|---|---|---|---|
|
#18+
Осмелюсь предположить что записи в таблице просто не разграничены периодами предположим по месячно, предлагаю завести поле которое будет обозначать период и ес-но индекс по этому полю, а далее я думаю ни какой вложеный запрос не положит сервак, так как будет выбираться не все ко-во записей а только по текущему периоду, однако надо бы устаканить случай когда запись по данному критерю последний раз появлялась в предыдущих периодах , однако это очень просто реализовать в процедуре. У нас так все прекрасно работает проблем нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2003, 17:50 |
|
||
|
Выборка данных без дубликатов из таблицы в 200000 записей
|
|||
|---|---|---|---|
|
#18+
2 Johnmen > Основной запрос - 1, для каждой записи основного (200000)- вложенный > запрос. Итого 1*200000 запросов. Для основного прохода считывается 200000 записей и для каждой записи опять же считывается 200000 записей! Отсюда и 200000*200000! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.08.2003, 04:15 |
|
||
|
Выборка данных без дубликатов из таблицы в 200000 записей
|
|||
|---|---|---|---|
|
#18+
Народ, начнем с того что давайте заведем индексы по дате... это первое... далее декартово произведение кол-ва записей это при джойнах... в данном случае будет просто сумма. подобный запрос который предлагали у меня работает менее секунды, при индексах разумеется. А Having вообще враги придумали, по крайней мереэто более чем не подходит для данного случая, потому как последний вообще не ходит по индексам и отрабатывает он после получение результатов от секции Where после группировки и подсчета агрегатных функций. ТОбишь когда про индексы и вспоминать как-то поздно... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.08.2003, 04:58 |
|
||
|
|

start [/forum/search_topic.php?author=wtrostov&author_mode=last_posts&do_search=1]: |
0ms |
get settings: |
10ms |
get forum list: |
17ms |
get settings: |
7ms |
get forum list: |
16ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
48ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
62ms |
get tp. blocked users: |
2ms |
| others: | 472ms |
| total: | 652ms |

| 0 / 0 |
