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

Код: 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
17.11.2010, 07:19
    #36960814
suvolod
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите оптимизировать запрос (один Select + много Update-ов)
на всякий случай... про биндинг (подстановку параметров) как вариант ускорения знаю, но меня интересует более общее решение - а именно избавление от множества update-ов
...
Рейтинг: 0 / 0
17.11.2010, 10:30
    #36961014
Dmitry Arefiev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите оптимизировать запрос (один Select + много Update-ов)
1) От множества UPDATE'ов не избавится - каждую запись своим UPDATE'ом менять.
2) sqlite3_prepare(... UPDATE ...) сделать перед началом цикла и использовать параметры.
3) ASSERT(... sqlite3_open16 ...) - что будет если определить NDEBUG ?
...
Рейтинг: 0 / 0
17.11.2010, 14:48
    #36961784
suvolod
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите оптимизировать запрос (один Select + много Update-ов)
и все-таки чувствую я, что можно... Придумал вот такую конструкцию:

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
17.11.2010, 15:35
    #36961938
Dmitry Arefiev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите оптимизировать запрос (один Select + много Update-ов)
suvolodМожет, каким-нибудь синтаксисом внутри запроса (вложенного SELECT) можно объявить фцию, которая будет выполняться извне и которой можно передать результаты выборки этого select-а?
Ну зарег пользовательскую функцию и используй ее во вложенном SELECT.
Но это кривое решение из разряда "на Г сметану собирать" ...
...
Рейтинг: 0 / 0
17.11.2010, 17:18
    #36962259
suvolod
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите оптимизировать запрос (один Select + много Update-ов)
а пример можно, а то сам пока догнать не могу... ? или хотя-бы ссылку на оператор, который делает это в sql (сам я в нем новичек пока... ). И по поводу "на Г.. сметану" - чем плох такой метод выборки? Что вообще будет быстрее работать - такой сложный вложенный запрос или мой исходный вариант с одним селектом и кучей апдейтов? По уму, так sqlite должен такой запрос разобрать в какой-нибудь примитивный код и вернуть результаты быстрее... если конечно сам движок достаточно оптимизирован.
...
Рейтинг: 0 / 0
17.11.2010, 17:22
    #36962281
suvolod
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите оптимизировать запрос (один Select + много Update-ов)
Дмитрий, да, еще... а что за таинственная константа NDEBUG ? Почему она может накосячить? Я в ассерты заворачиваю все прежде всего для себя, чтобы исключить ошибки на стадии написании кода.. в релизе их все равно не будет, да и не нужны они. Раз в дебаг-версии запросы работают, значит составлены правильно, будут работать и в релизе...
...
Рейтинг: 0 / 0
17.11.2010, 18:36
    #36962444
Dmitry Arefiev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите оптимизировать запрос (один Select + много Update-ов)
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
Форумы / SQLite [игнор отключен] [закрыт для гостей] / Помогите оптимизировать запрос (один Select + много Update-ов) / 8 сообщений из 8, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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