Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Ускорение проверки на существование записи в таблице. [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]

Вопрос следующий: как минимизировать время поиска нужной записи путем оптимизации дельфийского кода?


Наверх

Титульная страница Поиск, карта сайта Написать письмо