|
|
|
Быстродействие?
|
|||
|---|---|---|---|
|
#18+
Здравствуйте! Вопрос к специалистам в ADO. После перевода проекта с DAO на ADO, как всегда в последнюю очередь, встал вопрос быстродействия, оказалось, что тот же набор действий выполняется В ШЕСТЬ РАЗ ДОЛЬШЕ!!! Я конечно ожидал ухудшения быстродействия скажем раза в два, но такой результат вызвал у меня сомнения в правильности написания кода. В кратце задача такова: есть достаточно большой кусок данных (порядка 1000 записей), которые требуется сохранить, есть Recordset, для каждой записи производится поиск, по результатам которого запись либо добавляется, либо редактируется. Поиск всегда по одному полю, а вот условий может быть несколько, в связи с этим есть две ветки поиска: 1 - простой вариант, одно условие, используется метод Find 2 - вариант посложнее, от двух до трех условий, используется свойство Filter Эксперименты показали, что 90% времени тратится именно на поиск. Подскажите пожалуйста какие есть пути ускорения поиска. Заранее благодарен за помощь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2005, 14:48 |
|
||
|
Быстродействие?
|
|||
|---|---|---|---|
|
#18+
Путь один - переписать всё на SQL ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2005, 15:02 |
|
||
|
Быстродействие?
|
|||
|---|---|---|---|
|
#18+
TracerПуть один - переписать всё на SQL То есть для обработки каждой записи заново открывать Recordset на основе нового SQL запроса, содержащего условие для этой записи? Или я не правильно понял? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2005, 15:37 |
|
||
|
Быстродействие?
|
|||
|---|---|---|---|
|
#18+
авторТо есть для обработки каждой записи заново открывать Recordset на основе нового SQL запроса, содержащего условие для этой записи? Или я не правильно понял? Всё зависит от условий задачи. В общем случае для обработки ( update ? ) записи нужно вызвать Connection.Execute( "update table set ...." .... ) Т.е. не пользоваться ADO-шными методами Find, Update и т.д., а вызывать соответствующий SQL код ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2005, 17:29 |
|
||
|
Быстродействие?
|
|||
|---|---|---|---|
|
#18+
Pril TracerПуть один - переписать всё на SQL То есть для обработки каждой записи заново открывать Recordset на основе нового SQL запроса, содержащего условие для этой записи? Или я не правильно понял? Составить такой запрос, чтобы туда попадали все нужные записи ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2005, 22:35 |
|
||
|
Быстродействие?
|
|||
|---|---|---|---|
|
#18+
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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.01.2005, 13:19 |
|
||
|
Быстродействие?
|
|||
|---|---|---|---|
|
#18+
а если найдутся больше чем 1 запись ? в SQL я не так сильен .. мог бы написать по результатам полученным ;) но думаю тут найдутся такие кто умеет .. если никого не будеть .. посмотрим .. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.01.2005, 14:16 |
|
||
|
Быстродействие?
|
|||
|---|---|---|---|
|
#18+
Guest?а если найдутся больше чем 1 запись ? в SQL я не так сильен .. мог бы написать по результатам полученным ;) но думаю тут найдутся такие кто умеет .. если никого не будеть .. посмотрим .. Вообще говоря этот алгоритм как раз и предназначен для того чтобы избежать дублирования, поэтому во всех случаях работать надо с первой найденной записью. Тут как раз в том и фокус, что надо на SQL написать, хотя я пока не понимаю как это сделать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.01.2005, 10:27 |
|
||
|
Быстродействие?
|
|||
|---|---|---|---|
|
#18+
как ни крути тебе нужно полученные данные отработать ;) но если у тебя нету СУБД а просто таблицы юзаеш тогда точно одним запросом не получится (ИМХО - по моему такого запроса составить нету возможности - но все же я не так хорошо знаю SQL)) если есть СУБД - то ХП какая то там упростить все вопросы .. но каково будет это ХП - еще не знаю ;) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.01.2005, 11:47 |
|
||
|
Быстродействие?
|
|||
|---|---|---|---|
|
#18+
1) Если в таблице нет ни одной записи, в которой год, ме...ать потребуются, imho, только 2 запроса (при условии, что поле A.a - ключевое): Код: plaintext 1. n.b. человеку свойственно ошибаться, я не исключение =) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.01.2005, 13:11 |
|
||
|
Быстродействие?
|
|||
|---|---|---|---|
|
#18+
13th_apostle потребуются, imho, только 2 запроса (при условии, что поле A.a - ключевое): Код: plaintext 1. n.b. человеку свойственно ошибаться, я не исключение =) Похоже я не очень четко описал условия, это не важно, но для упрощения я поправлю предложенные Вами запросы: Код: plaintext 1. 1. В случае, если в таблице была запись в которой date(A) = date(a) and hour(A) = hour(a) and time(A) > time(a), то update выполнен не будет, а insert будет выполнен, последнее не правильно. 2. В случае если update выполнен, при выполнении insert произойдет ошибка, так вот вопрос в том как субд (заранее не известно какая) среагирует на такую ошибку. Например MSAccess создает таблицу "Ошибки Вставки" и пихает в нее все невставленные записи, количество таких невставленных записей может быть очень существенным вследствии чего база будет распухать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.01.2005, 15:47 |
|
||
|
Быстродействие?
|
|||
|---|---|---|---|
|
#18+
1. В случае, если в таблице была запись в которой date(A) = date(a) and hour(A) = hour(a) and time(A) > time(a), то update выполнен не будет, а insert будет выполнен, последнее не правильно. верно; можно сделать sql-запрос типа: Код: plaintext Код: plaintext 1. 2. В случае если ...будет распухать. на самом деле на это и был расчет =)). т.е. ставим блок Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.01.2005, 16:01 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=32880206&tid=2033785]: |
0ms |
get settings: |
10ms |
get forum list: |
19ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
87ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
62ms |
get tp. blocked users: |
1ms |
| others: | 228ms |
| total: | 428ms |

| 0 / 0 |
