|
помогите оптимизировать sql-запрос
|
|||
---|---|---|---|
#18+
Здравствуйте. Есть такая задача: - имеем список строк (10-30 символов) - и имеем таблицу в БД sqlite, такой структуры: int uid, string строка, int фейлы алгоритм такой: - получили строки - внесли их в БД, uid по умолчанию null, фейлы - по умолчанию 0 - обрабатываем строки - те строки, с которыми произошла ошибка - обновляются в БД, инкрементируется счетчик фейлов - все удачно обработанные строки получают свой уникальный uid, чтобы потом их повторно не обрабатывать таблица нужна затем, чтобы запоминать и отсеивать впоследствии те строки, у которых 5 фейлов и больше а также те, которые были обработаны ранее (имеют uid) проблема у меня на том месте, где мы получили строки и пытаемся из них удалить те, что в базе имеют по 5 фейлов я сделал это так: авторselect data from rows where data in (перечисляем все строки через запятую) and fails >= 5 or uid is not null т.е. достаем строки, которые в (перечисляем все имеющиеся в начале скрипта строки) и без ошибок, либо уже есть uid соотв. потом из начального списка удаляем весь этот мусор а оставшиеся обрабатываем 1 список строк в запросе порой получается огромным 2 это неистово жрет память (python3, apache, sqlite3) как по вашему будет правильнее удалить из начального списка все строки, имеющие фейлы и имеющие ИД, так чтобы не доставать всю таблицу (она может содержать миллионы строк)? можно проверять каждую строку отдельным запросом, но не сожрет ли это все ресурсы? ... |
|||
:
Нравится:
Не нравится:
|
|||
14.10.2011, 15:20 |
|
помогите оптимизировать sql-запрос
|
|||
---|---|---|---|
#18+
enicкак по вашему будет правильнее удалить из начального списка все строки, имеющие фейлы и имеющие ИД, так чтобы не доставать всю таблицу (она может содержать миллионы строк)?Я бы поменял порядок предикатов в запросе, поставив простейшие на первый план. Не знаю, пытается ли SQLite оптимизировать запросы. Если он просто выполняет проверки слева направо, то до наиболее трудоёмкой части (data in (...)) должен доходить уже максимально отфильтрованный набор строк. select data from rows where (uid is not null or fails >= 5) and data in (перечисляем все строки через запятую) Проверять все строки отдельными запросами вряд ли будет лучше с точки зрения производительности. Не знаю, на что у вас там сжирается память, БД тут вряд ли играет роль. Смотрите, что у вас в Питоне творится. Вопрос: data == primary key? Наверное, имеет смысл сделать индекс. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.10.2011, 20:55 |
|
|
start [/forum/topic.php?fid=54&fpage=20&tid=2009110]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
63ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
35ms |
get tp. blocked users: |
1ms |
others: | 293ms |
total: | 434ms |
0 / 0 |