Что означает «Строка плана: 0» в плане запроса PostgreSQL? - PullRequest
0 голосов
/ 15 октября 2018

Этот запрос показывает «Строки плана: 0» в плане запроса.

CREATE TABLE EMP (
   EMP_ID CHAR(4),
   EMP_NAME VARCHAR(200)
);
INSERT INTO EMP VALUES ( '1000', 'JOHN DOE' );
INSERT INTO EMP VALUES ( '1001', 'ALAN SMITHEE' );
INSERT INTO EMP VALUES ( '1002', 'JANE DOE' );
EXPLAIN (ANALYZE, FORMAT JSON)
   SELECT * FROM EMP WHERE EMP_ID = NULL;

Результат:

[ { "Plan": {
   "Node Type": "Result",
   "Parallel Aware": false,
   "Startup Cost": 0.00,
   "Total Cost": 0.00,
   "Plan Rows": 0,
   "Plan Width": 438,
   "Actual Startup Time": 0.001,
   "Actual Total Time": 0.001,
   "Actual Rows": 0,
   "Actual Loops": 1,
   "One-Time Filter": "false"
},
"Planning Time": 0.023,
"Triggers": [ ],
"Execution Time": 0.011 } ]

Что означает «Строка плана: 0» в этом плане запроса?

  1. PostgreSQL не сканировал ни одной записи, потому что EMP_ID = NULL всегда ложно.
  2. PostgreSQL сканировал таблицу EMP, поскольку статистика может отличаться от фактического содержимого таблицы.

Ответы [ 2 ]

0 голосов
/ 16 октября 2018

PostgreSQL обнаруживает, что emp_id = NULL всегда ложно, поэтому он вообще не сканирует таблицу, но сразу возвращает пустой результат.

«Плановые строки» - это предполагаемое количество строк результатов и0, потому что PostgreSQL знает , что не может быть строки результата.Обычно, когда PostgreSQL не может быть уверен, он оценит по крайней мере один результат, чтобы избежать очень плохих планов в случае, если его оценка выключена.

0 голосов
/ 15 октября 2018

Анализ будет сканировать таблицу каждый раз, и поскольку ваше условие всегда ложно, оно всегда будет возвращать 0 запланированных строк.Если вы продолжите вставлять строки без усечения таблицы, вы увидите, что стоимость начнет расти с увеличением вашего количества строк из-за дополнительного времени, потраченного на проверку условия where.

Из документации https://www.postgresql.org/docs/9.2/static/using-explain.html:

Значение строк немного сложнее, потому что это не количество строк, обработанных или отсканированных узлом плана, а число, испускаемое узлом.Это часто меньше, чем число сканируемых, в результате фильтрации по любым условиям предложения WHERE, которые применяются на узле.В идеале оценка строк верхнего уровня будет приблизительно равна числу строк, фактически возвращенных, обновленных или удаленных запросом.

из примера, показанного в связанной документации:

Обратите внимание, что вывод EXPLAIN показывает, что предложение WHERE применяется в качестве условия «фильтра», присоединенного к узлу плана Seq Scan. Это означает, что узел плана проверяет условие для каждой сканируемой строки и выводит только те, которые проходят условие.Оценка выходных строк была уменьшена из-за предложения WHERE.Тем не менее, сканирование все равно придется посещать все 10000 строк , поэтому стоимость не снизилась;фактически он немного увеличился (на 10000 * cpu_operator_cost, если быть точным), чтобы отразить дополнительное время ЦП, затраченное на проверку условия WHERE.

...