|
SQLLite возможно не видит индекс
|
|||
---|---|---|---|
#18+
Использую SQLLite из Delphi XE 10.3 через FireDac. Запрос вида Код: sql 1.
Выполняется крайне долго (много секунд). При этом тот же запрос выполненный из SQLite Studio выполняется за доли секунды, т.к. на таблице B есть индекс по key. То есть создается ощущение что FireDac почему-то этот индекс не использует. Есть ли какие-то параметры подключения которые за это отвечают? Пробовал подсовывать sqlite.dll и sqlite3.dll от SQLite Studio через SQLiteDriverLink, ситуация не меняется. Если делать запрос с ограничением количества записей, например Код: sql 1.
то время уменьшается пропорционально доле записей попавших в запрос. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.01.2021, 02:11 |
|
SQLLite возможно не видит индекс
|
|||
---|---|---|---|
#18+
asviridenkov Есть ли какие-то параметры подключения которые за это отвечают? Есть прагмы которые могут опосредованно влиять на оптимизатор. В первую очередь analysis_limit, который вместе со свободной памятью, размерами кэшей, и тд может дать как улучшение, так и ухудшение производительности. Трогать очень осторожно и настраивать на конкретную машину. Подробнее про прагмы читать тут: https://www.sqlite.org/pragma.html asviridenkov Если делать запрос с ограничением количества записей, например Код: sql 1.
то время уменьшается пропорционально доле записей попавших в запрос. У тебя с самого начала может использоваться индекс на B(key). По таблице A индекс может включиться только при ограничении записей. Запусти из своей программы и из Студии запрос Код: sql 1.
Сразу увидишь работает индекс или нет. Можешь попробовать принудительно указать индекс Код: sql 1.
Здесь B_KEY это имя индекса B(key). Но учти, это может серьезно ухудшить результат работы! Если у тебя при работе из Дельфи памяти (по мнению оптимизатора) не хватает для работы индекса, то он осознанно выкидывается из работы, поэтому при принудительном использовании - памяти станет еще меньше и все станет совсем печально. Подробно здесь https://www.sqlite.org/eqp.html#the_explain_query_plan_command И там же, есть ссылка на подробный разбор оптимизатора. Но не забудь что это все по свежайшей версии SQLite. А не по той которая внутри FireDac или имеющихся у тебя dll и студий. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.01.2021, 04:39 |
|
SQLLite возможно не видит индекс
|
|||
---|---|---|---|
#18+
Возможно размер кэша разный. Попробуй добавить PRAGMA cache_size ... |
|||
:
Нравится:
Не нравится:
|
|||
12.01.2021, 07:01 |
|
|
Start [/forum/topic.php?do_citate=40035222&fid=54&msg=40035222&tid=2008342]: |
0ms |
get settings: |
9ms |
get forum list: |
6ms |
check forum access: |
0ms |
check topic access: |
0ms |
track hit: |
15ms |
get topic data: |
3ms |
get forum data: |
1ms |
get page messages: |
19ms |
get tp. blocked users: |
0ms |
others: | 96ms |
total: | 149ms |
0 / 0 |