powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / SQLite [игнор отключен] [закрыт для гостей] / Помогите оптимизировать запрос (один Select + много Update-ов)
8 сообщений из 8, страница 1 из 1
Помогите оптимизировать запрос (один Select + много Update-ов)
    #36960800
suvolod
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Возник такой вопрос... - как оптимальнее работать с результатами запроса?
Например, у меня есть код:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
wsprintf(sqlText, L"SELECT id, word FROM dict ORDER BY RANDOM() LIMIT 5;");
ASSERT(sqlite3_open16(path, &db)==SQLITE_OK);	
ASSERT(sqlite3_prepare16_v2(db, sqlText,- 1 ,&ppVm, NULL)==SQLITE_OK);
	
int i= 0 ;
int id;
while (sqlite3_step(ppVm)==SQLITE_ROW){							//циклично получаем все строки результата запроса
	id=(int)sqlite3_column_int(ppVm, 0 );							//id записи
	wcscpy(buff[i],(wchar_t*)sqlite3_column_text16(ppVm,  1 ));	//слово

	//хочу сразу же обновить запись ...
	wsprintf(sqlText2,L"UPDATE dict SET busy='b' WHERE id=%d;",id);
	ASSERT(sqlite3_prepare16_v2(db, sqlText2,- 1 ,&ppVm2, NULL)==SQLITE_OK);
	sqlite3_step(ppVm2);
	sqlite3_finalize(ppVm2);

	i++;
}

sqlite3_finalize(ppVm);
sqlite3_close(db);

Пример немного надуманный, на самом деле мне надо выбрать по определенному алгоритму записи из базы, поработать с ними и записать изменения в базу - все в том-же цикле перебора результата, но идея надеюсь понятна. Смущает то, что на один select затем приходиться туева хуча update-ов, и каждый раз приходиться компилировать вирт. машину, выполнять запрос на одну запись, освобождать ресурсы... как это дело можно оптимизировать?
...
Рейтинг: 0 / 0
Помогите оптимизировать запрос (один Select + много Update-ов)
    #36960814
suvolod
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
на всякий случай... про биндинг (подстановку параметров) как вариант ускорения знаю, но меня интересует более общее решение - а именно избавление от множества update-ов
...
Рейтинг: 0 / 0
Помогите оптимизировать запрос (один Select + много Update-ов)
    #36961014
Фотография Dmitry Arefiev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1) От множества UPDATE'ов не избавится - каждую запись своим UPDATE'ом менять.
2) sqlite3_prepare(... UPDATE ...) сделать перед началом цикла и использовать параметры.
3) ASSERT(... sqlite3_open16 ...) - что будет если определить NDEBUG ?
...
Рейтинг: 0 / 0
Помогите оптимизировать запрос (один Select + много Update-ов)
    #36961784
suvolod
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
и все-таки чувствую я, что можно... Придумал вот такую конструкцию:

wsprintf(sqlText,
L"UPDATE dict SET busy='Y' where id IN (SELECT id FROM dict WHERE word in (SELECT word FROM dict ORDER BY RANDOM() LIMIT 5));");

проверял у себя.. работает, и никаких циклов. вопрос только в том, как мне вытянуть word из вложенного SELECT, чтобы заполнить внешний массив строк... Может, каким-нибудь синтаксисом внутри запроса (вложенного SELECT) можно объявить фцию, которая будет выполняться извне и которой можно передать результаты выборки этого select-а?
...
Рейтинг: 0 / 0
Помогите оптимизировать запрос (один Select + много Update-ов)
    #36961938
Фотография Dmitry Arefiev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
suvolodМожет, каким-нибудь синтаксисом внутри запроса (вложенного SELECT) можно объявить фцию, которая будет выполняться извне и которой можно передать результаты выборки этого select-а?
Ну зарег пользовательскую функцию и используй ее во вложенном SELECT.
Но это кривое решение из разряда "на Г сметану собирать" ...
...
Рейтинг: 0 / 0
Помогите оптимизировать запрос (один Select + много Update-ов)
    #36962259
suvolod
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
а пример можно, а то сам пока догнать не могу... ? или хотя-бы ссылку на оператор, который делает это в sql (сам я в нем новичек пока... ). И по поводу "на Г.. сметану" - чем плох такой метод выборки? Что вообще будет быстрее работать - такой сложный вложенный запрос или мой исходный вариант с одним селектом и кучей апдейтов? По уму, так sqlite должен такой запрос разобрать в какой-нибудь примитивный код и вернуть результаты быстрее... если конечно сам движок достаточно оптимизирован.
...
Рейтинг: 0 / 0
Помогите оптимизировать запрос (один Select + много Update-ов)
    #36962281
suvolod
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Дмитрий, да, еще... а что за таинственная константа NDEBUG ? Почему она может накосячить? Я в ассерты заворачиваю все прежде всего для себя, чтобы исключить ошибки на стадии написании кода.. в релизе их все равно не будет, да и не нужны они. Раз в дебаг-версии запросы работают, значит составлены правильно, будут работать и в релизе...
...
Рейтинг: 0 / 0
Помогите оптимизировать запрос (один Select + много Update-ов)
    #36962444
Фотография Dmitry Arefiev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
suvolodа пример можно, а то сам пока догнать не могу... ? или хотя-бы ссылку на оператор, который делает это в sql (сам я в нем новичек пока... ).
См. доку на sqlite3_create_function.
suvolodЧто вообще будет быстрее работать - такой сложный вложенный запрос или мой исходный вариант с одним селектом и кучей апдейтов?
Вложенный запрос для другого. Твои SELECT и 5 UPDATE'ов в SQLite будут работать
достаточно быстро, что бы не собирать нечитаемое Г, в рассчете получить сметану
в виде +немного процентов производительности.
suvolodчто за таинственная константа NDEBUG ?
assert в c/c++ это макроподстановка, которая работает только когда не определен NDEBUG.
Как только будет определен, то аргумент целиком будет выкинут. Т.е., например, твой:
Код: plaintext
ASSERT(sqlite3_open16(path, &db)==SQLITE_OK);
превратится в пусто ...
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / SQLite [игнор отключен] [закрыт для гостей] / Помогите оптимизировать запрос (один Select + много Update-ов)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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