Текущий архив: 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