Я тестирую разные архитектуры для больших таблиц, и я видел одно предложение - использовать секционированное представление, при котором большая таблица разбивается на серию меньших «секционированных» таблиц.
Тестируя этот подход, я обнаружил что-то, что не имеет большого смысла для меня. Когда я фильтрую «столбец разделения» в представлении фактов, оптимизатор ищет только соответствующие таблицы. Кроме того, если я фильтрую этот столбец таблицы измерений, оптимизатор удаляет ненужные таблицы.
Однако, если я отфильтрую какой-либо другой аспект измерения, оптимизатор будет искать PK / CI каждой базовой таблицы.
Вот вопросы, о которых идет речь:
select
od.[Year],
AvgValue = avg(ObservationValue)
from dbo.v_Observation o
join dbo.ObservationDates od
on o.ObservationDateKey = od.DateKey
where o.ObservationDateKey >= 20000101
and o.ObservationDateKey <= 20051231
group by od.[Year];
select
od.[Year],
AvgValue = avg(ObservationValue)
from dbo.v_Observation o
join dbo.ObservationDates od
on o.ObservationDateKey = od.DateKey
where od.DateKey >= 20000101
and od.DateKey <= 20051231
group by od.[Year];
select
od.[Year],
AvgValue = avg(ObservationValue)
from dbo.v_Observation o
join dbo.ObservationDates od
on o.ObservationDateKey = od.DateKey
where od.[Year] >= 2000 and od.[Year] < 2006
group by od.[Year];
Вот ссылка на сессию SQL Sentry Plan Explorer.
Я работаю над секционированием таблицы большего размера, чтобы посмотреть, получу ли я удаление раздела, чтобы ответить таким же образом.
Я получаю исключение раздела для (простого) запроса, который фильтрует по аспекту измерения.
А пока вот копия базы данных только для статистики:
https://gist.github.com/swasheck/9a22bf8a580995d3b2aa
«Старый» оценщик количества элементов получает менее дорогой план, но это из-за более низких оценок количества элементов для каждого (ненужного) индекса поиска.
Я хотел бы знать, есть ли способ заставить оптимизатор использовать ключевой столбец при фильтрации по другому аспекту измерения, чтобы он мог исключить поиски в нерелевантных таблицах.
Версия SQL Server:
Microsoft SQL Server 2014 - 12.0.2000.8 (X64)
Feb 20 2014 20:04:26
Copyright (c) Microsoft Corporation
Developer Edition (64-bit) on Windows NT 6.3 <X64> (Build 9600: ) (Hypervisor)
ObservationDates
таблице. У меня не такой же план, как у Пола, даже с 4199, и я думаю, что именно поэтому.
ObservationDates
. Я закончил работать UPDATE STATISTICS ObservationDates WITH ROWCOUNT = 10000
вручную, чтобы получить план, который продемонстрировал Пол.
ObservationDates
так что я не уверен, что с этим происходит. Кроме того, я также не могу получить план Пола. Я попробую обновление, чтобы увидеть.
CREATE STATISTICS [_WA_Sys_00000008_2FCF1A8A] ON [dbo].[Observation_2010]([StationStateCode]) WITH STATS_STREAM = 0x01000000010000000000000000000000D4531EDB00000000D5080000000000009508000000000000AF030000AF000000020000000000000008D000340000000007000000E65DE0007DA5000076F9780000000000867704000000000000000000ABAAAA3C0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000