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

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

Составить такой запрос, чтобы туда попадали все нужные записи
...
Рейтинг: 0 / 0
Быстродействие?
    #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
Быстродействие?
    #32884747
Guest?
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а если найдутся больше чем 1 запись ?
в SQL я не так сильен .. мог бы написать по результатам полученным ;)
но думаю тут найдутся такие кто умеет ..
если никого не будеть .. посмотрим ..
...
Рейтинг: 0 / 0
Быстродействие?
    #32886305
Pril
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Guest?а если найдутся больше чем 1 запись ?
в SQL я не так сильен .. мог бы написать по результатам полученным ;)
но думаю тут найдутся такие кто умеет ..
если никого не будеть .. посмотрим ..
Вообще говоря этот алгоритм как раз и предназначен для того чтобы избежать дублирования, поэтому во всех случаях работать надо с первой найденной записью.
Тут как раз в том и фокус, что надо на SQL написать, хотя я пока не понимаю как это сделать.
...
Рейтинг: 0 / 0
Быстродействие?
    #32886594
Guest?
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
как ни крути тебе нужно полученные данные отработать ;)
но если у тебя нету СУБД а просто таблицы юзаеш тогда точно одним запросом не получится (ИМХО - по моему такого запроса составить нету возможности - но все же я не так хорошо знаю SQL))
если есть СУБД - то ХП какая то там упростить все вопросы ..
но каково будет это ХП - еще не знаю ;)
...
Рейтинг: 0 / 0
Быстродействие?
    #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
Быстродействие?
    #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
Быстродействие?
    #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
13 сообщений из 13, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Быстродействие?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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