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

Вниз

Тормоза ADO SQL   Найти похожие ветки 

 
Mike_ ©   (2003-02-06 17:31) [0]

Доброго времени суток. Вводная: есть БД Access, есть таблица Exel. При обработке и переносе данных из Exel (через OLE) в .MDB (ADO, SQL, практически только Insert) наблюдается постепенное замедление скорости вставки данных. При после 7000-8000 вставленных записей скорость (по сравнению со скоростью вставки первых записей) падает в 10-15 раз, потом еще сильнее. База индексирована.

Что делать? Надо ускорить, а как? Не оставьте без ответа плиз.


 
ermserg   (2003-02-06 18:26) [1]

Ispolzovat DTS


 
sniknik ©   (2003-02-06 19:25) [2]

а сколько у вас идет запрос?
для примера попробовал из Exel в Access

insert into ExelMax SELECT * FROM [Sheet2$] IN "" [Excel 5.0; DATABASE=D:\Кассовые события.xls;]

получилось 1,75сек. 65535 записей (нормально вполне), и больше не будет (65535 максимально для Exel) так стоит ли беспокоится?

или у вас не так? тогда как? подробно.


 
Mike_ ©   (2003-02-06 23:13) [3]

Нет, надо каждую запись обработать.
Так что читаем по одной ( пробовал уж и Эксель в txt конвертить и читать стримом, не играет роли, никакого увеличения скорости) и по одной же вставляем.
Вот так. :(


 
sniknik ©   (2003-02-06 23:54) [4]

тогда проверь следующее.

(надеюсь у тебя 2000-й,NT на крайняк XP но не 98-95 не подходят для программирования/тестов по моему)

открой диспечер задачь, вкладка быстродействие, и во время запросов проследи за количеством открытых дескрипторов и доступной память. (был у меня такой глюк на одной из версий МДАКа или Jet-а) ресурсы сжирались с каждой командой (причем примерно равные независимо от "тяжести" комманды) и возвращались только с "убийством формы" или по завершении программы например.
тогда я вышел из положения, динамически создавая ADO компоненты, и пересоздавал ~ после 3000 вызовов. Free компоненте освобождало память.

если у тебя так же можеш попробовать.

после кокогото (не следил, не знал что надо), апдейта mdak и jet глюк исчез. та же тестовая прога которая раньше за ночь работы вешала машину счас пашет неделями. (даже не перекомпилялась)

тоже можно попробовать проапдейтить.

может конечно это просто глюк в самой проге, с такими же симптомами, (память гданибудь не освобождаеш) но это ты сам проследи.

надеюсь помог.
почему нельзя обработать одним запросом? у jet-а довольно большая функциональность. многое можно, только за счет функциональности может обгонять BDE при работе с dbf к примеру (в большинстве это не так а совсем наоборот).


 
VAleksey ©   (2003-02-07 06:31) [5]

А еще вот что ... Ты данные визуализируешь при вставке ? Если да, то какие компоненты используешь ?
Попробуй вообще все визуальные контролы отключить при выполнении этой операции.


 
Mike_ ©   (2003-02-07 11:09) [6]

Нет, утечек памяти нет, проверено. Ресурсы тоже не кушает. Даже так: обрабатывае 5000 записей, время растет и приближается к минуте на запись, закрываем, запускаем снова с того места где остановились и дальше - время вставки тоже около минуты, и продолжает расти.
Одним запросом? В каждой записи необходимо произвести разбор и анализ строкового поля, так что приходится читать по одному, и соответственно вставлять. При этом после анализа принимается решение, вставлять строку в поле допустим, Field_1 или в Field_2. То есть, таблица ёкселя должна быть предварительно "причесана".
------------
Для визуализации используется DBGrid, попробую отключить, и Label, в который выводится порядковый номер записи(ИМХО отключать не стоит...).


 
Nikolai_S ©   (2003-02-07 11:49) [7]

Замедление вставки может замедляться из-за индексов. Ведь как известно индексы замедляют процессы вставки. Но чтобы так сильно замедлять... А каким образом вставка происходит? Через ADO компоненты (Append/Post) или напрямую SQL-запросами (Insert Into)?
Вообще желательно сначала открыть черз TADOTable/TADOQuery и лист Excel и Таблицу Access:
1. ExcelAdoQuery.SQL.Text := "SELECT * FROM [Лист1$]";
2. AccessAdoQuery.SQL.Text := "SELECT * FROM [ACCESS_TABLE]";
Естественно ADO компоненты должны быть подсоедены к соответствующим TADOConnection"ам. Тогда должно быстрее работать, чем через OLE...


 
sniknik ©   (2003-02-07 11:49) [8]

> разбор и анализ строкового поля
так примерно?

INSERT INTO TrTest (CASH,FLAG,SUSER,SCOUNT) VALUES
(iif( "YES"= "да","0",0), iif(Instr(1, "YES", "I", 0)=0, 10,100), "dbo", 0)

поменяй текст на поле, одиночную вставку на вставку из файла, условие выполнено (анализ может быть и посложнее) (доступны почти все функции бейсика)

> закрываем, запускаем
не закрываем, запускаем а уничтожаем/создаем. (переоткрытие мне тоже не помагало)


 
Mike_ ©   (2003-02-10 08:42) [9]

Во! Замена на AccessAdoQuery помогла! Скорость достигла (на машине Cel466, RAM 128M) 1200 записей в минуту, стабильна вне зависимости от размера базы. Спасибо всем!



Страницы: 1 вся ветка

Текущий архив: 2003.02.27;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.017 c
7-87735
Hyper[SN]
2002-12-16 23:30
2003.02.27
Инфракрасный приемник


14-87695
herosofnn
2003-02-11 15:30
2003.02.27
Изображения на кнопки


1-87389
Raduga
2003-02-16 12:28
2003.02.27
Добавление полей в Design-Time


6-87589
SeF
2003-01-08 23:51
2003.02.27
TServerSocket


1-87431
Дима2003
2003-02-17 10:11
2003.02.27
iif ?