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

Вниз

Быстрый вывод в текстовый файл?   Найти похожие ветки 

 
Razrab ©   (2007-12-10 17:28) [40]

В Oracle top нет. Там можно правда через Rownum вложенно выводить от сих до сих. Но я когда увидел, что RecordCount работает, сделал через него. Правда выше уже коллеги напугали, мол до поры до времени. %) Ну на всякий случай буду иметь в виду. :)


 
sniknik ©   (2007-12-10 17:59) [41]

> ADODataset в двунаправленном режиме не поддерживает страничный фетч, а сразу тупо фетчит на себя весь датасет.
поддерживает, нужно просто установить асинхронную докачку данных в настройках.
(это у других наоборот нет "тупого" фетча всего себя. хотя этот вариант в некоторых случаях быстрее. (по общей сумме времени работы, т.е. в случаях если сразу известно что рекордсет нужен на клиенте весь))

> ADOQuery в два раза быстрее :) ну это понятно ерунда хоть и прикольно... :)
это тем более прикольно, тем, что такого попросту не может быть...

берем мотоцикл, вешаем ему сбоку люльку без колеса, так чтобы она только ездить мешала, потом устраиваем гонку с оригиналом и выясняем, что этот уродец стал в 2 раза быстрее ездить.... ты в это поверишь? я нет. ты гдето ошибся в тестах.

и вообще производительность тут не причем, сменить следует по идеологическим мотивам. (ADOQuery это призрак BDE)


 
Palladin ©   (2007-12-10 18:20) [42]


> sniknik ©   (10.12.07 17:59) [41]

вот именно, идеологические мотивы :) ну да ладно, темы религии касаться не будем...

а вот про быстрее в два раза - принципиально повторил эксперимент

таблица 36 полей int, 8 полей real, 500 000 записей

var
d:TADODataSet;
q:TADOQuery;
tc:Cardinal;
i,j:Integer;
s:String;
begin
d:=TADODataSet.Create(Nil);
d.Connection:=ADOConnection1;
d.CommandText:="select * from tbl1";
d.CommandType:=cmdText;
d.LockType:=ltReadOnly;
d.CursorLocation:=clUseServer;
d.CursorType:=ctOpenForwardOnly;

For i:=0 to 2 Do
 Begin
  tc:=GetTickCount;
  d.Open;
  While Not d.Eof Do d.Next;
  d.Close;
  Memo1.Lines.Add("TADODataSet:Pass("+IntToStr(i)+"):"+IntToStr(GetTickCount-tc));
  Application.ProcessMessages;
 End;
d.Free;

q:=TADOQuery.Create(Nil);
q.Connection:=ADOConnection1;
q.LockType:=ltReadOnly;
q.CursorLocation:=clUseServer;
q.CursorType:=ctOpenForwardOnly;

q.sql.Text:="select * from tbl1";
For i:=0 to 2 Do
 Begin
  tc:=GetTickCount;
  q.Open;
  While Not q.Eof Do q.Next;
  q.Close;
  Memo1.Lines.Add("TADOQuery:Pass("+IntToStr(i)+"):"+IntToStr(GetTickCount-tc));
  Application.ProcessMessages;  
 End;
q.Free;
end;


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


 
sniknik ©   (2007-12-10 20:11) [43]

> а так... подтвердились результаты позапрошлогоднего опыта...
?
чегото у меня никаких чудес с двукратным превосходством в скорости
~500 тыс записей, результат работы программы
TADODataSet:Pass(0):3062
TADODataSet:Pass(1):3079
TADODataSet:Pass(2):3062
TADOQuery:Pass(0):3063
TADOQuery:Pass(1):3046
TADOQuery:Pass(2):3063

в 2 раза "утяжелил" таблицу (время > в 2 раза, выдать уже своп затрагивается...)
TADODataSet:Pass(0):7438
TADODataSet:Pass(1):7546
TADODataSet:Pass(2):7579
TADOQuery:Pass(0):7562
TADOQuery:Pass(1):7578
TADOQuery:Pass(2):7547

что называется "ноздря в ноздрю", практически одинаково, как в принципе и ожидалось учитывая, что тестируется практически один и тот же компонент.

хотя... мысль имеется почему у тебя может быть разница... а поменяй ка циклы местами, квери поставь первым, датасет вторым, и желательно перезагрузись чтобы влияние кеша убрать .


 
Palladin ©   (2007-12-10 20:17) [44]

хм... WinXP, MS Office 2000, 1Gb Mem... ровно (почти) в два раза, но ADOQuery... даже не знаю... MSSQL 2000 на W3k, Xeon 3.2 с 4Gb ... локальный целерон 2.8...


 
Palladin ©   (2007-12-10 20:25) [45]

в общем вот тестируемая таблица

CREATE TABLE [dbo].[tbl1] (
[ID_DATA] [int] NOT NULL ,
[ID_SERVICE] [tinyint] NOT NULL ,
[DEBT_BEFORE] [int] NOT NULL ,
[BNF_BNF] [int] NOT NULL ,
[BNF_BNF1] [int] NULL ,
[BNF_W_BNF] [int] NOT NULL ,
[SUB_BNF] [int] NOT NULL ,
[SUB_W_BNF] [int] NOT NULL ,
[SUB_ALL] [int] NOT NULL ,
[COR_W_BNF] [int] NOT NULL ,
[FINE] [int] NOT NULL ,
[REC_BNF] [int] NOT NULL ,
[REC_W_BNF] [int] NOT NULL ,
[REC_SUB_ALL] [int] NOT NULL ,
[REC_FINE] [int] NOT NULL ,
[FINE_ENABLED] [tinyint] NULL ,
[CALC_MODE] [tinyint] NOT NULL ,
[FORMULA_FILE] [int] NULL ,
[ADDITION] [real] NOT NULL ,
[COEFF] [real] NOT NULL ,
[GROUP_VAL] [real] NOT NULL ,
[ID_GCOUNTER] [int] NULL ,
[TARIFF_VAL] [real] NOT NULL ,
[TARIFF_ID] [int] NULL ,
[SHORT_DELIV] [tinyint] NOT NULL ,
[FLAG] [int] NULL ,
[SUPPLIER_ID] [int] NULL ,
[NORM_VAL] [real] NOT NULL ,
[NORM_ID] [int] NULL ,
[ID_GROUPBYSUP] [int] NULL ,
[FINE_DEBT] [int] NOT NULL ,
[FINE_CORR] [int] NOT NULL ,
[PEOPLE_COUNT] [real] NULL ,
[SUM_PAY] [int] NULL ,
[SUM_PAY_FINE] [int] NULL ,
[COUNTER_VOL] [real] NULL ,
[NON_DELIV] [int] NULL ,
[SUB_ALL1] [int] NULL ,
[SUB_ALL2] [int] NULL ,
[INFO1] [varchar] (255) COLLATE Cyrillic_General_CI_AS NULL ,
[NO_DEBT_RECALC] [int] NULL
)

заполнена она, конечно, реальными данными, в Jet перенесено стандартным Import/Export Wizard из MSSQL без всяких модификаций 1 000 000 записей... столько выбирать при тесте я не дождался и сократил до top 50 000...


 
Palladin ©   (2007-12-10 20:27) [46]

подозрение на увеличение производительности ADODataSet падает, только на отсутствие varchar


 
sniknik ©   (2007-12-10 21:45) [47]

> в общем вот тестируемая таблица
без ключа? ужас. хотя на тест влияния это не должно оказывать

вот, изменил тест так чтобы коннект и запрос можно было менять (проврить на реальных данных)
var
 tc: Cardinal;
 i : integer;
begin
 with ADOConnection1 do begin
   Close;
   ConnectionString:= EdConnectionString.Text;
   Open;
 end;

 with TADODataSet.Create(nil) do
   try
     Connection    := ADOConnection1;
     LockType      := ltReadOnly;
     CursorLocation:= clUseServer;
     CursorType    := ctOpenForwardOnly;

     CommandText   := EdCommandText.Text;
     for i:=0 to 2 do begin
       tc:= GetTickCount;

       Open;
       while not Eof do Next;
       Close;

       Memo1.Lines.Add("TADODataSet: Pass ("+IntToStr(i)+") : "+IntToStr(GetTickCount-tc));
       Application.ProcessMessages;
     end;
   finally
     Free;
   end;

 with ADOConnection1 do begin
   Close;
   ConnectionString:= EdConnectionString.Text;
   Open;
 end;

 with  TADOQuery.Create(nil) do
   try
     Connection    := ADOConnection1;
     LockType      := ltReadOnly;
     CursorLocation:= clUseServer;
     CursorType    := ctOpenForwardOnly;

     sql.Text      := EdCommandText.Text;
     for i:= 0 to 2 do begin
       tc:= GetTickCount;
       Open;
       while not Eof do Next;
       Close;

       Memo1.Lines.Add("TADOQuery: Pass   ("+IntToStr(i)+") : "+IntToStr(GetTickCount-tc));
       Application.ProcessMessages;
     end;
   finally
     Free;
   end;
end;


сдесь весь "проект", на всякий случай с екзешником... а вдруг у тебя генофонд злодеи изменили... проверишь на моей компиляции
http://www.filefactory.com/file/ec0975/

файл я делал так (твоих реальных данных у меня нет)
CREATE TABLE tbl1 (
ID INT Identity(1, 1) PRIMARY KEY,
Name VarChar(50),
Descr VarChar(50),
Fl1 Float DEFAULT RAND(),
Fl2 Float DEFAULT RAND(),
...
Fl32 Float DEFAULT RAND()
)


после внес одну запись руками с Name="Test" Descr="Test"
и много раз подряд
INSERT INTO tbl1 (Name,Descr) SELECT Name,Descr FROM tbl1
пока в итоге не получилось 524288 записей. на ней и тестил, кто хочет может повторить

результат последнего теста... ;)
TADODataSet: Pass (0) : 3125
TADODataSet: Pass (1) : 3125
TADODataSet: Pass (2) : 3125
TADOQuery: Pass   (0) : 3125
TADOQuery: Pass   (1) : 3125
TADOQuery: Pass   (2) : 3125


 
Razrab ©   (2007-12-11 16:24) [48]

Объясните такую вещь, зачем Вы создаете визуальные компоненты через конструктор: TADOQuery.Create(nil) ?
Это разве не одно и тоже, что взять и ADOQuery на DataModule или на форму кинуть, только менее удобно. В чем выигрыш и есть ли он в данном случае вообще?


 
Anatoly Podgoretsky ©   (2007-12-11 16:31) [49]

А где создание визуального компонента?


 
sniknik ©   (2007-12-11 17:45) [50]

> зачем Вы создаете визуальные компоненты через конструктор: TADOQuery.Create(nil) ?
ну во первых не визуального... во вторых это видиш ли был пример, притом приведенный в форуме (изначально) где настроек положенного на датамодуль компонента не видно, а у созданного так-"как на ладони", и видно что никто ничего не забыл/не делает нестандартно, что меняются только то что показано остальное гарантированно по дефаулту.
можно было бы вместо этого листинг dfm привести, и потом сравнивать в 2 х местах... но это уже как то слишком вместо десятка строк самоочевидного кода.

> В чем выигрыш и есть ли он в данном случае вообще?
т.е. с учетом вышесказанного, в данном случае выигрыш очевиден, не находишь? а вообще нету его.


 
Razrab ©   (2007-12-12 21:27) [51]


> ну во первых не визуального


Я имел в виду VCL. Определение: библиоте́ка визуа́льных компоне́нтов (англ. Visual Component Library, VCL) — объектно-ориентированная библиотека для разработки программного обеспечения, разработанная компанией «Borland» по принципам визуального программирования. VCL компонент - это не обязательно видимый на форме пользователя, чем ADOQuery то не подходит? Ну да ладно, вопрос то был не в этом и вы на него выше ответили. :)


 
sniknik ©   (2007-12-13 00:56) [52]

> Я имел в виду VCL.
а написал то совсем другое...

> VCL компонент - это не обязательно видимый на форме пользователя
понимаешь же... а вот "визуальный компонент" это именно видимый.

> чем ADOQuery то не подходит?
да ничем. кроме того что пудрит мозги начинающим.
вот скажи, ты когда суп кушаешь имеешь при себе 2 ложки? ну типа, чтобы одной из тарелки зачерпывать, потом из нее в другую переливать и уже эту ко рту подносить. (??? )
а ведь это единственная(!) функция прикрученного свойства SQL, ты команду в него, он в CommandText и вся его работа. ну, вот, нафига? хотя бы чисто с эстетической точки зрения.
(тонкие идеологические различия не убеждают "упертых". я проверял. они их просто не понимают, не хотят, аргумент один "но ведь работает же. так почему же он не подходит?", а другой тоже работает, но к нему тот же аргумент у них почемуто "не катит"...)


 
Германн ©   (2007-12-13 01:18) [53]


> sniknik ©   (13.12.07 00:56) [52]

О! Теперь и я знаю почему совет использовать TADOQuery есть BadTips.
А заглянув в ADODB.pas понял и про TADOTable.

P.S. Раньше как-то недосуг было заняться этими вопросами.
Правда и сейчас недосуг, но раз уж в форуме увидел что-то, то...
:)


 
Palladin ©   (2007-12-13 18:00) [54]


> sniknik ©   (13.12.07 00:56) [52]

под "упертыми" я подразумеваюсь? :) я не упертый, мне им удобней пользоваться... в основном большинстве случаев я им пользуюсь только для чтения, в другом меньшинстве случаев для вставки или обновления... разницы в быстродействии - нет... религиозные убеждения меня не убеждают... никогда не писал и не собираюсь писать приложения на основе DB контролов... ну а если не видно разницы, то зачем делать больше телодвижений при кодировании?


 
Palladin ©   (2007-12-13 18:09) [55]


> sniknik ©

если, конечно, это хоть немножко смягчит твой правденый гнев, то могу сказать, что при разработке ASP приложений я пользуюсь Native объектами ADO и ADOX :)



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

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

Наверх




Память: 0.59 MB
Время: 0.018 c
11-1168193605
Ned
2007-01-07 21:13
2008.01.13
Установка KolRas в Delphi 7


15-1197011581
TUser
2007-12-07 10:13
2008.01.13
ICQ-рассылки


15-1197006269
Александр Семак
2007-12-07 08:44
2008.01.13
Видимость реализации установленных компонентов


2-1197573823
pathfinder
2007-12-13 22:23
2008.01.13
Обмен данными между процессами.


11-1182516150
Nikfel
2007-06-22 16:42
2008.01.13
Алгоритм перебора символов.