Вероятно, вы сталкивались с такой ситуацией, когда при написании SQL-запроса он сперва выполняется за секунду или полсекунды, а со временем процесс становится очень медленным. Чтобы понять, почему выполнение замедлилось, нужно использовать функцию EXPLAIN.
Как работает EXPLAIN? Допустим, мы взяли таблицу, заполнили рандомными данными. Затем сделали select, но перед этим написали explain. Таким образом мы получаем план запроса. EXPLAIN показывает, как наш планировщик будет выполнять запрос. Сначала его разбивает на составные части парсер, потом подключается анализатор, потом может быть рерайтер, который переписывает запрос, так как он будет эффективен.
Seq Scan означает последовательное, блок за блоком чтение данных таблицы foo.
cost – это не время, а некое сферическое в вакууме понятие, призванное оценить затраты на операции: на получение первой строки, всех строк.
rows — приблизительное количество возвращаемых строк при выполнении операции Seq Scan. Это значение возвращает планировщик.
width — средний размер одной строки в байтах.
Если вы выполняете Explain и видите Seq Scan, вам нужно либо подумать над тем, как ваша база данных спроектирована — может быть, стоит добавить ячейки, разбить какие-то данные. Ранее мы говорили о трех нормальных формах, возможно, нужно привести БД к одной из них, либо добавить индексов.
Помимо Explain также существует функция Analyze. При ее выполнении:
• считывается определенное количество строк таблицы, выбранных случайным образом;
• собирается статистика значений по каждой из колонок таблицы.