powered by simpleCommunicator - 2.0.18     © 2024 Programmizd 02
Map
Форумы / SQLite [игнор отключен] [закрыт для гостей] / SQLLite возможно не видит индекс
4 сообщений из 4, страница 1 из 1
SQLLite возможно не видит индекс
    #40034964
asviridenkov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Использую SQLLite из Delphi XE 10.3 через FireDac. Запрос вида

Код: sql
1.
update A set reccount=(select count(* ) from B i where i.key=A.key)



Выполняется крайне долго (много секунд). При этом тот же запрос выполненный из SQLite Studio выполняется за доли секунды, т.к. на таблице B есть индекс по key. То есть создается ощущение что FireDac почему-то этот индекс не использует.
Есть ли какие-то параметры подключения которые за это отвечают?
Пробовал подсовывать sqlite.dll и sqlite3.dll от SQLite Studio через SQLiteDriverLink, ситуация не меняется.

Если делать запрос с ограничением количества записей, например
Код: sql
1.
update A set reccount=(select count(* ) from B i where i.key=A.key) where key<1000



то время уменьшается пропорционально доле записей попавших в запрос.
...
Рейтинг: 0 / 0
SQLLite возможно не видит индекс
    #40034967
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
asviridenkov
Есть ли какие-то параметры подключения которые за это отвечают?
Нет, параметров включающих-выключающих индексы нет.
Есть прагмы которые могут опосредованно влиять на оптимизатор. В первую очередь analysis_limit, который вместе со свободной памятью, размерами кэшей, и тд может дать как улучшение, так и ухудшение производительности. Трогать очень осторожно и настраивать на конкретную машину.
Подробнее про прагмы читать тут: https://www.sqlite.org/pragma.html


asviridenkov
Если делать запрос с ограничением количества записей, например
Код: sql
1.
update A set reccount=(select count(* ) from B i where i.key=A.key) where key<1000

то время уменьшается пропорционально доле записей попавших в запрос.
Ну в общем случае - да.
У тебя с самого начала может использоваться индекс на B(key). По таблице A индекс может включиться только при ограничении записей.

Запусти из своей программы и из Студии запрос
Код: sql
1.
 EXPLAIN QUERY PLAN update A set reccount=(select count(* ) from B i where i.key=A.key)

Сразу увидишь работает индекс или нет.

Можешь попробовать принудительно указать индекс
Код: sql
1.
update A set reccount=(select count(* ) from B i INDEXED BY B_KEY where i.key=A.key)

Здесь B_KEY это имя индекса B(key).
Но учти, это может серьезно ухудшить результат работы! Если у тебя при работе из Дельфи памяти (по мнению оптимизатора) не хватает для работы индекса, то он осознанно выкидывается из работы, поэтому при принудительном использовании - памяти станет еще меньше и все станет совсем печально.

Подробно здесь
https://www.sqlite.org/eqp.html#the_explain_query_plan_command
И там же, есть ссылка на подробный разбор оптимизатора.

Но не забудь что это все по свежайшей версии SQLite. А не по той которая внутри FireDac или имеющихся у тебя dll и студий.
...
Рейтинг: 0 / 0
SQLLite возможно не видит индекс
    #40034970
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Возможно размер кэша разный. Попробуй добавить PRAGMA cache_size
...
Рейтинг: 0 / 0
SQLLite возможно не видит индекс
    #40035222
asviridenkov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем спасибо, ложная тревога - мой косяк. Это были разные базы.
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / SQLite [игнор отключен] [закрыт для гостей] / SQLLite возможно не видит индекс
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали тему (1): Анонимы (1)
Читали форум (1): Анонимы (1)
Пользователи онлайн (7): Анонимы (4), Yandex Bot 1 мин., Bing Bot 1 мин., Cat2 4 мин.
x
x
Закрыть


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