Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Базы данных и репортинг > Потребление памяти


Автор: royun 17.1.2012, 09:58
Добрый день.

У меня есть программа, которая передает данные из StringGrida в таблицу SQL Server 2000. Используется ADOConnection, ADODataSet. Для доступа к таблице. Передача данных идет следующим образом:

      
Код

ADODataSet1['Date'] := StrToDateTime(StringGrid2.Cells[1, iRow]);
      ADODataSet1['AbonentA'] := StringGrid2.Cells[2, iRow];
      ADODataSet1['AbonentB'] := StringGrid2.Cells[3, iRow];
      ADODataSet1['Vremia'] := StringGrid2.Cells[4, iRow];
      ADODataSet1['Dlit'] := StringGrid2.Cells[5, iRow];
      ADODataSet1['Dlit_fakt'] := StringGrid2.Cells[6, iRow];
      ADODataSet1['Vh_trunk'] := StringGrid2.Cells[7, iRow];
      ADODataSet1['Ish_Trunk'] := StringGrid2.Cells[8, iRow];
      ADODataSet1['Prichina'] := StringGrid2.Cells[9, iRow];
      ADODataSet1['Zona'] := StringGrid2.Cells[10, iRow];


В свойствах ADODataSet CommandType стоит cmdStoredProc и в CommandText стоит имя хранимой процедуры sp1;1. А в хранимой процедуре команда:

Код

CREATE PROCEDURE sp1 AS
select * from billing
GO


Сейчас в таблице порядка 8 млн. записей. Когда программу запускаешь, то программа подключается к таблице и считывает все 8 млн. записей и потом открывается. Проходит примерно 16 минут. Потребляет оперативной памяти около 1.5 Гб, SQL Server 2000 ограничил 500 Мб. После открытия программы потребление памяти начинает падать. 

Проблема потребления памяти только на стадии открытия программы.

Как быть, посоветуйте пожалуйста.

Автор: Vas 17.1.2012, 13:42
Цитата(royun @  17.1.2012,  09:58 Найти цитируемый пост)
Когда программу запускаешь, то программа подключается к таблице и считывает все 8 млн. записей и потом открывается. 

Зачем все выбирать? Вроде же программа передает
Цитата(royun @  17.1.2012,  09:58 Найти цитируемый пост)
У меня есть программа, которая передает данные из StringGrida в таблицу SQL Server 2000.

Ну, а если прям сильно надо выбирать, то делай условие по которому выбираться записи будут.

Автор: superVad 17.1.2012, 13:49
royun, сомневаюсь, что кому то может понадобится 8 млн. записей на экране.
Устанавливай какие то фильтры по дате.

Автор: royun 18.1.2012, 05:18
Настроил ADOConnection, в ADODataSet в свойствах Connection выбираю ADOConnection. Если я не заполню свойство ADODataSet CommandText, то когда свойство Active ставлю TRUE выходит ошибка "Missing command text property". Поэтому в свойстве CommandType ставлю cmdStoredProc и в CommandText пишу имя хранимой процедуры sp1;1, т.к. хранимые процедуры выполняются быстрее.

Вот и поэтому происходят тормоза в программе. Как это дело обойти можно?

Автор: Vas 18.1.2012, 08:08
А собственно зачем при открытии программы компоненту ADODataSet  ставить свойство Active=True?

Хочешь чтобы помогли, ответь на вопрос: Зачем тебе все 8млн записей на клиенте????

Автор: chip_and_dayl 18.1.2012, 10:19
Добавление идет через инсерт ADODataSet!?!

Инсерт лучше делать через запрос INSERT INTO ... тогда чтобы вставить запись не нужно открывать вообще таблицу с 8 миллионами или одной записью

Добавлено @ 10:22
То что вы написали в хранимке с надеждой о чуде.... можете убрать вашу хранимку, она явно не для таких целей предназначена (ИМХо)

Добавлено @ 10:24
По поводу открытия программы, читайте советы 
Vas и
superVad
только индекс по дате добавьте

Автор: royun 18.1.2012, 11:19
Все на само деле оказалось куда проще:


Код

select * from billing
where npp='1'



И теперь не тащу на клиента 8 млн. записей. И все записи корректно переносятся в таблицу. Проверил.

Не ругайте, только начинаю.

Тема закрыта.

Автор: Vas 18.1.2012, 14:34
Цитата(royun @  18.1.2012,  11:19 Найти цитируемый пост)
И теперь не тащу на клиента 8 млн. записей. И все записи корректно переносятся в таблицу. Проверил.


Дык если бы тебя не пытали, зачем тебе 8 млн записей, до сих пор бы тянул  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)