powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Что быстрее?
15 сообщений из 15, страница 1 из 1
Что быстрее?
    #34246876
Homosum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Использую АDO.
Что быстрее выполнится при обновлении данных SQL Запрос , или же метод Update().
...
Рейтинг: 0 / 0
Что быстрее?
    #34246996
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообще-то, SQL запрос через ADOCommand->Execute() выполнится быстрее чем ADORecordset->Update(). Потому что Update() пробежится по рекордсету лежащему в памяти, для каждой изменной строки сформирует SQL запрос и пошлет его на сервер через Execute().

Но сравнивать скорость этих двух методов все равно бессмысленно. Торомзить в этом месте будет не твоя программа, а сервер БД. Особенно если таблица большая, на ней стоят кривые индексы и "where" для sql запроса в Execute() или описание ключевых полей в рекордсете для Update() сделаны неправильно.
...
Рейтинг: 0 / 0
Что быстрее?
    #34249884
Homosum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Меня это интересует чисто теоретически. Я стою перед выбором. Либо самому создавать запрос и отсылать его базе данных через Execute() или воспользоваться Update.

Я так понял Execute быстрее.

Но вот фраза "
Особенно если таблица большая, на ней стоят кривые индексы и "where" для sql запроса в Execute() " мне немного не понятна. Что значит кривые индексы и "where" и как сделать, чтобы они не были кривыми?
...
Рейтинг: 0 / 0
Что быстрее?
    #34250183
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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 константой. В первом случае выборка использует индекс, во втором - появляется неявный вызов формулы и индекс не используется.
Это уже зависит от сервера БД, и большинство современных серверов достаточно умны, но все равно подобные приколы надо всегда учитывать.
...
Рейтинг: 0 / 0
Что быстрее?
    #34250344
Homosum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl
Как хочешь... как тебе удобнее, так и делай. Лично я Update() не использую совсем, не доверяю ему :) Не, я знаю что он сделает все что нужно, но лично я предпочитаю всегда контролировать какой sql запрос уходит в базу. Считайте это религиозными воззрениями :)

Согласен с Вашими религиозными воззрениями :) и тоже предпочитаю видеть, что изменяет мои данные и каким образом, тем более есть доп. возможность поучиться SQL

White OwlНа исчезающе малую долю миллисекунды...
В вот это как раз и очень важный фактор. Я собираюсь писать приложение для работы с нейронными сетями (научная работа), так там огромное количество итераций и миллисекундами принебрегать нельзя.

White OwlЭто уже тема не для этого форума. Ну ладно, поофтопичу немного :)
Например у тебя есть таблица...
Спасибо большое!!! Я еще очень много не знаю, никогда бы не придал значение функции в вашем примере. Побольше бы так оффтопили.
...
Рейтинг: 0 / 0
Что быстрее?
    #34250655
Фотография JibSkeart
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HomosumВ вот это как раз и очень важный фактор. Я собираюсь писать приложение для работы с нейронными сетями (научная работа), так там огромное количество итераций и миллисекундами принебрегать нельзя.

Может просто пересмотреть работу.
возложить работу на клиента, а результаты уже в БД.

хотя .. я мало что понимаю в этом :)
...
Рейтинг: 0 / 0
Что быстрее?
    #34250910
Homosum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JibSkeart HomosumВ вот это как раз и очень важный фактор. Я собираюсь писать приложение для работы с нейронными сетями (научная работа), так там огромное количество итераций и миллисекундами принебрегать нельзя.

Может просто пересмотреть работу.
возложить работу на клиента, а результаты уже в БД.

хотя .. я мало что понимаю в этом :)

Вы скромничаете:). Видно Вы понимаете. Действительно в большинстве случае необходимо возлагать работу на клиента и работу клиента мне тоже надо серьезно продумывать. Но в моей научной работе есть важный момент - очень обширная нейронная сеть со сложной топологией. Просто невозможно будет загрузить всю информацию в память. Причем сразу не известно какой кусок нейронной сети (какое ядро) может понадобиться в тот или иной момент. Поэтому обращение к базе данных будет очень интенсивным.
...
Рейтинг: 0 / 0
Что быстрее?
    #34251465
Фотография JibSkeart
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Homosum JibSkeart HomosumВ вот это как раз и очень важный фактор. Я собираюсь писать приложение для работы с нейронными сетями (научная работа), так там огромное количество итераций и миллисекундами принебрегать нельзя.

Может просто пересмотреть работу.
возложить работу на клиента, а результаты уже в БД.

хотя .. я мало что понимаю в этом :)

Вы скромничаете:). Видно Вы понимаете. Действительно в большинстве случае необходимо возлагать работу на клиента и работу клиента мне тоже надо серьезно продумывать. Но в моей научной работе есть важный момент - очень обширная нейронная сеть со сложной топологией. Просто невозможно будет загрузить всю информацию в память. Причем сразу не известно какой кусок нейронной сети (какое ядро) может понадобиться в тот или иной момент. Поэтому обращение к базе данных будет очень интенсивным.

Я имел ввиду про нейронные сети.
да и не видя задачу в целом , трудно что либо сказать. :)
я просто предположил.
...
Рейтинг: 0 / 0
Что быстрее?
    #34251591
Ой Вэй
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хочу сказать о ещё одной возможности быстрой записи в БД.

Пусть нужно единовременно записать в БД много записей (ну хотя бы 1000). Если писать их по одной (что Update(), что Execute()), то это будет (относительно) долго.

Можно записать данные в dbf-файл, а затем из него переписать данные в БД одним Execute(). Разница в скорости -- на порядок (десятичный :) ).

//--------------------------------------
Недостатки этого метода:
1) БД должна или сама понимать, что такое dbf (как в случае с Access), или уметь обрабатывать в SQL-запросе таблицы из разных источников ODBC;

2) dbf-файл надо формировать или вручную, т.е. знать его физический формат, либо с помощью dbf-драйвера (теоретически м.б. немного медленнее);

3) лично я не умею писать в dbf мемо-поля, хотя в принципе это возможно.

Наверно, вместо dbf можно использовать текстовый формат и текстовый ODBC-драйвер, тогда проблема 2) отпадает, а 3) осложняется.
...
Рейтинг: 0 / 0
Что быстрее?
    #34253067
Homosum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JibSkeart

Я имел ввиду про нейронные сети.
да и не видя задачу в целом , трудно что либо сказать. :)
я просто предположил.

Я тоже:)
...
Рейтинг: 0 / 0
Что быстрее?
    #34253071
Homosum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ой ВэйХочу сказать о ещё одной возможности быстрой записи в БД.

Пусть нужно единовременно записать в БД много записей (ну хотя бы 1000). Если писать их по одной (что Update(), что Execute()), то это будет (относительно) долго.

Можно записать данные в dbf-файл, а затем из него переписать данные в БД одним Execute(). Разница в скорости -- на порядок (десятичный :) ).

//--------------------------------------
Недостатки этого метода:
1) БД должна или сама понимать, что такое dbf (как в случае с Access), или уметь обрабатывать в SQL-запросе таблицы из разных источников ODBC;

2) dbf-файл надо формировать или вручную, т.е. знать его физический формат, либо с помощью dbf-драйвера (теоретически м.б. немного медленнее);

3) лично я не умею писать в dbf мемо-поля, хотя в принципе это возможно.

Наверно, вместо dbf можно использовать текстовый формат и текстовый ODBC-драйвер, тогда проблема 2) отпадает, а 3) осложняется.

Очень интересный метод! Особенно для БД, которые преимущественно содержат числа или полностью из них состоят (В случае с нейронными сетями это как раз таки так). Тогда проблема 3 как я понял совсем отпадает. А какие системы кроме Access еще понимают dbf?
Можно ли это как либо автоматизировать? Как Вы думаете?
А перспективы действительно очень интересные! Особенно для ядерных нейронных сетей. Когда ядро обучается изменяется состояние очень многих весов - связей между нейронами (как раз тех элементов, которые храняться в БД). И основная задача состоит в обновлении этих весов. Если применить эту технологию, то можно не последовательно обновлять примерно 1000-3000 записей, а сделать это одним махом!
Буду думать дальше!
...
Рейтинг: 0 / 0
Что быстрее?
    #34253112
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HomosumА какие системы кроме Access еще понимают dbf?Да почти все... А если не умеют с dbf, умеют с каким-нибудь другим примитивным форматом работать. CSV, TSV, BCP или даже TXT с полями фиксированой ширины.
Этот подход действительно даст некоторый выигрыш во времени, но не значительный. Серверу БД все равно надо будет найти место в базе под новые записи или найти старую запись для обновления, да обновление индексов... Выигрыш будет за счет того, что данные посылаемые от клиента через нормальный коннект обзательно регестрируются в логе базы, а данные загружаемые сервором из локального файла нет (но это тоже зависит от сервера)..
Но подход с пакетным обновлением из внешнего файла имеет один серьезный недостаток - это может делать только сам сервер. Клиент командует серверу прочитать dbf - сервер читает, да. Но это значит что клиент во первых уже не контролирует процесс чтения. А во вторых, dbf должен быть доступен серверу, то есть либо физически лежать на машине с сервером, либо сервер должен будет по сети подмапировать диск клиентской машины.

А вообще-то, уже давно пора идит в соседний форум "Сравнения БД" или как-то так...
...
Рейтинг: 0 / 0
Что быстрее?
    #34253229
Homosum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl
А вообще-то, уже давно пора идит в соседний форум "Сравнения БД" или как-то так...

Не согласен. Думаю здесь еще много нового и интересного можно выкачать. Ведь база данных это только верхушка айсберга, а там еще много задач сопутствующих. Вот например, предыдущий механизм обновления данных, даже если даст небольшое преимущество, в рамках работы всей системы даст большой выигрыш.

Ведь моя нейронная сеть будет состоять приблизительно из 300-500 ядер (начальный уровень). Каждое ядро это примерно 110 нейронов. Между ними существуют связи. Из 300 ядер на каждом уровне обучения может обновляться до половины, а то и больше. И это будет делаться в автоматическом режиме. Т.е. чем больше будет оптимизация на любом уровне (будь то БД или же сами вычисления) тем быстрее в общем будет работать система.
...
Рейтинг: 0 / 0
Что быстрее?
    #34253230
Homosum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlВыигрыш будет за счет того, что данные посылаемые от клиента через нормальный коннект обзательно регестрируются в логе базы, а данные загружаемые сервором из локального файла нет (но это тоже зависит от сервера)..


Что значит зависит от сервера? Какие сервера БД для этого подойдут? Или может это механизм настраиваемый в сервере?
...
Рейтинг: 0 / 0
Что быстрее?
    #34256726
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HomosumВедь моя нейронная сеть будет состоять приблизительно из 300-500 ядер (начальный уровень). Каждое ядро это примерно 110 нейронов. Между ними существуют связи. Из 300 ядер на каждом уровне обучения может обновляться до половины, а то и больше. И это будет делаться в автоматическом режиме. Т.е. чем больше будет оптимизация на любом уровне (будь то БД или же сами вычисления) тем быстрее в общем будет работать система.Ну хорошо, начни с того, что формализуй структуру данных. Хранить и модифицировать тебе нужно только связи (в смысле веса синапсов) а ядра сами по себе никаких данных между отдельными запусками не хранят, не должны хранить по идее :) Значит представляем ядра в качестве списка стуркур типа
Код: plaintext
1.
2.
3.
struct node {
   undigned long nodeId;
   double value;
}
Потом соединяем ядра при помощи набора синапсов:
Код: plaintext
1.
2.
3.
struct synapse {
   unsigned long axon, dendrit;
   double weight;
}
И вот уже синапсы надо хранить в базе между запусками. В принципе, можно и текущее состояние ядер хранить в базе, но повторюсь еще раз: база данных это очень медленно. Намного эффективней будет использовать индексированый список с частичной выгрузкой на диск чтобы не хранить все разом в памяти. Но если хранить все в памяти, то будет эффективней :)
Ну а потом, делаешь выборку всех синапсов у которых аксон равен нулю, кидаешь в них какое-то значение. Для всех синапсов обработаных на данном шаге, выбираешь все ядра с номером указаном в дендрите, заменяешь значение в ядре. Потом для всех ядер выбираешь синапсы в которых аксоны равняются номерам обработаных ядер и продолжаешь по кругу, пока на очередном шаге не доберешься до синапсов с нулевыми дендритами.
Собственно говоря, для этой задачи между запусками достаточно хранить всего-лишь список синапсов, а для поиска нужного синпаса или ядра во время работы достаточно индекса (списка ядер сортированного по номерам ядер и списка синапсов сортированого по номерам аксонов и дендритов) в памяти. База данных тут вообще не нужна. Но если хочется взять что-то уже существующее и не изобретать собственную библиотеку работы с сортироваными списками, то Berkeley DB будет практически идеальным решением.
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Что быстрее?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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