а потом увидел, что запрос к базе занимает 1.3 минуты.
Общий вид схема
1 id
2 under_id (позиция в группе)
3 Ф
4 И
5 О
6 uid
7 gr_id
8 agreement (выбрана ли основной 0/1)
9 bforeign
Индексы на фио, agreement, gr_id
В прагмах отключал синхрон.
Изначально 9 столбца не было. (Это уже тесты)
Суть запроса, выдать список пользователей и ещё доп столбцом есть ли у него уже другая основная группа.
SELECT under_id,F,I,O,uid,agreement,
EXISTS (SELECT id FROM users u WHERE u.gr_id<>? AND u.agreement=1 AND ( (m.uid NOT NULL AND m.uid=u.uid) or (m.F NOT NULL AND m.F=u.F AND m.I=u.I AND m.O=u.O ) ))
Но в базе на 300к записей: запрос занимает 1-2 минуты на моём ноуте. Сервак будет медленнее.
Тут я подумал. Ок, тогда просто просчитаю все данные заранее и запишу. На словах это должно было делаться - одна группа около минуты, и итог 2.5 часа на создание бд. Но в результате(я взял 15 групп из 320). Через 40 минут запроса ниже - я не получил ничего(
UPDATE users
SET
bforeign = (SELECT id FROM users u WHERE u.gr_id<>m.gr_id AND u.agreement=1 AND ( (m.uid NOT NULL AND m.uid=u.uid) or (m.F NOT NULL AND m.F=u.F AND m.I=u.I AND m.O=u.O ) ))
FROM users m
Всё на базе sqlite
Сори канешн но грех жаловаться на скорость, когда у тебя 300к записей. Самый лучший вариант для тебя это прочитать ТЗ и найти строчку : требование к скорости по не предъявляться Либо оптимизировать свои запросы ( там чето про прекрасные формы и 8 шагов оптимизации ) А ещё грех жаловаться на SQL lite Хз есть ли там вьюхи которые уже выводят то что тебе надо
индексы есть?
покажи explain запроса
Проект мой. Поэтому как таковых сроков нет. Но когда приложение тебе должно показать этот список. А у тебя 1.5 минуты запрос - это очень плохо.
Извиняюсь за тупость. Никогда не использовал Explain. На какой именно запрос нужно, на индексы?
На тот запрос который у тебя тормозит.
на тот, который пытаешься индексы создать
На тот который тормозит
Я могу сюда pastebin ссылки отправлять, то что отправил выше - удалена?
отправляй большие куски ссылкой на пастюин, да
Вот update set https://pastebin.pl/view/dc64f9a9
не похоже на результат explain
Через 40 минут ничего ибо транзакция и уровни изоляции же. Либо все после успешного окончания, либо ничего.
Как правильно запрос должен быть прописан EXPLAIN QUERY PLAN ...?
да не. просто твой explain update...
https://pastebin.pl/view/1d18ba06
Все ещё нужна помощь. Извиняюсь за пересылку, просто чтобы вопрос не затерялся
черт, как же по другому выглядят эксплейны на sqlite
я правильно понимаю, что ты хочешь обновить все 300к записей?
Абсолютно верно
На 4к записей в джоин запросе уходит ≈ минута
ууух. а зачем?
Мне кажется ты что то неправильно сделал
первый запрос покажи целиком
Вместо exists быстрее будет использовать джоин, если не null - значит существует
Ткну пальцем в небо. Sqlite не очень хорошо умеет оптимизировать exists в приципе, а у вас внутри него ещё и or. Вполне неиллюзорно оно сканирует всю таблицу 300к раз
Обсуждают сегодня