Пояснение к таблице sqlite_stat1 - PullRequest
8 голосов
/ 16 марта 2010

Я пытаюсь диагностировать, почему определенный запрос медленнее SQLite. Похоже, есть много информации о , как работает оптимизатор запросов , но мало информации о том, как на самом деле диагностировать проблемы.

В частности, когда я анализирую базу данных, я получаю ожидаемую таблицу sqlite_stat1, но я не знаю, что говорит мне столбец stat. Пример строки:

MyTable,ix_id,25112 1 1 1 1

Что на самом деле означает «25112 1 1 1 1»?

Если говорить более широко, есть ли у кого-нибудь хорошие ресурсы по лучшим инструментам и методам диагностики производительности запросов SQLite?

Спасибо

Ответы [ 4 ]

5 голосов
/ 24 марта 2010

из analy.c:

/* Store the results.  
**
** The result is a single row of the sqlite_stmt1 table.  The first
** two columns are the names of the table and index.  The third column
** is a string composed of a list of integer statistics about the
** index.  The first integer in the list is the total number of entires
** in the index.  There is one additional integer in the list for each
** column of the table.  This additional integer is a guess of how many
** rows of the table the index will select.  If D is the count of distinct
** values and K is the total number of rows, then the integer is computed
** as:
**
**        I = (K+D-1)/D
**
** If K==0 then no entry is made into the sqlite_stat1 table.  
** If K>0 then it is always the case the D>0 so division by zero
** is never possible.
1 голос
/ 12 июля 2016

Помните, что индекс может состоять из нескольких столбцов таблицы. Таким образом, в случае «25112 1 1 1 1» это будет описано как составной индекс, который состоит из 4 столбцов таблицы. Числа означают следующее:

  • 25112 - оценка общего количества строк в индексе
  • Второе целое число (первое «1») - это оценка количества строк, имеющих одинаковое значение в 1-м столбце индекса.
  • Третье целое число (второе «1») - это оценка количества строк, имеющих одинаковое значение для первых ДВУХ столбцов индекса. Это НЕ «отчетливость» колонки 2.
  • Четвертое целое число (третье «1») - это оценка количества строк, имеющих одинаковые значения для первых ТРИ столбца в индексе.
  • Та же логика для последнего целого числа ..

Последнее целое число всегда должно быть одним. Рассмотрим таблицу с двумя строками и двумя столбцами с составным индексом, состоящим из столбца column1 + column2. Данные таблицы:

  1. Apple, красный
  2. Apple, зеленый

Статистика будет выглядеть как "2 2 1". То есть в индексе 2 строки. Есть две строки, которые будут возвращены, если только использовать column1 индекса (Apple и Apple). И 1 уникальная строка, которая будет возвращена с использованием column1 + column2 (Apple + Red уникальна от Apple + Green)

1 голос
/ 07 марта 2011

Кроме того, I = (K + D-1) / D означает: K - общее число строк, а D - различные значения для каждого столбца, так что если вы создали таблицу с CREATE TABLE TEST (C1 INT, C2 TEXT, C3 INT, C4 INT); и вы создаете индекс, как CREATE INDEX IDX on TEST(C1, C2)

Затем вы можете вручную ВСТАВИТЬ или разрешить sqlite автоматически обновлять таблицу sqlite_stat1 следующим образом: "TEST" -> TABLE NAME, "IDX" -> INDEX NAME, "10000 1 1000", HERE, 10000 - ваше общее количество строк в TABLE TEST, 1 означает, что для столбца C1 все значения кажутся Это похоже на то, что С1 - это что-то вроде идентификатора или чего-то подобного, 1000 означает, что С2 имеет менее отчетливое значение, как вы знаете, чем выше значение, тем менее отчетливы значения индекса, относящегося к конкретному столбцу.

Вы можете запустить ANALYZE или обновить таблицу вручную. (Лучше сделай первый).

Так для чего используется значение? sqlite будет использовать эту статистику, чтобы найти лучший индекс, который они хотят использовать, вы можете рассмотреть CREATE INDEX IDX2 ON TEST(C2)" AND the value in stat1 table is "10000 1 и CREATE INDEX IDX1 ON TEST(C1)" with value "10000 100"; Предположим, у нас нет индекса IDX, который мы определили ранее, когда вы выпускаете SELECT * FORM TEST WHERE C1=? AND C2=?, sqlite выберет IDX2, но не IDX1, почему? Это просто, поскольку IDX2 может минимизировать результаты запроса, а IDX1 - нет.

Ясно?

0 голосов
/ 07 марта 2011

Просто запустите объяснение QUERY PLAN + ВАШЕ ЗАЯВЛЕНИЕ SQL. Вы обнаружите, использует ли таблица, указанная в выражении, нужный вам индекс, если нет, попробуйте переписать sql, если да, определите, правильный ли индекс вы хотите использовать. Более подробную информацию, пожалуйста, обратитесь к www.sqlite.org

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...