Я тестую різні архітектури для великих таблиць, і одна пропозиція, яку я бачив, - це використовувати розділений вид, завдяки якому велика таблиця розбивається на ряд менших «розділених» таблиць.
Тестуючи цей підхід, я виявив щось, що не має для мене великого сенсу. Коли я фільтрую "стовпчик розподілу" на перегляді фактів, оптимізатор шукає лише відповідні таблиці. Крім того, якщо я фільтрую цей стовпець таблиці вимірів, оптимізатор видаляє непотрібні таблиці.
Однак якщо я фільтрую інший аспект вимірювання, оптимізатор шукає 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 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