Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Быстродействие? / 13 сообщений из 13, страница 1 из 1
24.01.2005, 14:48
    #32880206
Pril
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Быстродействие?
Здравствуйте!
Вопрос к специалистам в ADO.
После перевода проекта с DAO на ADO, как всегда в последнюю очередь, встал вопрос быстродействия, оказалось, что тот же набор действий выполняется В ШЕСТЬ РАЗ ДОЛЬШЕ!!! Я конечно ожидал ухудшения быстродействия скажем раза в два, но такой результат вызвал у меня сомнения в правильности написания кода. В кратце задача такова: есть достаточно большой кусок данных (порядка 1000 записей), которые требуется сохранить, есть Recordset, для каждой записи производится поиск, по результатам которого запись либо добавляется, либо редактируется. Поиск всегда по одному полю, а вот условий может быть несколько, в связи с этим есть две ветки поиска:
1 - простой вариант, одно условие, используется метод Find
2 - вариант посложнее, от двух до трех условий, используется свойство Filter
Эксперименты показали, что 90% времени тратится именно на поиск.
Подскажите пожалуйста какие есть пути ускорения поиска. Заранее благодарен за помощь.
...
Рейтинг: 0 / 0
24.01.2005, 15:02
    #32880260
Tracer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Быстродействие?
Путь один - переписать всё на SQL
...
Рейтинг: 0 / 0
24.01.2005, 15:12
    #32880304
Guest?
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Быстродействие?
однозначно SQL ..
...
Рейтинг: 0 / 0
24.01.2005, 15:37
    #32880396
Pril
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Быстродействие?
TracerПуть один - переписать всё на SQL
То есть для обработки каждой записи заново открывать Recordset на основе нового SQL запроса, содержащего условие для этой записи? Или я не правильно понял?
...
Рейтинг: 0 / 0
24.01.2005, 17:29
    #32880798
Tracer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Быстродействие?
авторТо есть для обработки каждой записи заново открывать Recordset на основе нового SQL запроса, содержащего условие для этой записи? Или я не правильно понял?

Всё зависит от условий задачи. В общем случае для обработки ( update ? )
записи нужно вызвать Connection.Execute( "update table set ...." .... )
Т.е. не пользоваться ADO-шными методами Find, Update и т.д., а вызывать соответствующий SQL код
...
Рейтинг: 0 / 0
24.01.2005, 22:35
    #32881225
Lelikk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Быстродействие?
Pril TracerПуть один - переписать всё на SQL
То есть для обработки каждой записи заново открывать Recordset на основе нового SQL запроса, содержащего условие для этой записи? Или я не правильно понял?

Составить такой запрос, чтобы туда попадали все нужные записи
...
Рейтинг: 0 / 0
26.01.2005, 13:19
    #32884510
Pril
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Быстродействие?
TracerВсё зависит от условий задачи. В общем случае для обработки ( update ? )
записи нужно вызвать Connection.Execute( "update table set ...." .... )
Т.е. не пользоваться ADO-шными методами Find, Update и т.д., а вызывать соответствующий SQL код
Если Вас не затруднит не могли бы Вы написать пример SQL запроса для решения такой задачи, а то я что-то до конца не понимаю как это сделать. Вот условия:
Есть база данных и в ней таблица Table1, в таблице поля A, B, C, D, поле A типа ДатаВремя, остальные не важно. В памяти программы есть четыре переменные a, b, c, d по типу данных соответствующие полям таблицы. Нужно произвести поиск в таблице по полю A, по результатам которого выполнить одно из трех действий:
1) Если в таблице нет ни одной записи, в которой год, месяц, день и час из поля A равны соответственно году, месяцу, дню и часу из переменной a, то добавить в таблицу запись, поля которой заполнить значениями переменных.
2) Если в таблице есть хотябы одна запись, в которой год, месяц, день и час из поля A равны соответственно году, месяцу, дню и часу из переменной a, и при этом время в минутах и секундах из поля A меньше или равно времени в минутах и секундах из переменной a, то редактировать такую запись, заменив значения всех полей значениями переменных.
3) Если в таблице есть хотябы одна запись, в которой год, месяц, день и час из поля A равны соответственно году, месяцу, дню и часу из переменной a, и при этом время в минутах и секундах из поля A больше времени в минутах и секундах из переменной a, то ничего не делать.

И еще, может быть кто-нибудь подскажет где найти подробную информацию по различным инструкциям языка SQL.
...
Рейтинг: 0 / 0
26.01.2005, 14:16
    #32884747
Guest?
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Быстродействие?
а если найдутся больше чем 1 запись ?
в SQL я не так сильен .. мог бы написать по результатам полученным ;)
но думаю тут найдутся такие кто умеет ..
если никого не будеть .. посмотрим ..
...
Рейтинг: 0 / 0
27.01.2005, 10:27
    #32886305
Pril
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Быстродействие?
Guest?а если найдутся больше чем 1 запись ?
в SQL я не так сильен .. мог бы написать по результатам полученным ;)
но думаю тут найдутся такие кто умеет ..
если никого не будеть .. посмотрим ..
Вообще говоря этот алгоритм как раз и предназначен для того чтобы избежать дублирования, поэтому во всех случаях работать надо с первой найденной записью.
Тут как раз в том и фокус, что надо на SQL написать, хотя я пока не понимаю как это сделать.
...
Рейтинг: 0 / 0
27.01.2005, 11:47
    #32886594
Guest?
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Быстродействие?
как ни крути тебе нужно полученные данные отработать ;)
но если у тебя нету СУБД а просто таблицы юзаеш тогда точно одним запросом не получится (ИМХО - по моему такого запроса составить нету возможности - но все же я не так хорошо знаю SQL))
если есть СУБД - то ХП какая то там упростить все вопросы ..
но каково будет это ХП - еще не знаю ;)
...
Рейтинг: 0 / 0
27.01.2005, 13:11
    #32886856
13th_apostle
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Быстродействие?
1) Если в таблице нет ни одной записи, в которой год, ме...ать
потребуются, imho, только 2 запроса (при условии, что поле A.a - ключевое):
Код: plaintext
1.
update table A, B, C, D set A.a = varA, B.b = varB, C.c = varC, D.d = varD where  date(A.a) = date(varA) and hour(A.a) = hour(varA) and time(A.a) < time (varA)
insert into A, B, C, D (A.a, B.b, C.c, D.d) values (varA, VarB, varC, VarD)
т.о., если данные удовл. 1му условию, то они update; если нет и при этом в поле A.a нет значения = varA, то insert. иначе никаких действий не производится. year(), date() и hour() -ф-ции, к-рые я придумал и к-рым 100% должен быть аналог в sql.
n.b. человеку свойственно ошибаться, я не исключение =)
...
Рейтинг: 0 / 0
27.01.2005, 15:47
    #32887434
Pril
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Быстродействие?
13th_apostle
потребуются, imho, только 2 запроса (при условии, что поле A.a - ключевое):
Код: plaintext
1.
update table A, B, C, D set A.a = varA, B.b = varB, C.c = varC, D.d = varD where  date(A.a) = date(varA) and hour(A.a) = hour(varA) and time(A.a) < time (varA)
insert into A, B, C, D (A.a, B.b, C.c, D.d) values (varA, VarB, varC, VarD)
т.о., если данные удовл. 1му условию, то они update; если нет и при этом в поле A.a нет значения = varA, то insert. иначе никаких действий не производится. year(), date() и hour() -ф-ции, к-рые я придумал и к-рым 100% должен быть аналог в sql.
n.b. человеку свойственно ошибаться, я не исключение =)
Похоже я не очень четко описал условия, это не важно, но для упрощения я поправлю предложенные Вами запросы:
Код: plaintext
1.
update table Table1 set A = a, B = b, C = c, D = d where  date(A) = date(a) and hour(A) = hour(a) and time(A) < time (a)
insert into Table1 (A, B, C, D) values (a, b, c, d)
Идея хороша, однако два вопроса:
1. В случае, если в таблице была запись в которой date(A) = date(a) and hour(A) = hour(a) and time(A) > time(a), то update выполнен не будет, а insert будет выполнен, последнее не правильно.
2. В случае если update выполнен, при выполнении insert произойдет ошибка, так вот вопрос в том как субд (заранее не известно какая) среагирует на такую ошибку. Например MSAccess создает таблицу "Ошибки Вставки" и пихает в нее все невставленные записи, количество таких невставленных записей может быть очень существенным вследствии чего база будет распухать.
...
Рейтинг: 0 / 0
27.01.2005, 16:01
    #32887479
13th_apostle
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Быстродействие?
1. В случае, если в таблице была запись в которой date(A) = date(a) and hour(A) = hour(a) and time(A) > time(a), то update выполнен не будет, а insert будет выполнен, последнее не правильно.
верно; можно сделать sql-запрос типа:
Код: plaintext
select A.a from A where date(A.a) = date(a) and and hour(A.a) = hour(a) and time(A.a) <= time(a)
по результирующей табл. делаем query:
Код: plaintext
1.
update table A, B, C, D, answer set A.a = varA, B.b = varB, C.c = varC, D.d = varD where  date(A.a) = date(answer.a) and hour(A.a) = hour(answer.a) and time(A.a) < time (answer.a)
insert into A, B, C, D (A.a, B.b, C.c, D.d) values (answer.a, VarB, varC, VarD)
что-то вроде того =)
2. В случае если ...будет распухать.
на самом деле на это и был расчет =)). т.е. ставим блок
Код: plaintext
1.
try{}
catch{}
на случай ошибки вставки и обрабатываем ее, как надо: очищаем табл. keyviolation, если такая есть, или не обрабатываем, если нет =). самое главное, что запись будет добавлена только тогда, когда надо =)
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Быстродействие? / 13 сообщений из 13, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]