Во время выбора 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);
Затем, если вы выполните «ВЫБРАТЬ id, имя FROM customer WHERE id = 1», весьма вероятно, что ваша БД будет извлекать эти данные из индекса, а не из таблиц.
Зачем? Он, скорее всего, в любом случае будет использовать индекс для удовлетворения запроса (в отличие от сканирования таблицы), и даже если 'name' не используется в предложении where, этот индекс по-прежнему будет лучшим вариантом для запроса.
Теперь в базе данных есть все данные, необходимые для удовлетворения запроса, поэтому нет причин обращаться к самим страницам таблицы. Использование индекса приводит к уменьшению дискового трафика, поскольку у вас более высокая плотность строк в индексе по сравнению с таблицей в целом.
Это краткое объяснение конкретного метода оптимизации, используемого некоторыми базами данных. У многих есть несколько методов оптимизации и настройки.
В конце концов, SELECT * полезен для динамических запросов, которые вам нужно вводить вручную, я бы никогда не использовал его для «реального кода». Идентификация отдельных столбцов дает БД больше информации, которую она может использовать для оптимизации запроса, и дает вам лучший контроль в вашем коде от изменений схемы и т. Д.
SELECTвыполняются / обрабатываются запросы, отличается от базы данных к базе данных.