Форум программистов, компьютерный форум, киберфорум
SQLite
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.62/34: Рейтинг темы: голосов - 34, средняя оценка - 4.62
17 / 5 / 0
Регистрация: 16.04.2016
Сообщений: 344

Как правильно обновить id после удаления записи

11.12.2023, 18:15. Показов 9689. Ответов 96
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всех приветствую. У меня есть таблица,в которой первичный ключ не autoincrement rowid,поэтому я сам создал колонку rowid:
SQL
1
CREATE TABLE IF NOT EXISTS  favourite_posts (ROWID INTEGER,id INTEGER,name TEXT,DATE TEXT,author TEXT,content TEXT,url TEXT,PRIMARY KEY(id),UNIQUE(ROWID))
Я не делал rowid autoincrement,т.к я хочу,чтобы id были упорядоченными,а autoincrement за этим не следит. К примеру,после удаления поста с rowid 2 rowid будут равны 1 и 3,чего мне бы не хотелось. После удаления поста я пытаюсь обновить таблицу так:
SQL
1
UPDATE TABLE favourite_posts SET ROWID =ROWID-1 WHERE ROWID >deleted_row_id
Но,к примеру,при попытке удалить пост с rowid 1 и обновить rowid для значений 2,3 я получаю ошибку типа unique constraint,поскольку,как я понимаю,sqlite вначале пытается обновить rowid со значением 3,заменив его на 2,но ведь значение 2 уже есть. Подскажите пожалуйста,как изменить порядок обновления колонки ROWID,или как наиболее оптимально обновить записи в бд после удаления записи. Понимаю,что многие скажут мне,что-то типа того,я занимаюсь ерундой,но во-первых мне будет приятнее,чтобы roid был упорядоченным,а во-вторых я прочитал,что limit с offset менее оптимальны (а они мне будут нужны в запросах) чем выбор по условию where. Я могу гарантировать,что будет удаляться только один пост (хотя я не откажусь,если мне кто-то напишет запрос,который будет работать,если мы удалим сразу несколько постов) и что следующий ROWID всегда на 1 больше предыдущего. Заранее всех благодарю за помощь.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
11.12.2023, 18:15
Ответы с готовыми решениями:

Как обновить данные в datagrid view после удаления строки?
1. Удаляю строку 2. Восстанавливаю базу из резервной копии (напрямую из программы) 3. Жму кнопку обновить (код ниже), - ничего не...

FireBase + RecyclerView| как обновить список, после удаления item из базы?
Добрый всем день! есть метод который удаляет айтем (значения items берутся из FireBase): public void DelPos(View v){ ...

Как обновить datagridview после добавления записи?
Как можно обновить datagridview после добавленич записи? string connectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data...

96
919 / 292 / 58
Регистрация: 01.06.2023
Сообщений: 816
26.12.2023, 16:44
Студворк — интернет-сервис помощи студентам
Это понятно,но я про то,что в случае одинаковых таблиц sqlite выдаст ошибку.
Двух таблиц с одинаковым именем не должно быть, нужно присваивать алиасы. Если парсер не сможет определить к какой таблице относится колонка он упадет с ошибкой.

т.е это будет верно всегда,когда мы выбираем колонку column,при этом сортируем по column и у нас есть простой индекс по column,или составной индекс,где column первая колонка
Верно

Нет,тут я не прав. Даже если я укажу то,что значение больше нуля,никто не гарантирует,что,к примеру,после двойки не будет единицы (если двойка первая).
используйте поле автоинкриментное и будет Вам счастье
0
17 / 5 / 0
Регистрация: 16.04.2016
Сообщений: 344
26.12.2023, 23:25  [ТС]
В общем я посмотрел план запроса
SQL
1
SELECT id,name,DATE FROM (SELECT id,name,DATE FROM favourite_posts WHERE ROWID <(SELECT ROWID FROM favourite_posts WHERE id=15012) ORDER BY ROWID DESC LIMIT 3) ORDER BY ROWID
И получил план
2 0 0 CO-ROUTINE 2
6 2 0 SEARCH TABLE favourite_posts USING INTEGER PRIMARY KEY (rowid<?)
9 2 0 SCALAR SUBQUERY 1
13 9 0 SEARCH TABLE favourite_posts USING COVERING INDEX sqlite_autoindex_favourite_posts_1 (id=?)
29 0 0 SCAN SUBQUERY 2

Насколько хороший это результат? Особенно меня смущает корутина,т.е я не уверен,насколько это хорошо для производительности. Просто когда я шёл вперёд,а значит подзапросов было меньше,никакой корутины не было. Кстати что за цифры в начале каждой строки плана?

Добавлено через 40 минут
Кстати внешняя сортировка,как я вижу,почему-то игнорируется.

Добавлено через 2 часа 37 минут
Посмотрел ещё раз Ваш запрос,добавил ROWID в подзапрос и сортировка заработала как надо. Непонятно почему внешняя сортировка не работала без rowid хотя бы простым сканированием таблицы. Кстати сейчас у меня добавилось в план:
40 0 0 USE TEMP B-TREE FOR ORDER BY
Надеюсь это хороший результат? Внутренняя сортировка у меня почему-то не отобразилась.
0
919 / 292 / 58
Регистрация: 01.06.2023
Сообщений: 816
27.12.2023, 07:16
Кстати сейчас у меня добавилось в план... Надеюсь это хороший результат?
это неизбежно, так работает внешняя сортировка

Внутренняя сортировка у меня почему-то не отобразилась.
Прочитайте еще раз предыдущую страницу. она и не отобразиться так как есть готовый индекс (B-TREE на ROWID)

Насколько хороший это результат?
Для получения показателей, которые можно было бы сравнить, воспользуйтесь консолью SQLite. см предыдущую страницу.

Просто когда я шёл вперёд,а значит подзапросов было меньше,никакой корутины не было
У Вас и запрос был другой, короче

Кстати что за цифры в начале каждой строки плана?
каждый узел дерева состоит из четырех полей: целочисленного идентификатора узла, целочисленного родительского идентификатора, вспомогательного целочисленного поля, которое в данный момент не используется, и описания узла. (см. уже справку)
0
17 / 5 / 0
Регистрация: 16.04.2016
Сообщений: 344
27.12.2023, 21:30  [ТС]
Понятно. А CO-ROUTINE в sql не ухудшит производительность? Также я не понял,почему внешняя сортировка не работала,если в подзапросе не добавить ROWID к выборке? Ещё хотелось бы для себя понять,если будет примерно такой запрос:
SQL
1
SELECT id,name,DATE FROM (SELECT id,name,DATE FROM favourite_posts WHERE ROWID <(SELECT MAX(ROWID) FROM favourite_posts) ORDER BY ROWID DESC LIMIT 3) ORDER BY ROWID
для каждой записи в подзапросе будет вызываться функция max(ROWID),или это значение вычисляется один раз? Если первый вариант,то можно ли как-то сделать,чтобы это значение вычислялось один раз и переиспользовалось? Кстати и в моём запросе для каждой записи вызывается подзапрос и мы делаем одно и тоже n раз,где n - количество записей,которые были обработаны в основном запросе,или это значение переиспользуется?
Кстати (я понимаю,что это надо обернуть в отдельный поток но всё-таки) почему-то при запросе:
SQL
1
SELECT author,content,url FROM favourite_posts WHERE id=10482
Приложение где-то пол секунды тормозит. Связано ли это с большой строкой content или с другими проблемами в запросе,или причины стоит искать в другом?
0
919 / 292 / 58
Регистрация: 01.06.2023
Сообщений: 816
27.12.2023, 22:41
Воспользуйтесь консолью и ее профилировщиком, она покажет сколько раз нода была выполена и сколько строк вернула.
Вы уверены что запрос тормозит? Поставьте таймеры или воспользуйтесь профилировщиком если он есть для андроид.
0
17 / 5 / 0
Регистрация: 16.04.2016
Сообщений: 344
12.01.2024, 00:34  [ТС]
Всех с наступившими праздниками. В общем скоро,,надеюсь,выйдет новая версия нашего приложения. К сожалению не в android,не в windows опция DSQLITE_ENABLE_STMT_SCANSTATUS не включена,поэтому я не могу проверить,сколько строк было отсканировано,т.к меня интересует запрос,когда мы листаем страницы назад,т.е к примеру такой:
SQL
1
SELECT id,name,DATE FROM posts WHERE ROWID <(SELECT ROWID FROM posts WHERE id=10484) ORDER BY ROWID DESC LIMIT 20
Также меня волнует,оптимальный ли запрос типа:
SQL
1
SELECT author,content,url FROM posts WHERE id=15701
,поскольку почему-то в android он подтормаживает. Понимаю,что сам мог бы проверить это,но первый запрос я не смогу проверить,т.к в sqlite3 для windows я получаю предупреждение:
.scanstats not available in this build,т.е мне надо самому собрать sqlite для windows (готовый я не нашёл),а возиться со сборкой не хочется,т.к я очень мало работаю с бд и по сути эта бд - мой первый опыт,т.е если я и работал ранее с бд в android приложении,то с теми,кто создавал их до меня,и то я с ними напрямую почти не работал.
Поэтому если кто-то сможет проверить,оптимально ли эти запросы работают,или для первого запроса лучше всё-таки запоминать rowid для каждой страницы,как мне и советовали,я буду очень сильно благодарен. Также меня волнует оптимальна ли в данный момент структура моей бд,или её можно как-то улучшить (каждый пост в бд,это подробное описание изображения/видео откуда-либо)? Заранее благодарю всех за помощь.
Вложения
Тип файла: zip application.zip (29.4 Кб, 4 просмотров)
0
919 / 292 / 58
Регистрация: 01.06.2023
Сообщений: 816
12.01.2024, 08:29
Скачайте в https://www.sqlite.org/download.html tools. В коммандной строке уже все есть

выполняете команды:

.scanstats est
.timer on

Дальше при выполнении запросов будет Вам статистика

Кликните здесь для просмотра всего текста
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
sqlite> SELECT id,name,DATE FROM posts WHERE ROWID <(SELECT ROWID FROM posts WHERE id=10484) ORDER BY ROWID DESC LIMIT 20;
id    name           date
----  -------------  ----
10486 Видео-рецепт: яичница с цветной капустой и луком 2020-12-14T09:42:14
10488 Видео-рецепт: шарики в поджарке, быстро и дёшево 2020-12-14T10:22:33
10490 Видео-рецепт: Курица в фольге 2020-12-14T10:27:24
10492 Видео-рецепт: праздничный Рулет из фарша 2020-12-14T10:29:59
10494 Видео-рецепт: Маринованные шампиньоны 2020-12-14T10:32:31
10499 Видео-рецепт: Куриная грудка со сладким перцем 2020-12-15T15:58:00
10501 Видео-рецепт: рулет из двух видов мяса 2020-12-15T16:06:33
10503 Видео-рецепт: Рулетики куриные с капустой 2020-12-15T16:11:23
10505 Видео-рецепт: Вкусная курица под мокрым пергаментом 2020-12-15T16:16:37
10507 Видео-рецепт: Камбала с помидорами 2020-12-15T16:18:48
10509 Видео-рецепт: Рыба с рисом 2020-12-15T16:22:50
10511 Видео-рецепт: куриная грудка с ананасами 2020-12-15T16:27:00
12337 Видео: Простой рецепт выпечки на тесте из манки 2021-12-06T09:31:51
12470 Видео: Готовим мясной пирог 2021-12-22T08:59:00
13690 Видео-рецепт: готовим вкусную свинину 2022-05-11T20:07:46
15012 Видео-рецепт: кекс за 5 минут 2023-04-08T22:45:52
15142 Фото-рецепт: Изумрудное варенье из киви 2023-05-09T21:09:53
QUERY PLAN
|--SCALAR SUBQUERY 1                                                        (loops=1)
|  `--SEARCH posts USING COVERING INDEX sqlite_autoindex_posts_1 (id=?)     (loops=1 rows=1 rpl=1.0 est=1.0)
`--SEARCH posts USING INTEGER PRIMARY KEY (rowid<?)                         (loops=1 rows=17 rpl=17.0 est=262144.0)
Run Time: real 0.007 user 0.000000 sys 0.000000


Запрос выполняется за 7-15мс. По моему мнению норм
1
17 / 5 / 0
Регистрация: 16.04.2016
Сообщений: 344
12.01.2024, 18:33  [ТС]
Огромное Вам спасибо за помощь. Я немного перепутал,мне нужно было получить запрос,когда я перехожу на предыдущую страницу:
SQL
1
SELECT id,name,DATE FROM (SELECT ROWID,id,name,DATE FROM posts WHERE ROWID >(SELECT ROWID FROM posts WHERE id=10486) ORDER BY ROWID LIMIT 20) ORDER BY ROWID DESC
Если Вам нетрудно,посмотрите пожалуйста и его (это будет последняя просьба от меня). Хотелось бы понять некоторые термины,т.е что значит loop (это сколько циклов он будет проходить),rpl ,est и что значит информация:

Run Time: real 0.007 user 0.000000 sys 0.000000

Вообще меня пугает,что такой запрос выполняется за 7 мс. А если бд будет в 100-200 раз больше,за сколько этот запрос выполнится? Мне кажется что второй запрос (который я изначально и хотел,чтобы Вы проверили,но перепутал,т.е не то скопировал с лога),будет выполняться гораздо дольше. Кстати я выяснил,что запрос:
SQL
1
SELECT author,content,url FROM posts WHERE id=15701
выполняется за 0 мс. Я это вычислил,используя разницу текущего времени и времени,когда я вызвал java метод. А вот запросы для получения категорий и тегов суммарно выполняются за 2 мс,что меня немного смущает,ведь у нас пока что две категории и один-два тега,а значит запрос,на мой взгляд,должен выполняться за 0 мс,хотя возможно время занимает добавление категорий/тегов в список и отрисовка их на экране. Я использую запросы:
SQL
1
SELECT id,name,description FROM categories WHERE id IN (SELECT id FROM post_category_relationship WHERE post_id=15701);SELECT id,name,description FROM tags WHERE id IN (SELECT id FROM post_tag_relationship WHERE post_id=15701)
0
919 / 292 / 58
Регистрация: 01.06.2023
Сообщений: 816
14.01.2024, 09:15
Если Вам нетрудно,посмотрите пожалуйста и его
Не ленитесь и скачайте tools для sqlite

что значит loop (это сколько циклов он будет проходить),rpl ,est
https://www.sqlite.org/profile.html
Loop - сколько раз был посещен данный узел (реальное число)
RPL - среднее число строк на на цикл (если умножить на loop - то общее число строк возвращенное узлом)
EST - Ожидаемое число строк на цикл

https://www.sqlite.org/forum/info/20c102e438450a8d

real - это прошедшее время
user - это время, затраченное на выполнение инструкций в пользовательском режиме
sys - это время, затраченное на выполнение инструкций в режиме супервизора

если real - user - sys > 0 то это время потрачено на ожидание ввода вывода (например чтение с диска), процессор ни чего не делал.

Вообще меня пугает,что такой запрос выполняется за 7 мс. А если бд будет в 100-200 раз больше,за сколько этот запрос выполнится?
Это вовсе не значит, что запрос будет выполняться в 100-2000 раз медленнее, замедление будет не так явно выражено.
1
17 / 5 / 0
Регистрация: 16.04.2016
Сообщений: 344
14.01.2024, 18:03  [ТС]
Что же,я скачал sqlite tools,и вот что получил. Можно ли на Ваш взгляд улучшить мой запрос для получения rowid с предыдущей страницы и что за корутина в sqlite. Как я ранее писал,фриз в android приложении вообще не связан с sqlite,т.к он был одним из самых быстрых по скорости. Кстати когда листаем назад,как я понял по выводу,запрос выполняется за 49 мс,вместо 15 мс,когда мы идём вперёд. Видимо придётся сохранять rowId каждой страницы и записывать в массив.
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
SELECT id,name,DATE FROM (SELECT ROWID,id,name,DATE FROM posts WHERE ROWID >(SELECT ROWID FROM posts WHERE id=10486) ORDER BY ROWID LIMIT 20) ORDER BY ROWID DESC;
16112|Видео-рецепт: Вкуснейший лимонный пирог|2024-01-01T18:07:22
15701|Фото: Ромодановский вокзал|2023-09-18T10:33:32
15945|Urban Symphony — Randajad (Евровидение 2009, Эстония|2023-11-24T12:01:48
7264|Конвертики к завтраку|2019-09-24T14:34:07
7317|Торт из арбуза и дыни|2019-10-13T00:19:31
8276|Суши-торт|2019-10-23T20:37:29
8295|Острые блинчики|2019-10-30T22:26:08
8318|Медовое печенье|2019-11-03T16:00:34
8577|Видеорецепт: Быстрая пицца на завтрак|2020-01-24T16:49:24
8615|Видео-рецепт: морковно-картофельные оладьи|2020-01-27T15:57:30
8751|Видеорецепт: Куриное филе в яйце — просто и быстро|2020-03-04T17:30:10
9137|Видео-рецепт: вкусные оладьи|2020-04-25T20:29:33
10037|Рецепт: картофель с черносливом в мультиварке|2020-09-25T09:53:47
10179|Рецепт: «КУРИНЫЕ ШАРИКИ В СЫРНО-СЛИВОЧНОМ СОУСЕ»|2020-10-20T07:52:29
10459|Видео-рецепт: завтрак для ленивых — Яйца в лаваше|2020-12-04T19:05:50
10474|Видео-рецепт: новогодний салат с огурцами, курицей и шампиньонами|2020-12-11T15:08:06
10476|2 рецепта из одной селёдки: видео|2020-12-11T15:15:21
10478|Видео: 5 сырных закусок, которые украсят ваш стол|2020-12-12T08:52:15
10482|Видео-рецепт: Вкусные шарики из картошки и фарша|2020-12-14T09:30:31
10484|Видео-рецепт: Курица под шубой|2020-12-14T09:37:07
QUERY PLAN
|--CO-ROUTINE (subquery-2)
|  |--SCALAR SUBQUERY 1                                                        (loops=1)
|  |  `--SEARCH posts USING COVERING INDEX sqlite_autoindex_posts_1 (id=?)     (loops=1 rows=1 rpl=1.0 est=1.0)
|  `--SEARCH posts USING INTEGER PRIMARY KEY (rowid>?)                         (loops=1 rows=20 rpl=20.0 est=262144.0)
|--SCAN (subquery-2)                                                           (loops=1 rows=20)
`--USE TEMP B-TREE FOR ORDER BY                                                (loops=1 rows=20)
Run Time: real 0.049 user 0.000000 sys 0.015625
0
919 / 292 / 58
Регистрация: 01.06.2023
Сообщений: 816
14.01.2024, 20:48
Можно ли на Ваш взгляд улучшить мой запрос для получения rowid с предыдущей страницы
Да, Вы его не правильно записали

SQL
1
2
3
4
5
6
7
8
9
10
11
SELECT id,name,DATE
FROM 
 (
  SELECT ROWID,id,name,DATE 
  FROM posts 
  WHERE 
   ROWID < (SELECT ROWID FROM posts WHERE id=10486) 
  ORDER BY ROWID DESC 
  LIMIT 20
 ) 
ORDER BY ROWID
еще обратите внимание на строчку (loops=1 rows=20 rpl=20.0 est=262144.0) - ожидаемое число строк очень сильно отличается от фактического. Советую выполнить для каждой таблицы команду:

SQL
1
analyze Имя_Таблицы;
запрос выполняется за 49 мс,вместо 15 мс,когда мы идём вперёд
Выполните запрос несколько раз, возможно в первый раз будет дольше выполняться. Основное время тратится на чтение таблицы Posts. Так что не особо выиграет.

что за корутина в sqlite
Генератор данных для узла, см https://www.sqlite.org/optoverview.html
0
17 / 5 / 0
Регистрация: 16.04.2016
Сообщений: 344
14.01.2024, 21:57  [ТС]
Попытался выполнить Ваш запрос,отдаётся 16 записей,хотя должно 20. Я использую знак больше,т.к мы отображаем посты по убыванию и нам нужно показать первую страницу,когда мы на второй,т.е от меньшего к большему. Кстати Ваш запрос выполняется тоже где-то 49 мс. Очень жаль,что в sqlite нет явного оператора,который бы сразу выбирал нужные записи,но добавлял бы их в начало,т.е что-то типа стека. Кстати насчёт не совпадения фактического значения с ожидаемым,это плохо? Если да,то как можно улучшить мою бд?
0
919 / 292 / 58
Регистрация: 01.06.2023
Сообщений: 816
14.01.2024, 22:26
Я использую знак больше,т.к мы отображаем посты по убыванию и нам нужно показать первую страницу,когда мы на второй,т.е от меньшего к большему.
Не верно понял. Посчитал что данные должны выдаваться от меньшего ROWID к большему

запрос,отдаётся 16 записей,хотя должно 20
если сортировать по ROWID перед записью с id = 10486 как раз 16 записей.

Кстати Ваш запрос выполняется тоже где-то 49 мс.
Посмотрите метрику Real - User - sys, это время которое sqlite ждал когда система считает файл и вернет порцию данных

Кстати насчёт не совпадения фактического значения с ожидаемым,это плохо
Плохо если значение разнится на порядок другой. Просто выполните analyze после вставки большой порции данных. Если статистика плохая, то это может приводить к плохим планам запроса. Сейчас все в порядке даже с плохой статистикой.


SQL
1
2
3
4
5
6
7
8
9
10
11
SELECT rowid, id,name,DATE
FROM 
 (
  SELECT ROWID,id,name,DATE 
  FROM posts 
  WHERE 
   ROWID > (SELECT ROWID FROM posts WHERE id=10486) 
  ORDER BY ROWID 
  LIMIT 20
 ) 
ORDER BY ROWID DESC
Запрос считаю оптимальным.
Миниатюры
Как правильно обновить id после удаления записи  
0
17 / 5 / 0
Регистрация: 16.04.2016
Сообщений: 344
14.01.2024, 23:44  [ТС]
если сортировать по ROWID перед записью с id = 10486 как раз 16 записей.
Но в бд больше 20 записей,а нам нужно со 2-й страницы перейти на первую,а значит должно быть 20 записей.
Посмотрите метрику Real - User - sys, это время которое sqlite ждал когда система считает файл и вернет порцию данных
Run Time: real 0.070 user 0.000000 sys 0.000000

При этом перед этим real был 79,а перед этим вроде 50 или что-то в этом роде. Кстати проверил простой запрос:
SQL
1
SELECT ROWID,id,name,DATE FROM posts ORDER BY ROWID DESC LIMIT 20;
И заметил,что скорость не сильно увеличилась (кстати лично я 15 мс что-то не наблюдаю). В общем,как я понял,если скорость и меньше в более сложном запросе,то не на много (надеюсь эта разница будет сохранятся,если бд будет гораздо больше). А то я уже хотел запоминать rowid первого элемента в каждом списке и плясать от этого но,как я понял,это делать не обязательно,т.к я не сильно выиграю. Кстати почему-то бывает так,что в первом запросе realtime меньше,чем во втором,а в третьем- - больше,чем в первом,но меньше,чем во втором. Я имею ввиду сложный запрос,где используется корутина. Непонятно,почему так происходит (при этом было даже так,что запрос с корутиной при первом выполнении был быстрее запроса без корутины во втором (или третьем,не уверен) выполнении)? Кстати по количеству просканированных строк в запросе с корутиной всё нормально?
Сейчас все в порядке даже с плохой статистикой.
Как Вы определили,что сейчас всё в порядке с плохой статистикой (как я понимаю,она у меня плохая) и если статистика плохая,в чём могут быть причины и как её улучшить?
0
919 / 292 / 58
Регистрация: 01.06.2023
Сообщений: 816
14.01.2024, 23:58
Кстати почему-то бывает так,что в первом запросе realtime меньше,чем во втором,а в третьем- - больше,чем в первом,но меньше,чем во втором. Я имею ввиду сложный запрос,где используется корутина. Непонятно,почему так происходит (при этом было даже так,что запрос с корутиной при первом выполнении был быстрее запроса без корутины во втором (или третьем,не уверен) выполнении)?
Считайте что "корутина" в данном случае бесплатно, не зацикливайтесь на ней. Она нужна что бы провести вторую сортировку. Основную задержку вносит операционная система не спешно читая данные с диска.

Кстати по количеству просканированных строк в запросе с корутиной всё нормально?
SQL
1
2
3
4
5
6
7
8
9
10
11
SELECT rowid, id,name,DATE
FROM 
 (
  SELECT ROWID,id,name,DATE 
  FROM posts 
  WHERE 
   ROWID > (SELECT ROWID FROM posts WHERE id=10486) 
  ORDER BY ROWID 
  LIMIT 20
 ) 
ORDER BY ROWID DESC
Code
1
2
3
4
5
6
7
8
QUERY PLAN
|--CO-ROUTINE (subquery-2)
|  |--SCALAR SUBQUERY 1                                                        (loops=1)
|  |  `--SEARCH posts USING COVERING INDEX sqlite_autoindex_posts_1 (id=?)     (loops=1 rows=1 rpl=1.0 est=1.0)
|  `--SEARCH posts USING INTEGER PRIMARY KEY (rowid>?)                         (loops=1 rows=20 rpl=20.0 est=9.0)
|--SCAN (subquery-2)                                                           (loops=1 rows=20)
`--USE TEMP B-TREE FOR ORDER BY                                                (loops=1 rows=20)
Run Time: real 0.032 user 0.000000 sys 0.000000
Все нормально. Что Вас смутило?

Как Вы определили,что сейчас всё в порядке с плохой статистикой
План запроса, число считанных строк по факту, то как ожидалось.

в чём могут быть причины и как её улучшить
Было вставлено/удалено много строк - выполните analyze. Распределение значений по индексу очень не равномерное - здесь уже толком ни чего не поделать.
0
17 / 5 / 0
Регистрация: 16.04.2016
Сообщений: 344
15.01.2024, 01:55  [ТС]
Считайте что "корутина" в данном случае бесплатно, не зацикливайтесь на ней. Она нужна что бы провести вторую сортировку. Основную задержку вносит операционная система не спешно читая данные с диска.
Т.е без неё вторая сортировка невозможна? Я не против корутины,просто непонятно,зачем sqlite посчитал нужным использовать её,т.е из-за второй сортировки,или из-за большой сложности запроса?
Все нормально. Что Вас смутило?
Меня больше не смутило,а я уточнял,всё ли нормально на Ваш взгляд,но теперь я понял,что да. Кстати в одном из выводов по запросу с корутинами было est=262144.0,т.е почему sqlite ожидает такое число строк. Кстати,к примеру,real 0.055 значит,что запрос выполнялся в целом 55 мс,включая время чтения файла системой?
0
919 / 292 / 58
Регистрация: 01.06.2023
Сообщений: 816
15.01.2024, 06:40
Т.е без неё вторая сортировка невозможна? Я не против корутины,просто непонятно,зачем sqlite посчитал нужным использовать её,т.е из-за второй сортировки,или из-за большой сложности запроса?
Из-за того что нужно сделать еще одну итерацию обработки, так что да можно сказать что из-за второй сортировки.

Кстати в одном из выводов по запросу с корутинами было est=262144.0,т.е почему sqlite ожидает такое число строк.
Так как anlayze не был выполнен на всякий случай предполагается худшее.

Кстати,к примеру,real 0.055 значит,что запрос выполнялся в целом 55 мс,включая время чтения файла системой?
Да, это общее время - от начала разбора запроса, до вывода последней строки.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
15.01.2024, 06:40

Как правильно обновить DataGrid после добавления строки
Уважаемые Гуру! В ZAML имеется DataGrid с привязкой к ObservableCollection: &lt;Grid Grid.Row=&quot;1&quot; Name=&quot;оснТаблица&quot; ...

Как обновить datagridview после добавления кнопки записи?
Это моя кнопка кода загружает данные datagridview с моей базой данных в SQL Server. После нажатия на кнопку я хочу обновить данные в...

Обновить грид после удаления из бд
Пытался обновить после запроса на удаление Select'ом. Но либо оно ничего не обновляло, либо клонировало одну из строк базы. хелп плиз) ...

Как правильно обновить dataGridView1 после update в отдельной форме
Здравствуйте! В главной форме имеем dataGridView1. Заполняем dataGridView1 вручную Кнопкой вызываем форму для редактирования выбранной...

Список файлов в listView. Как убрать пути и обновить список после удаления элемента
В listView отображается список файлов директории. Вопросы: 1. Как сделать так, чтоб в списке были только названия файлов, без пути к...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
97
Ответ Создать тему
Новые блоги и статьи
сукцессия 13. Питон модель трехзонного мицелия, пока что в основном арбускулярного
anaschu 28.06.2026
## Разработка агентной модели микоризной сукцессии: от выявления артефактов к созданию комплексной системы ### Аннотация Представлено исследование по разработке агентной модели микоризной. . .
сукцессия 12. краткий список проверок модели перед запуском.
anaschu 27.06.2026
Скрытые отказы в моделях систем динамики (SD-models) экологических систем: два случая из практики Контекст Разбирался прототип модели систем динамики (SD-модели) микоризной сукцессии: пять. . .
Сукцессия 11. Проверка орудий перед войной: разработка через тестирование
anaschu 27.06.2026
Как не дать модели соврать самой себе: проверки для симуляции микоризной сукцессии Введение Когда вы строите математическую модель живой системы — грибов, растений, почвы — главная опасность. . .
10 сукцессия. Питон код войны грибов и растений
anaschu 27.06.2026
import numpy as np class PlantAgent: def __init__(self, name, strategy, initial_biomass): self. name = name self. strategy = strategy # "greedy" (широколиственные) или. . .
сукцессия 9. Математика подлости: как растения предали грибных друзей
anaschu 27.06.2026
Статья 2. Глобальная фосфорная война: эволюционно-экономические механизмы распределения биомов Земли Введение: Экологический рынок как игра с нулевой суммой Традиционная экология долгое время. . .
сукцессия 8. Как я спорил с ИИ, которые - агенты растений и ненавистники грибов!
anaschu 27.06.2026
Статья 1. Хроники грибного восстания: как Сократов диалог разрушил академические догмы ИИ Введение: Синдром «цифрового учебника» Современные большие языковые модели (LLM) обладают колоссальным. . .
Главный вопрос моделирования сукцессии
anaschu 27.06.2026
главный вопрос. Если эктомикориза лучше добывает недоступный фосфор. И ее масса максимальна из всех. А широколиственный лес тоже имеет самую крутую биомассу. То почему не возникло их симбиоза? Это. . .
сукцессия 6. Питон реализация энилоджиковской модели, картинка про Центральную часть будущей модели
anaschu 26.06.2026
Етить. ИИ мне на основе моего старого файла R создал вот эту вот хмерь на пайтоне. Это уже новая модель, модель сукцессии грибной. потоки фосфора, азота. Углерода. 5 видов организмов. Я даже. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru