Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2007.04.01;
Скачать: [xml.tar.bz2];

Вниз

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

 
Карелин Артем ©   (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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.045 c
11-1150844501
parovoZZ
2006-06-21 03:01
2007.04.01
Бросил на GRushPanel KolLabel...


6-1161324846
frEE)styler
2006-10-20 10:14
2007.04.01
подключение через ADO к mssql server 2000


15-1173157995
eXPell
2007-03-06 08:13
2007.04.01
Подскажите софт, пожалуйста


2-1173763810
ANikolay
2007-03-13 08:30
2007.04.01
Использование DLL... вылетает ошибка


15-1173035989
palva
2007-03-04 22:19
2007.04.01
Борис Стругацкий в качестве политика





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский