Я твердо в лагере "получай только то, что тебе нужно, когда тебе это нужно".
Извлечение дополнительных строк, которые могут вам понадобиться или не понадобиться (скажем, получение полной информации о заказе при загрузке экрана сводки заказа, на случай, если пользователь выполнит детализацию), просто приводит к гораздо более сложному запросу, возможно, к присоединениютаблицы, которые не будут использоваться большую часть времени.
В качестве администратора баз данных сложнее всего оптимизировать запросы, объединяющие большое количество таблиц.
Получение дополнительных Столбцы не так плохи, но иногда сервер может извлечь только несколько ключевых столбцов непосредственно из «индекса покрытия» вместо необходимости извлекать все столбцы из базовой таблицы.
Я думаю, чтоключ к совету, который вы услышали, состоит в том, чтобы не совершать ненужных поездок туда и обратно , когда вы можете получить все сразу, вместо того, чтобы звучать так, как будто вы говорите «получите дополнительные данные на тот случай, если они вам нужны».
Разработчики настолько привыкли к "модульности" всего, что вовсе не необычно, когда на самом деле получается конечная веб-страница, которая составляет сотню. или даже несколько тысяч обращений к базе данных для загрузки веб-страницы всего один раз .У нас есть коммерческий продукт, который, как мы измерили, совершает более 50 000 обращений к базе данных для одного действия.
Для примера (несколько надуманного), скажем, у вас естьСтраница «Сводка заказа», которая включает в себя поле «Общая сумма заказа», которое является суммой всех элементов в таблице «Детали заказа».Подход Неправильный :
- Получение списка заказов из таблицы заголовка заказа
- Программный цикл по заказам
- Для каждого заказаВыполните запрос, чтобы получить все подробные записи заказа
- Программно сложите элементы заказа, чтобы получить итоговую сумму, которая отображается в сетке
Звучит безумно, верно?Это чаще, чем вы думаете, особенно когда вы встраиваете привязанную к данным логику в отдельные веб-компоненты.Гораздо эффективнее:
Сделайте один вызов к базе данных, что-то вроде:
SELECT oh.OrderID, oh.OrderDate, SUM(od.LineTotal) as OrderTotal
FROM OrderHeader oh
INNER JOIN OrderDetail od on oh.OrderID = od.OrderID
Отобразите результаты всетка.