![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Ускорение проверки на существование записи в таблице. [D7, MSSQL]
Карелин Артем © (2007-01-10 09:23:00)Ситуация такая - в ексельных файлах есть под сотню тысяч записей. Каждую запись надо вытащить и проверить, есть ли соответствующая ей запись на сиквельном сервере.
Сейчас приблизительно следующее:
const
QueryFindText:string = 'select PolicyID from dbo.policy where dbo.policy.nvcPolicyNum = @num';
for i:=1 to RowsCount do
begin
s:=Sheet.Cells.Item[i,1].Value;
ADOQuery1.SQL.Text:=StringReplace(QueryFindText,'@num',AnsiQuotedStr(s,''''),[]) ;
ADOQuery1.Open;
if ADOQuery1.IsEmpty then
Sheet.Cells.Item[i,1].Interior.ColorIndex:= 5;
ADOQuery1.Close;
end;
Прошу не пинать особо, с дельфи давно последний раз работал.
Sergey Masloff (2007-01-10 22:57:00) [1]Я бы во временную таблицу согнал и закрытым джойном соединил. Возможно суммарно будет быстрее чем соединение с внешней таблицей в самом екселе. Ячейки я б тоже на сервере красил. Ну в смысле в резалтсете признак каким цветом красить а на гриде кодик в пару строчек универсальной раскраски.
Anatoly Podgoretsky (2007-01-10 12:58:00) [2]> stone (10.01.2007 10:27:05) [5]
> хмм... мне всегда казалось, что эксель хранит чуть более 65 тыс.
А версия Экселя не озвучено, а без этого это только предположение.
evvcom (2007-01-10 10:54:00) [3]> [5] stone © (10.01.07 10:27)
> что эксель хранит чуть более 65 тыс.
чуть - это еще полтыщи, а точнее 536 :)
Итого 65536 = 2^16, но это на лист, а на нескольких может и больше, а если как у автора "в ексельн ыхфайл ах", то количество ограничивается только размерами памяти и производительностью компа :)
> [0] Карелин Артем © (10.01.07 09:23)
Я BOL не читал, но, видимо, в [5] лучший совет даден. А так по поводу того, как сделано в [0], кроме сказанного про параметры и Prepare, могу добавить, что на OLE-шном построчном чтении тоже теряется много времени. Есть вариант чтения/записи данных через VarArray сразу всего диапазона. И даже если необходимо в цикле читать разные диапазоны и прочее, и время опять же хотелось бы сократить, можно использовать при обращении к COM-объекту способ раннего связывания, а не позднего.
Карелин Артем (2007-01-10 10:49:00) [4]
> хмм... мне всегда казалось, что эксель хранит чуть более
> 65 тыс.
> stone © (10.01.07 10:27) [5]
в ексельн ыхфайл ах.
В дельфийском коде еще раскрашивать ячейки надо будет. И еще много чего. Это упрощенные наброски приведены.
Хотя идея сама хороша
stone (2007-01-10 10:27:00) [5]
> Карелин Артем © (10.01.07 09:23)
> Ситуация такая - в ексельных файлах есть под сотню тысяч
> записей.
хмм... мне всегда казалось, что эксель хранит чуть более 65 тыс.
> Каждую запись надо вытащить и проверить, есть ли соответствующая
> ей запись на сиквельном сервере.
Вот что вещает на эту тему BOL
SELECT * FROM OpenDataSource( 'Microsoft.Jet.OLEDB.4.0',
'Data Source="c:\Finance\account.xls";User ID=Admin;Password=;Extended properties=Excel 5.0')...xactions
преобразовать этот запрос с использованием exists, полагаю, труда не составит
На дельфийский код уже ничего не остается, разве что Open :)
Виталий Панасенко (2007-01-10 10:01:00) [6]А если книмгу Excel Открыть как таблицу, а не работаь через OLE ? Тоже АДО используя ?
Ega23 (2007-01-10 09:45:00) [7]Использовать параметры; запрос "препарировать"; сам запрос переписать на exists (хотя это спорное); TADOQuery заменить на TADODataSet.
Это что сходу в глаза бросилось.
Также попробуй оценить время выполнения каждой из команд, увидишь, где потери больше всего.
ЮЮ (2007-01-10 09:44:00) [8]ADOQuery1.SQL.Text := 'select PolicyID from dbo.policy where dbo.policy.nvcPolicyNum = :num';
ADOQuery1.Prepare;
for i:=1 to RowsCount do
begin
s:=Sheet.Cells.Item[i,1].Value;
ADOQuery1.Close;
ADOQuery1.Parameters[0].Value := s;
ADOQuery1.Open;
if ADOQuery1.IsEmpty then
Sheet.Cells.Item[i,1].Interior.ColorIndex:= 5;
end;
Карелин Артем (2007-01-10 09:25:00) [9]Вопрос следующий: как минимизировать время поиска нужной записи путем оптимизации дельфийского кода?