Sto testando architetture diverse per tabelle di grandi dimensioni e un suggerimento che ho visto è di utilizzare una vista partizionata, per cui una tabella di grandi dimensioni viene suddivisa in una serie di tabelle più piccole "partizionate".
Nel testare questo approccio, ho scoperto qualcosa che per me non ha molto senso. Quando filtro su "colonna di partizionamento" nella vista dei fatti, l'ottimizzatore cerca solo nelle tabelle pertinenti. Inoltre, se filtro su quella colonna nella tabella delle dimensioni, l'ottimizzatore elimina le tabelle non necessarie.
Tuttavia, se filtro su qualche altro aspetto della dimensione, l'ottimizzatore cerca sul PK / CI di ogni tabella di base.
Ecco le domande in questione:
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];
Ecco un collegamento alla sessione di SQL Sentry Plan Explorer.
Sto lavorando sul partizionamento della tabella più grande per vedere se ottengo l'eliminazione della partizione per rispondere in modo simile.
Ottengo l'eliminazione della partizione per la (semplice) query che filtra su un aspetto della dimensione.
Nel frattempo, ecco una copia solo delle statistiche del database:
https://gist.github.com/swasheck/9a22bf8a580995d3b2aa
Il "vecchio" stimatore della cardinalità ottiene un piano meno costoso, ma ciò è dovuto alle stime di cardinalità inferiori su ciascuna ricerca dell'indice (non necessaria).
Mi piacerebbe sapere se c'è un modo per ottenere l'ottimizzatore per utilizzare la colonna chiave quando si filtra da un altro aspetto della dimensione in modo che possa eliminare le ricerche su tabelle irrilevanti.
Versione di 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
tabella. Non sto ottenendo lo stesso piano di Paul, nemmeno con il 4199, e penso che questo sia il motivo.
ObservationDates
. Ho finito per correre UPDATE STATISTICS ObservationDates WITH ROWCOUNT = 10000
manualmente per ottenere il piano dimostrato da Paul.
ObservationDates
quindi non sono sicuro di cosa stia succedendo. inoltre, non riesco nemmeno a generare il piano paul. proverò l'aggiornamento per vedere.
CREATE STATISTICS [_WA_Sys_00000008_2FCF1A8A] ON [dbo].[Observation_2010]([StationStateCode]) WITH STATS_STREAM = 0x01000000010000000000000000000000D4531EDB00000000D5080000000000009508000000000000AF030000AF000000020000000000000008D000340000000007000000E65DE0007DA5000076F9780000000000867704000000000000000000ABAAAA3C0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000