Jak mogę analizować wykonanie zapytania Sqlite?

Mam bazę danych Sqlite, którą chcę sprawdzić, czy indeksy są poprawne. Analizator MS SQL świetnie radzi sobie z rozkładem wykonywania zapytań i wykorzystywaniem indeksów.

Czy istnieje podobne narzędzie do Sqlite?

Author: OMG Ponies, 2009-09-21

3 answers

Nie znam żadnych ładnych narzędzi graficznych, ale wszystkie szukane informacje są dostępne ze słowa kluczowego EXPLAIN.

Rozważmy tę bazę danych:

sqlite> create table users (name, email);
sqlite> create index user_names on users (name);

Zapytanie oparte na email nie użyje indeksu:

sqlite> explain select * from users where email='foo';
0|Trace|0|0|0||00|
1|String8|0|1|0|foo|00|
2|Goto|0|13|0||00|
3|OpenRead|0|2|0|2|00|
4|Rewind|0|11|0||00|
5|Column|0|1|2||00|
6|Ne|1|10|2|collseq(BINARY)|6a|
7|Column|0|0|4||00|
8|Column|0|1|5||00|
9|ResultRow|4|2|0||00|
10|Next|0|5|0||01|
11|Close|0|0|0||00|
12|Halt|0|0|0||00|
13|Transaction|0|0|0||00|
14|VerifyCookie|0|5|0||00|
15|TableLock|0|2|0|users|00|
16|Goto|0|3|0||00|

Natomiast zapytanie bazujące na nazwie użyje indeksu user_names:

sqlite> explain select * from users where name='foo';
0|Trace|0|0|0||00|
1|String8|0|1|0|foo|00|
2|Goto|0|18|0||00|
3|OpenRead|0|2|0|2|00|
4|OpenRead|1|3|0|keyinfo(1,BINARY)|00|
5|IsNull|1|15|0||00|
6|Affinity|1|1|0|bb|00|
7|SeekGe|1|15|1|1|00|
8|IdxGE|1|15|1|1|01|
9|IdxRowid|1|2|0||00|
10|Seek|0|2|0||00|
11|Column|1|0|3||00|
12|Column|0|1|4||00|
13|ResultRow|3|2|0||00|
14|Next|1|8|0||00|
15|Close|0|0|0||00|
16|Close|1|0|0||00|
17|Halt|0|0|0||00|
18|Transaction|0|0|0||00|
19|VerifyCookie|0|5|0||00|
20|TableLock|0|2|0|users|00|
21|Goto|0|3|0||00|

Używanie {[3] } wymaga zapoznania się z maszyną wirtualną SQLite, VDBE:

Http://www.sqlite.org/vdbe.html

Ale to nie jest tak trudne, jak wygląda, i daje pełną historię o zapytaniu.

 14
Author: David Crawshaw,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-09-21 12:14:26

Jak powiedział outis:

EXPLAIN QUERY PLAN SELECT * FROM FOO

Czy sztuczka z bardziej czytelnym wyjściem, jeśli tak jak ja używasz go po prostu, aby upewnić się, że trafiasz w swoje indeksy (indeksy?)

 19
Author: Chris,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-08-04 04:27:18
 8
Author: nosklo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-04-05 18:46:12