Во время выбора SQL БД всегда будет ссылаться на метаданные таблицы, независимо от того, является ли это SELECT * для SELECT a, b, c ... Почему?Потому что именно там находится информация о структуре и расположении таблицы в системе.
Она должна прочитать эту информацию по двум причинам.Один, чтобы просто скомпилировать утверждение.Необходимо убедиться, что вы указали существующую таблицу как минимум.Кроме того, структура базы данных, возможно, изменилась с момента последнего выполнения оператора.
Теперь, очевидно, метаданные БД кэшируются в системе, но это все еще требует обработки.
Далее метаданные используются для генерации плана запроса.Это происходит каждый раз, когда заявление компилируется.Опять же, это работает с кэшированными метаданными, но всегда выполняется.
Единственный раз, когда эта обработка не выполняется, это когда БД использует предварительно скомпилированный запрос или кэширует предыдущий запрос.Это аргумент для использования параметров привязки, а не литерала SQL.«SELECT * FROM TABLE WHERE key = 1» - это запрос, отличный от «SELECT * FROM TABLE WHERE key =?»и «1» привязан к вызову.
БД в значительной степени полагаются на кэширование страниц для своей работы.Многие современные БД достаточно малы, чтобы полностью поместиться в памяти (или, может быть, я должен сказать, что современная память достаточно велика, чтобы вместить многие БД).Тогда ваши основные затраты на ввод-вывод на бэкэнде - это ведение журнала и сброс страниц.
Однако, если вы все еще используете диск для своей БД, первичная оптимизация, выполняемая многими системами, заключается в том, чтобы полагаться на данные.в индексах, а не в самих таблицах.
Если у вас есть:
CREATE TABLE customer (
id INTEGER NOT NULL PRIMARY KEY,
name VARCHAR(150) NOT NULL,
city VARCHAR(30),
state VARCHAR(30),
zip VARCHAR(10));
CREATE INDEX k1_customer ON customer(id, name);
Тогда, если вы выполните «SELECT id, назовите FROM customer WHERE id = 1», очень вероятно, чтоваша БД будет получать эти данные из индекса, а не из таблиц.
Почему?Вероятно, он все равно будет использовать индекс для удовлетворения запроса (против сканирования таблицы), и хотя «имя» не используется в предложении where, этот индекс по-прежнему будет лучшим вариантом для запроса.
Теперь в базе данных есть все данные, необходимые для выполнения запроса, поэтому нет причин обращаться к самим страницам таблицы.Использование индекса приводит к меньшему трафику на диске, поскольку у вас более высокая плотность строк в индексе по сравнению с таблицей в целом.
Это подробное объяснение конкретного метода оптимизации, используемого некоторыми базами данных.У многих есть несколько методов оптимизации и настройки.
В конце концов, SELECT * полезен для динамических запросов, которые вы должны вводить вручную, я бы никогда не использовал его для «реального кода».Идентификация отдельных столбцов дает БД больше информации, которую она может использовать для оптимизации запроса, и дает вам лучший контроль в вашем коде против изменений схемы и т. Д.