#sql #sql-server
#sql #sql-сервер
Вопрос:
У меня есть существующая сохраненная процедура, которая выбирает набор из 25 столбцов из таблицы для выполнения действия A. Я пишу другое действие B, для которого требуется всего 3 столбца из таблицы. Только один столбец из трех, которые мне нужны, находится в индексе. Поэтому я не думаю, что была бы какая-либо существенная разница во времени выполнения запроса между действием A и действием B (поправьте меня, если я ошибаюсь), если у меня есть другой запрос, который просто извлекает три столбца. Но меня беспокоит размер пакета данных, который передается по сети, если я повторно использую тот же sproc, который использовался действием A. Должен ли я написать другой сохраненный процесс только для извлечения столбцов, которые мне нужны для действия B?
Ответ №1:
Да!
Очевидно, что невозможно сказать, насколько важна сама сетевая проблема, не зная размера задействованных столбцов, частоты, с которой вызывается процедура, и скорости вашей сети, но просто рекомендуется не возвращать клиенту ненужные столбцы (или строки). (Интересное сообщение в блоге по этому вопросу)
Это также позволит вашему запросу из 3 столбцов потенциально использовать более узкий охватывающий индекс в будущем, чтобы снизить требования к вводу-выводу запроса.
Выбор только необходимых столбцов также позволит таким инструментам, как отсутствующие индексы DMV и DTA, давать соответствующие рекомендации на основе ваших фактических требований к рабочей нагрузке и может снизить требования к памяти для запроса, поскольку вы передаете меньше данных (особенно, если у вас есть какие-либо сортировки в плане)