Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.12.12;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.023 c
14-1100870142
ПЛОВ
2004-11-19 16:15
2004.12.12
Где достать голосовой профиль для украинского языка?


14-1100806544
gn
2004-11-18 22:35
2004.12.12
M$ признала часть вины в распространении вирусов


3-1100382640
kirilllius
2004-11-14 00:50
2004.12.12
Размер Access и JPEG


3-1100522277
lightix
2004-11-15 15:37
2004.12.12
DBF-ФАЙЛЫ.ЧИСТКА И СОЗДАНИЕ УНИКАЛЬНОГО КЛЮЧА


3-1100100160
by
2004-11-10 18:22
2004.12.12
Не срабатывают DEFAUL значения