|
|
|
Что быстрее?
|
|||
|---|---|---|---|
|
#18+
Использую АDO. Что быстрее выполнится при обновлении данных SQL Запрос , или же метод Update(). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.01.2007, 20:01 |
|
||
|
Что быстрее?
|
|||
|---|---|---|---|
|
#18+
Вообще-то, SQL запрос через ADOCommand->Execute() выполнится быстрее чем ADORecordset->Update(). Потому что Update() пробежится по рекордсету лежащему в памяти, для каждой изменной строки сформирует SQL запрос и пошлет его на сервер через Execute(). Но сравнивать скорость этих двух методов все равно бессмысленно. Торомзить в этом месте будет не твоя программа, а сервер БД. Особенно если таблица большая, на ней стоят кривые индексы и "where" для sql запроса в Execute() или описание ключевых полей в рекордсете для Update() сделаны неправильно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.01.2007, 20:59 |
|
||
|
Что быстрее?
|
|||
|---|---|---|---|
|
#18+
Меня это интересует чисто теоретически. Я стою перед выбором. Либо самому создавать запрос и отсылать его базе данных через Execute() или воспользоваться Update. Я так понял Execute быстрее. Но вот фраза " Особенно если таблица большая, на ней стоят кривые индексы и "where" для sql запроса в Execute() " мне немного не понятна. Что значит кривые индексы и "where" и как сделать, чтобы они не были кривыми? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2007, 18:30 |
|
||
|
Что быстрее?
|
|||
|---|---|---|---|
|
#18+
HomosumМеня это интересует чисто теоретически. Я стою перед выбором. Либо самому создавать запрос и отсылать его базе данных через Execute() или воспользоваться Update.Как хочешь... как тебе удобнее, так и делай. Лично я Update() не использую совсем, не доверяю ему :) Не, я знаю что он сделает все что нужно, но лично я предпочитаю всегда контролировать какой sql запрос уходит в базу. Считайте это религиозными воззрениями :) HomosumЯ так понял Execute быстрее.На исчезающе малую долю миллисекунды... HomosumНо вот фраза " Особенно если таблица большая, на ней стоят кривые индексы и "where" для sql запроса в Execute() " мне немного не понятна. Что значит кривые индексы и "where" и как сделать, чтобы они не были кривыми?Это уже тема не для этого форума. Ну ладно, поофтопичу немного :) Например у тебя есть таблица со списком телефонных звонков, звонок происходит в какой-то день и час. Можно хранить это в одном поле типа datetime, а можно хранить в паре полей типов date и time. Сделаем по этим полям индекс. Теперь если мы хотим получить список всех звонков за определенный день, то надо делать запросы такого вида: select * from t where date(CallDateTime)=:yesterday // для случая с одним полем select * from t where CallDate=:yesterday // для случая с двумя полями. В первом случае индекс созданный по полю CallDateTime не будет использован, потому что в условии стоит функция от поля - это всего лишь обрезка временной части поля, но все равно это функция. Сервер бд будет делать полный скан таблицы, вычисляя функцию для каждой записи и сравнивая результат с константой. А в случае двух полей и индекса по ним, уже будет использован индекс, потому что константа yesterday сравнивается со значением точно равным значениям внутри индекса. Вторая засада в неявной конвертации, когда константа не того типа что поле с котором идет сравнение. Например поле типа date, а константа типа varchar. В этом случае сервер попытается привести обе стороны условия (и поле и константу) к общему знаменателю, возможно он догадается превратить константу из varchar в date перед тем как делать запрос, а может и не догадается и будет превращать поле date в varchar чтобы сравнить с varchar константой. В первом случае выборка использует индекс, во втором - появляется неявный вызов формулы и индекс не используется. Это уже зависит от сервера БД, и большинство современных серверов достаточно умны, но все равно подобные приколы надо всегда учитывать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2007, 21:27 |
|
||
|
Что быстрее?
|
|||
|---|---|---|---|
|
#18+
White Owl Как хочешь... как тебе удобнее, так и делай. Лично я Update() не использую совсем, не доверяю ему :) Не, я знаю что он сделает все что нужно, но лично я предпочитаю всегда контролировать какой sql запрос уходит в базу. Считайте это религиозными воззрениями :) Согласен с Вашими религиозными воззрениями :) и тоже предпочитаю видеть, что изменяет мои данные и каким образом, тем более есть доп. возможность поучиться SQL White OwlНа исчезающе малую долю миллисекунды... В вот это как раз и очень важный фактор. Я собираюсь писать приложение для работы с нейронными сетями (научная работа), так там огромное количество итераций и миллисекундами принебрегать нельзя. White OwlЭто уже тема не для этого форума. Ну ладно, поофтопичу немного :) Например у тебя есть таблица... Спасибо большое!!! Я еще очень много не знаю, никогда бы не придал значение функции в вашем примере. Побольше бы так оффтопили. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.01.2007, 00:49 |
|
||
|
Что быстрее?
|
|||
|---|---|---|---|
|
#18+
HomosumВ вот это как раз и очень важный фактор. Я собираюсь писать приложение для работы с нейронными сетями (научная работа), так там огромное количество итераций и миллисекундами принебрегать нельзя. Может просто пересмотреть работу. возложить работу на клиента, а результаты уже в БД. хотя .. я мало что понимаю в этом :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.01.2007, 09:34 |
|
||
|
Что быстрее?
|
|||
|---|---|---|---|
|
#18+
JibSkeart HomosumВ вот это как раз и очень важный фактор. Я собираюсь писать приложение для работы с нейронными сетями (научная работа), так там огромное количество итераций и миллисекундами принебрегать нельзя. Может просто пересмотреть работу. возложить работу на клиента, а результаты уже в БД. хотя .. я мало что понимаю в этом :) Вы скромничаете:). Видно Вы понимаете. Действительно в большинстве случае необходимо возлагать работу на клиента и работу клиента мне тоже надо серьезно продумывать. Но в моей научной работе есть важный момент - очень обширная нейронная сеть со сложной топологией. Просто невозможно будет загрузить всю информацию в память. Причем сразу не известно какой кусок нейронной сети (какое ядро) может понадобиться в тот или иной момент. Поэтому обращение к базе данных будет очень интенсивным. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.01.2007, 10:58 |
|
||
|
Что быстрее?
|
|||
|---|---|---|---|
|
#18+
Homosum JibSkeart HomosumВ вот это как раз и очень важный фактор. Я собираюсь писать приложение для работы с нейронными сетями (научная работа), так там огромное количество итераций и миллисекундами принебрегать нельзя. Может просто пересмотреть работу. возложить работу на клиента, а результаты уже в БД. хотя .. я мало что понимаю в этом :) Вы скромничаете:). Видно Вы понимаете. Действительно в большинстве случае необходимо возлагать работу на клиента и работу клиента мне тоже надо серьезно продумывать. Но в моей научной работе есть важный момент - очень обширная нейронная сеть со сложной топологией. Просто невозможно будет загрузить всю информацию в память. Причем сразу не известно какой кусок нейронной сети (какое ядро) может понадобиться в тот или иной момент. Поэтому обращение к базе данных будет очень интенсивным. Я имел ввиду про нейронные сети. да и не видя задачу в целом , трудно что либо сказать. :) я просто предположил. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.01.2007, 13:11 |
|
||
|
Что быстрее?
|
|||
|---|---|---|---|
|
#18+
Хочу сказать о ещё одной возможности быстрой записи в БД. Пусть нужно единовременно записать в БД много записей (ну хотя бы 1000). Если писать их по одной (что Update(), что Execute()), то это будет (относительно) долго. Можно записать данные в dbf-файл, а затем из него переписать данные в БД одним Execute(). Разница в скорости -- на порядок (десятичный :) ). //-------------------------------------- Недостатки этого метода: 1) БД должна или сама понимать, что такое dbf (как в случае с Access), или уметь обрабатывать в SQL-запросе таблицы из разных источников ODBC; 2) dbf-файл надо формировать или вручную, т.е. знать его физический формат, либо с помощью dbf-драйвера (теоретически м.б. немного медленнее); 3) лично я не умею писать в dbf мемо-поля, хотя в принципе это возможно. Наверно, вместо dbf можно использовать текстовый формат и текстовый ODBC-драйвер, тогда проблема 2) отпадает, а 3) осложняется. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.01.2007, 13:43 |
|
||
|
Что быстрее?
|
|||
|---|---|---|---|
|
#18+
JibSkeart Я имел ввиду про нейронные сети. да и не видя задачу в целом , трудно что либо сказать. :) я просто предположил. Я тоже:) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.01.2007, 22:54 |
|
||
|
Что быстрее?
|
|||
|---|---|---|---|
|
#18+
Ой ВэйХочу сказать о ещё одной возможности быстрой записи в БД. Пусть нужно единовременно записать в БД много записей (ну хотя бы 1000). Если писать их по одной (что Update(), что Execute()), то это будет (относительно) долго. Можно записать данные в dbf-файл, а затем из него переписать данные в БД одним Execute(). Разница в скорости -- на порядок (десятичный :) ). //-------------------------------------- Недостатки этого метода: 1) БД должна или сама понимать, что такое dbf (как в случае с Access), или уметь обрабатывать в SQL-запросе таблицы из разных источников ODBC; 2) dbf-файл надо формировать или вручную, т.е. знать его физический формат, либо с помощью dbf-драйвера (теоретически м.б. немного медленнее); 3) лично я не умею писать в dbf мемо-поля, хотя в принципе это возможно. Наверно, вместо dbf можно использовать текстовый формат и текстовый ODBC-драйвер, тогда проблема 2) отпадает, а 3) осложняется. Очень интересный метод! Особенно для БД, которые преимущественно содержат числа или полностью из них состоят (В случае с нейронными сетями это как раз таки так). Тогда проблема 3 как я понял совсем отпадает. А какие системы кроме Access еще понимают dbf? Можно ли это как либо автоматизировать? Как Вы думаете? А перспективы действительно очень интересные! Особенно для ядерных нейронных сетей. Когда ядро обучается изменяется состояние очень многих весов - связей между нейронами (как раз тех элементов, которые храняться в БД). И основная задача состоит в обновлении этих весов. Если применить эту технологию, то можно не последовательно обновлять примерно 1000-3000 записей, а сделать это одним махом! Буду думать дальше! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.01.2007, 23:00 |
|
||
|
Что быстрее?
|
|||
|---|---|---|---|
|
#18+
HomosumА какие системы кроме Access еще понимают dbf?Да почти все... А если не умеют с dbf, умеют с каким-нибудь другим примитивным форматом работать. CSV, TSV, BCP или даже TXT с полями фиксированой ширины. Этот подход действительно даст некоторый выигрыш во времени, но не значительный. Серверу БД все равно надо будет найти место в базе под новые записи или найти старую запись для обновления, да обновление индексов... Выигрыш будет за счет того, что данные посылаемые от клиента через нормальный коннект обзательно регестрируются в логе базы, а данные загружаемые сервором из локального файла нет (но это тоже зависит от сервера).. Но подход с пакетным обновлением из внешнего файла имеет один серьезный недостаток - это может делать только сам сервер. Клиент командует серверу прочитать dbf - сервер читает, да. Но это значит что клиент во первых уже не контролирует процесс чтения. А во вторых, dbf должен быть доступен серверу, то есть либо физически лежать на машине с сервером, либо сервер должен будет по сети подмапировать диск клиентской машины. А вообще-то, уже давно пора идит в соседний форум "Сравнения БД" или как-то так... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2007, 00:26 |
|
||
|
Что быстрее?
|
|||
|---|---|---|---|
|
#18+
White Owl А вообще-то, уже давно пора идит в соседний форум "Сравнения БД" или как-то так... Не согласен. Думаю здесь еще много нового и интересного можно выкачать. Ведь база данных это только верхушка айсберга, а там еще много задач сопутствующих. Вот например, предыдущий механизм обновления данных, даже если даст небольшое преимущество, в рамках работы всей системы даст большой выигрыш. Ведь моя нейронная сеть будет состоять приблизительно из 300-500 ядер (начальный уровень). Каждое ядро это примерно 110 нейронов. Между ними существуют связи. Из 300 ядер на каждом уровне обучения может обновляться до половины, а то и больше. И это будет делаться в автоматическом режиме. Т.е. чем больше будет оптимизация на любом уровне (будь то БД или же сами вычисления) тем быстрее в общем будет работать система. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2007, 08:44 |
|
||
|
Что быстрее?
|
|||
|---|---|---|---|
|
#18+
White OwlВыигрыш будет за счет того, что данные посылаемые от клиента через нормальный коннект обзательно регестрируются в логе базы, а данные загружаемые сервором из локального файла нет (но это тоже зависит от сервера).. Что значит зависит от сервера? Какие сервера БД для этого подойдут? Или может это механизм настраиваемый в сервере? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2007, 08:47 |
|
||
|
Что быстрее?
|
|||
|---|---|---|---|
|
#18+
HomosumВедь моя нейронная сеть будет состоять приблизительно из 300-500 ядер (начальный уровень). Каждое ядро это примерно 110 нейронов. Между ними существуют связи. Из 300 ядер на каждом уровне обучения может обновляться до половины, а то и больше. И это будет делаться в автоматическом режиме. Т.е. чем больше будет оптимизация на любом уровне (будь то БД или же сами вычисления) тем быстрее в общем будет работать система.Ну хорошо, начни с того, что формализуй структуру данных. Хранить и модифицировать тебе нужно только связи (в смысле веса синапсов) а ядра сами по себе никаких данных между отдельными запусками не хранят, не должны хранить по идее :) Значит представляем ядра в качестве списка стуркур типа Код: plaintext 1. 2. 3. Код: plaintext 1. 2. 3. Ну а потом, делаешь выборку всех синапсов у которых аксон равен нулю, кидаешь в них какое-то значение. Для всех синапсов обработаных на данном шаге, выбираешь все ядра с номером указаном в дендрите, заменяешь значение в ядре. Потом для всех ядер выбираешь синапсы в которых аксоны равняются номерам обработаных ядер и продолжаешь по кругу, пока на очередном шаге не доберешься до синапсов с нулевыми дендритами. Собственно говоря, для этой задачи между запусками достаточно хранить всего-лишь список синапсов, а для поиска нужного синпаса или ядра во время работы достаточно индекса (списка ядер сортированного по номерам ядер и списка синапсов сортированого по номерам аксонов и дендритов) в памяти. База данных тут вообще не нужна. Но если хочется взять что-то уже существующее и не изобретать собственную библиотеку работы с сортироваными списками, то Berkeley DB будет практически идеальным решением. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.01.2007, 18:02 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=34253229&tid=2029668]: |
0ms |
get settings: |
9ms |
get forum list: |
21ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
191ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
57ms |
get tp. blocked users: |
1ms |
| others: | 251ms |
| total: | 551ms |

| 0 / 0 |
