|
Помогите оптимизировать запрос (один Select + много Update-ов)
|
|||
---|---|---|---|
#18+
Возник такой вопрос... - как оптимальнее работать с результатами запроса? Например, у меня есть код: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20.
Пример немного надуманный, на самом деле мне надо выбрать по определенному алгоритму записи из базы, поработать с ними и записать изменения в базу - все в том-же цикле перебора результата, но идея надеюсь понятна. Смущает то, что на один select затем приходиться туева хуча update-ов, и каждый раз приходиться компилировать вирт. машину, выполнять запрос на одну запись, освобождать ресурсы... как это дело можно оптимизировать? ... |
|||
:
Нравится:
Не нравится:
|
|||
17.11.2010, 06:35 |
|
Помогите оптимизировать запрос (один Select + много Update-ов)
|
|||
---|---|---|---|
#18+
на всякий случай... про биндинг (подстановку параметров) как вариант ускорения знаю, но меня интересует более общее решение - а именно избавление от множества update-ов ... |
|||
:
Нравится:
Не нравится:
|
|||
17.11.2010, 07:19 |
|
Помогите оптимизировать запрос (один Select + много Update-ов)
|
|||
---|---|---|---|
#18+
1) От множества UPDATE'ов не избавится - каждую запись своим UPDATE'ом менять. 2) sqlite3_prepare(... UPDATE ...) сделать перед началом цикла и использовать параметры. 3) ASSERT(... sqlite3_open16 ...) - что будет если определить NDEBUG ? ... |
|||
:
Нравится:
Не нравится:
|
|||
17.11.2010, 10:30 |
|
Помогите оптимизировать запрос (один Select + много Update-ов)
|
|||
---|---|---|---|
#18+
и все-таки чувствую я, что можно... Придумал вот такую конструкцию: 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-а? ... |
|||
:
Нравится:
Не нравится:
|
|||
17.11.2010, 14:48 |
|
Помогите оптимизировать запрос (один Select + много Update-ов)
|
|||
---|---|---|---|
#18+
suvolodМожет, каким-нибудь синтаксисом внутри запроса (вложенного SELECT) можно объявить фцию, которая будет выполняться извне и которой можно передать результаты выборки этого select-а? Ну зарег пользовательскую функцию и используй ее во вложенном SELECT. Но это кривое решение из разряда "на Г сметану собирать" ... ... |
|||
:
Нравится:
Не нравится:
|
|||
17.11.2010, 15:35 |
|
Помогите оптимизировать запрос (один Select + много Update-ов)
|
|||
---|---|---|---|
#18+
а пример можно, а то сам пока догнать не могу... ? или хотя-бы ссылку на оператор, который делает это в sql (сам я в нем новичек пока... ). И по поводу "на Г.. сметану" - чем плох такой метод выборки? Что вообще будет быстрее работать - такой сложный вложенный запрос или мой исходный вариант с одним селектом и кучей апдейтов? По уму, так sqlite должен такой запрос разобрать в какой-нибудь примитивный код и вернуть результаты быстрее... если конечно сам движок достаточно оптимизирован. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.11.2010, 17:18 |
|
Помогите оптимизировать запрос (один Select + много Update-ов)
|
|||
---|---|---|---|
#18+
Дмитрий, да, еще... а что за таинственная константа NDEBUG ? Почему она может накосячить? Я в ассерты заворачиваю все прежде всего для себя, чтобы исключить ошибки на стадии написании кода.. в релизе их все равно не будет, да и не нужны они. Раз в дебаг-версии запросы работают, значит составлены правильно, будут работать и в релизе... ... |
|||
:
Нравится:
Не нравится:
|
|||
17.11.2010, 17:22 |
|
Помогите оптимизировать запрос (один Select + много Update-ов)
|
|||
---|---|---|---|
#18+
suvolodа пример можно, а то сам пока догнать не могу... ? или хотя-бы ссылку на оператор, который делает это в sql (сам я в нем новичек пока... ). См. доку на sqlite3_create_function. suvolodЧто вообще будет быстрее работать - такой сложный вложенный запрос или мой исходный вариант с одним селектом и кучей апдейтов? Вложенный запрос для другого. Твои SELECT и 5 UPDATE'ов в SQLite будут работать достаточно быстро, что бы не собирать нечитаемое Г, в рассчете получить сметану в виде +немного процентов производительности. suvolodчто за таинственная константа NDEBUG ? assert в c/c++ это макроподстановка, которая работает только когда не определен NDEBUG. Как только будет определен, то аргумент целиком будет выкинут. Т.е., например, твой: Код: plaintext
... |
|||
:
Нравится:
Не нравится:
|
|||
17.11.2010, 18:36 |
|
|
start [/forum/topic.php?fid=54&msg=36960814&tid=2009268]: |
0ms |
get settings: |
10ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
41ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
43ms |
get tp. blocked users: |
1ms |
others: | 13ms |
total: | 144ms |
0 / 0 |