![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Out of memory в результате фетча большого числа записей. [D7, FB 2.1]
Дмитрий Белькевич © (2009-07-02 14:57:00)Записей около 3-х млн. Можно ли что-то придумать, кроме рекомендации меньше фетчить? Все записи в памяти не нужны, нужна только одна, текущая запись.
Компоненты - IBX
Дмитрий Белькевич (2009-07-02 18:51:00) [21]
> А дергать записи пакетами по 100 000 штук нельзя ?
Я не уверен, есть ли гарантии, что не пропустится какая-то одна (а часто бывает, что именно одна-две из миллиона и нужны). Так как в базу частенько пишут (добавляют/удаляют) другие потоки. Хотя это не очень критично и есть надежда, что в пределах одной транзакции каша не должна возникнуть. Хотелось бы, конечно, одним селектом ограничится, но если иначе - никак, то буду что-то с несколькими селектами думать.
Посмотрел Unidirectional. Похоже на то, что нужно, по крайней мере, на кэширование записей влияет точно. Попробую.
PEAKTOP (2009-07-02 18:36:00) [22]А дергать записи пакетами по 100 000 штук нельзя ?
Из спецификации оператора SELECT:
SELECT
[ DISTINCT| ALL]
[ FIRST{<record_number> | (:param_recordnumber) } [ SKIP<record_number> | (:param_recordnumber) ] ]
.....
[ ORDER BY<sort_value_list> ]
..........
Дмитрий Белькевич (2009-07-02 18:10:00) [23]>Я что то не въезжаю.
Как уже народ сказал, пользователь - не живой. Есть программный цикл, который последовательно выбирает записи и обрабатывает информацию. Ему в единицу времени нужна только одна запись.
>Поиск что-ли ?
Можно сказать и так. В базе - линки на файлы. Поиск недостающих и излишних.
>Уменьшить количество полей в селекте.
Это временно поможет, но не решит проблему. 6 млн (или 10) опять будут валить программу. Тем не менее, я уже выбираю достаточный минимум полей.
stas (2009-07-02 17:20:00) [24]>Дмитрий Белькевич (02.07.09 14:57) [1]
Уменьшить количество полей в селекте.
DrPass (2009-07-02 17:03:00) [25]
> Sergey13 © (02.07.09 16:55) [10]
> Замена пользователя на клиента ничего для меня лично не
> прояснила. Ну да ладно.
Пользователь - это живой человек. Клиент - это в общем случае бездушная программа. Которая может выгребать 3 млн записей для того, чтобы закачать в другую СУБД, сделать статистический анализ или нарисовать по ним кардиограмму.
Sergey13 (2009-07-02 16:55:00) [26]> [8] DrPass © (02.07.09 16:22)
Замена пользователя на клиента ничего для меня лично не прояснила. Ну да ладно.
PEAKTOP (2009-07-02 16:54:00) [27]> Записей около 3-х млн. Можно ли что-то придумать, кроме
> рекомендации меньше фетчить? Все записи в памяти не нужны,
> нужна только одна, текущая запись.
А описать задачу нельзя ?
Чего-то совсем я не пойму, зачем вообще понадобилось все 3 млн фетчить. Поиск что-ли ?
DrPass (2009-07-02 16:22:00) [28]
> Sergey13 © (02.07.09 15:58) [7]
Там, вообще-то, про пользователя ни слова не было сказано :)
Sergey13 (2009-07-02 15:58:00) [29]> [4] Дмитрий Белькевич (02.07.09 15:42)
Я что то не въезжаю.
Запрашиваем в запросе все записи из трехмиллионной таблицы. Сколько то уже закачалось на клиента. Пользователь решает, что полуторамиллионная запись - это, в принципе то, что ему надо. Так что ли? Или ему надо взять любую запись?
Anatoly Podgoretsky (2009-07-02 15:52:00) [30]Не смотреть, а делать.
Дмитрий Белькевич (2009-07-02 15:43:00) [31]
> Можно. Unidirectional:= true
Спасибо, посмотрю.
Дмитрий Белькевич (2009-07-02 15:42:00) [32]
> А что значит текущая запись, если она еще не на клиенте?
Которую клиент себе уже забрал и с ней может работать.
DrPass (2009-07-02 15:29:00) [33]
> Можно ли что-то придумать
Можно. Unidirectional:= true
Sergey13 (2009-07-02 15:03:00) [34]> [0] Дмитрий Белькевич (02.07.09 14:57)
> нужна только одна, текущая запись.
А что значит текущая запись, если она еще не на клиенте?
Дмитрий Белькевич (2009-07-02 14:57:00) [35]3 млн селектов тоже не предлагать ;) Базе и так тяжело...