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

Вниз

Ускорение проверки на существование записи в таблице.   Найти похожие ветки 

 
Карелин Артем ©   (2007-01-10 09:23) [0]

Ситуация такая - в ексельных файлах есть под сотню тысяч записей. Каждую запись надо вытащить и проверить, есть ли соответствующая ей запись на сиквельном сервере.
Сейчас приблизительно следующее:
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;

Прошу не пинать особо, с дельфи давно последний раз работал.


 
Карелин Артем ©   (2007-01-10 09:25) [1]

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


 
ЮЮ ©   (2007-01-10 09:44) [2]

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;


 
Ega23 ©   (2007-01-10 09:45) [3]

Использовать параметры; запрос "препарировать"; сам запрос переписать на exists (хотя это спорное); TADOQuery заменить на TADODataSet.

Это что сходу в глаза бросилось.

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


 
Виталий Панасенко ©   (2007-01-10 10:01) [4]

А если книмгу Excel Открыть как таблицу, а не работаь через OLE ? Тоже АДО используя ?


 
stone ©   (2007-01-10 10:27) [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:49) [6]


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


> stone ©   (10.01.07 10:27) [5]

в ексельных файлах.
В дельфийском коде еще раскрашивать ячейки надо будет. И еще много чего. Это упрощенные наброски приведены.
Хотя идея сама хороша


 
evvcom ©   (2007-01-10 10:54) [7]

> [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-объекту способ раннего связывания, а не позднего.


 
Anatoly Podgoretsky ©   (2007-01-10 12:58) [8]

> stone  (10.01.2007 10:27:05)  [5]

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

А версия Экселя не озвучено, а без этого это только предположение.


 
Sergey Masloff   (2007-01-10 22:57) [9]

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



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

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

Наверх




Память: 0.49 MB
Время: 0.044 c
2-1173121140
Riply
2007-03-05 21:59
2007.04.01
Сравнение строк.


2-1173637277
eee
2007-03-11 21:21
2007.04.01
Деление


2-1173663124
Andrewww
2007-03-12 04:32
2007.04.01
Позиция в строке


15-1173150683
Slider007
2007-03-06 06:11
2007.04.01
С днем рождения ! 6 марта


15-1173164981
Чапаев
2007-03-06 10:09
2007.04.01
[гы] В Калифорнии победил ODF