Форум: "Базы";
Текущий архив: 2004.12.12;
Скачать: [xml.tar.bz2];
ВнизInterbase, проблема с большим числом записей Найти похожие ветки
← →
Sergy Ivanec (2004-11-03 11:05) [0]Вообщем вылезла ошибка. Все перепробовал.
Есть ibdatabase, ibtransaction, ibquery , таблица с 3 000 000 записей и такой код (перед этим кодом я закрываю другое соединение с базой- не помню, сколь версия ib поставляемая с делфи поддерживает соединений):
ibd:=Tibdatabase.Create(form6);
ibt:=Tibtransaction.Create(form6);
ibt.DefaultDatabase:=ibd;
ibd.DefaultTransaction:=ibt;
ibd.Params.Add("user_name=sysdba");
ibd.Params.Add("password=masterkey");
ibd.Params.Add("lc_ctype=WIN1251");
ibd.LoginPrompt:=false;
ibd.DatabaseName:="имя базы";
ibd.Connected:=true;
ibt.Active:=true;
ibs:=Tibquery.Create(form6);
ibs.Database:=ibd;
//такой запрос
ibs.SQL.Add("select max(id) as mid from tablica");
ibs.Open;
if ibs.Fields[0].Value<>null then
id:=ibs.FieldByName("mid").Asinteger+1;
ibt.Commit;//возможно подтверждать не надо
ibs.Close;
ibs.Destroy;
ibt.Destroy;
ibd.Destroy;
Что тут неправильно - непонятно совсем. Кроме этого и другие компоненты начали ошибку выдавать при таком кол-ве записей.
← →
Mike Kouzmine © (2004-11-03 11:09) [1]Какую ошибку? "Слишком много записей"? А триггерами нельзя пользоваться для сего дела?
← →
Sergey13 © (2004-11-03 11:12) [2]> id:=
Что ткое id?
← →
Карелин Артем © (2004-11-03 11:20) [3]Количество тут не при чем. Ноги из запроса растут.
← →
Карелин Артем © (2004-11-03 11:22) [4]Поправка: база целая?
← →
Sergy Ivanec (2004-11-03 11:42) [5]Ошибка access violation...она начала вылетать и в
ibdataset - datasource - dbgrid -при попытке вывести все
3000000 записей.
Насчет того, целая ли база - проверю, но по-видимому да. для Для получения данной величины дейтсвительно воспользуюсь триггером.
← →
Danilka © (2004-11-03 11:43) [6]На правах оффтопа:
1. Если id это ключевое поле, то значение для него все-таки лучше генератором генерировать. И доставать последнее сгенерированное значение из генератора (правда, понятия не имею, зачем это нужно вообще).
2. В данном запросе "select max(id) as mid from tablica", если по полю id не будет индекса с обратной сортировкой (не по возрастанию, а по уменьшению) то этот запрос будет перебирать все три мильена записей...
3. Ну и вообще, много чего можно написать по этому коду, и на счет дестроев, и на счет id:=ibs.FieldByName("mid").Asinteger+1 при многопользовательском доступе и т.д. и т.п.
А по теме, в каком именно месте возникает ошибка?
← →
Danilka © (2004-11-03 11:45) [7][5] Sergy Ivanec (03.11.04 11:42)
> ibdataset - datasource - dbgrid -при попытке вывести все
> 3000000 записей.
брр.
скажи, дорогой друг, зачем тебе в гриде три мильена записей???
если каждую запись разглядывать только 1 секунду, круглосуточно, на просмотр всех записей уйдет больше месяца...
:)
← →
msguns © (2004-11-03 11:45) [8]Судя по всему вычисляется что-типа "текущего № док-та" как самый старших, увеличенный на 1. Запрос нормальный, хотя я, к примеру, такие вещи запихиваю в ХП, которая может вычислять № как вообще, так и в пределах указанного вх.параметром года и даже типа документа (но это ессно для док-тов).
Если это не документы, то почему нельзя юзать генераторы ?
А вообще хотелось бы поподробнее о том, в каком месте кода слет.
Да, и еще: Что это
if ibs.Fields[0].Value<>null then
?
Может проще так
if ibs.RecordCount>0 then
← →
Danilka © (2004-11-03 11:52) [9][8] msguns © (03.11.04 11:45)
Чем больше кол-во пользователей, тем больше вероятность, что двое одновременно получат одинаковое значение беря max+1, и, следовательно, кто-то из них отгребет ошибку.
← →
msguns © (2004-11-03 11:59) [10]>Danilka © (03.11.04 11:52) [9]
>>[8] msguns © (03.11.04 11:45)
>Чем больше кол-во пользователей, тем больше вероятность, что двое одновременно получат одинаковое значение беря max+1, и, следовательно, кто-то из них отгребет ошибку.
Если речь идет об автополучаемых неключевых полях записей (а № док-та именно таковым и является), то ошибку при записи не "огребет" никто. 2 одинаковых № счета (накладной отгрузки, платежки и т.д.) - да, получат, но
во-первых, это можно исправить после коммита и переоткрытия НД (например перед печатью),
во-вторых мала вероятность одновременного добавления 2-х накладных даже при параллельной работе выписки счетов с 10 компов (есть опыт), т.к. № определяется в момент записи заголовка в таблицу заголовков.
в-третьих, ничего страшного. нигде в законодательсте не написано, что у меня НЕ может быть 2 (10, 20, 100) накладных (к примеру) с № 1.
← →
Карелин Артем © (2004-11-03 12:02) [11]Sergy Ivanec (03.11.04 11:42) [5]
А сколько памяти требуется для вывода 3Мзаписей в сетку? Наверно больше 2Г, при превышениии которых и идет AV.
← →
Sergey_Masloff (2004-11-03 16:26) [12]Карелин Артем © (03.11.04 12:02) [11]
>Наверно больше 2Г, при превышениии которых и идет AV
Бред
← →
Johnmen © (2004-11-03 16:38) [13]>msguns © (03.11.04 11:45) [8]
>Может проще так
>if ibs.RecordCount>0 then
Может и проще. Но точно неверно...:)
← →
msguns © (2004-11-03 17:31) [14]>Johnmen © (03.11.04 16:38) [13]
Почему ?
← →
Johnmen © (2004-11-03 17:55) [15]>msguns © (03.11.04 17:31) [14]
Потому, что запрос [0] всегда возвращает 1 запись.
← →
YurikGL © (2004-11-03 22:31) [16]Интересно, а сколько времени комп думает, прежде чем AV выдает?
← →
Sergy Ivanec (2004-11-04 01:13) [17]Все разрешилось...насколько все было тупо - ужас. Мне понадобился freereport - был вынужден перейти на 6 делфю-одну из ее первых версии.И после этого начались глюки с IBX. Везде AV. Абсолютно случайно, уже в панике - 5 дней мучался - скомпиил проект в 7. И О ЧУДО - все работает. И запросы, и транзакции и датасеты. Всем большое спасибо за помощь.
Тригеры я выставил и процедуру написал - вообще чудо все работает.
← →
Карелин Артем © (2004-11-04 13:39) [18]Sergey_Masloff (03.11.04 16:26) [12]
Что значит "Бред"?????? Пробовал??????
Сделай таку датасету и перейди в конец(ну или fetchall).
← →
Johnmen © (2004-11-04 14:07) [19]>Карелин Артем © (04.11.04 13:39) [18]
Просто интересно, откуда эта цифра 2 ?
← →
Карелин Артем © (2004-11-04 14:23) [20]Johnmen © (04.11.04 14:07) [19]
Из личного опыта и 32-разрядной архитектуры
← →
Sergey_Masloff (2004-11-04 21:37) [21]Карелин Артем © (04.11.04 13:39) [18]
>Sergey_Masloff (03.11.04 16:26) [12]
>Что значит "Бред"?????? Пробовал??????
>Сделай таку датасету и перейди в конец(ну или fetchall).
То и значит что бред. Я не больной такие объемы в датасет загонять но за другими горячими ребятами подбирал подобное. Кэш датасета кончится ГОРАЗДО раньше твоих 2Гб. В зависимости отк омпонент от пары мегабайт до нескольких десятков мегабайт.
Проверь сам.
← →
Карелин Артем © (2004-11-11 09:41) [22]Sergey_Masloff (04.11.04 21:37) [21]
Какой кэш? Элементарное выделение памяти под что-то из кучи. Тут все зависит от желания винды выделить память. Цифры в пару мегабайт просто смехотворны для любой оси. Несколько десятков??
Это уже ближе если речь о винде 9Х и небольших размерах оперативки. У меня в 98 затруднительно получить одной программе(считай датасэту) больше 400-500 мегов.
В 2000 же в идеале программа честно получает все два гига. На практике же часто встречается недостаток памяти и сильно ограниченный сверху размер файла подкачки.
Насчет проверить: проверено неоднократно. Достаточно долго занимаюсь задачами, требующих много памяти.
Чтобы не быть голословным вот доказательства:
http://blackrain.pisem.net/before.jpg - это читается большой набор данных.
http://blackrain.pisem.net/after.jpg - это он был закрыт (освободилась занятая набором данных память.)
Как видно на рисунках, разница несколько больше "нескольких десятков мегабайт".
--------------------------
1) Я не стал писать программу, потому как знаю что использовавшийся в тесте инструмент написан на Дельфи.
2) до 2-х гигов не довел по той причине, что имеющийся под руками комп достаточно слаб(128 оперативки, медленный винт, процессор П3-целерон). Ждать долго надо этих 2-х гигов.
← →
DSKalugin © (2004-11-11 11:48) [23]Вы все чета не туды смотрите
ibt:=Tibtransaction.Create(form6);
Делай так
ibt:=Tibtransaction.Create(nil);
и всем остальным тоже НИЛ передавай, если вручную создаешь и удаляешь.
При уничтожении Формы6 выскочит AV, поскольку она будет пытаться уничтожить уже уничтоженные
ibs.Destroy;
ibt.Destroy;
ibd.Destroy;
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2004.12.12;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.038 c