Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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
1-1101704042
Dreamse
2004-11-29 07:54
2004.12.12
Проблема с TreeView


9-1092494837
Макс
2004-08-14 18:47
2004.12.12
Алгоритм объезда препятствий


4-1098970024
TitanDesign
2004-10-28 17:27
2004.12.12
Как запустить приложение и подождать пока она закроется.


14-1100873270
by
2004-11-19 17:07
2004.12.12
Есть ли в Delphi 7 Professional компонент TClientDataSet?


3-1100076696
Yurij-7
2004-11-10 11:51
2004.12.12
Информация из DBGrid





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский