Могу ли я создать индекс Sql Server, который включает в себя сводку некоторых дочерних строк?
Возможно ли в Sql Server 2016 создать какое-либо индексированное представление (или его эквивалент), которое суммирует простые отношения родитель / потомок.
например:
Parent: Vehicles
Children: Parts (the parts that make up the car)
Children: Workers (the people who helped build the car)
И результаты, как это.. например:
Car | Parts | Workers
Car_A | 1111 | 4
Car_B | 123412 | 54
Car_C | 0 | 0
Я предполагаю, что если бы я написал это как SQL-запрос (который, я полагаю, не индексируется тогда и должен "вычислить" весь ответ):
SELECT a.CarId
FROM Cars a
LEFT OUTER JOIN Parts b ON a.CarId = b.CarId
LEFT OUTER JOIN Workers c ON a.CarId = b.CarId
Теперь я предпочитаю представление "INDEXED", потому что я предполагаю, что вычисления хранятся на диске, поэтому мне нужно только выполнить сканирование индекса, чтобы получить другие результаты, вместо того, чтобы вычислять результаты на exection.
Приведенный выше пример также сокрушен (для этого вопроса). В действительности у меня есть большая структура таблицы и т. Д. И т. Д.
Я понимаю, что индексированные представления не могут иметь конкретные ключевые слова, такие как COUNT
(как упомянуто @brentozar в сообщении в блоге)
Я смотрю на эту проблему неправильно? Я действительно не хочу отвечать на кеширование SQL и быть немного более активным, здесь.
(Примечание: может быть, я делал много запросов Map/Reduce в другой базе данных NoSql:))
1 ответ
Конечно, вы можете сделать это. Данные сохраняются на диске, поэтому запросы выполняются быстрее, но недостатком является то, что индекс (или представление) необходимо поддерживать при каждом изменении базовых данных таблиц / представлений.
Подробнее об этом, прочитайте это.
РЕДАКТИРОВАТЬ: Вы просто должны использовать COUNT_BIG() вместо COUNT(), чтобы получить номера деталей и рабочих.
РЕДАКТИРОВАТЬ 2: После комментария автора ниже я вижу, что я сделал ошибку, потому что я не понял, это все о соединениях. Я не вижу отличного решения, учитывая, что вы агрегируете по транспортным средствам...
Единственное решение, которое я вижу, - если вы хотите иметь некоторую "задержку" в данных - тогда вы можете сбросить данные в таблицу. У вас может быть задание, которое вычисляет выбор во временной переменной таблица / таблица, а затем внутри транзакции усекает таблицу и выгружает в нее новые агрегированные данные. Таким образом, ваши данные будут быстро доступны из таблицы, и обмен старыми и новыми данными будет быстрым, но, как я уже говорил, это не будет полностью данные в реальном времени.