Estoy probando diferentes arquitecturas para tablas grandes y una sugerencia que he visto es usar una vista particionada, mediante la cual una tabla grande se divide en una serie de tablas "particionadas" más pequeñas.
Al probar este enfoque, descubrí algo que no tiene mucho sentido para mí. Cuando filtro en la "columna de partición" en la vista de hechos, el optimizador solo busca en las tablas relevantes. Además, si filtro en esa columna en la tabla de dimensiones, el optimizador elimina las tablas innecesarias.
Sin embargo, si filtro en algún otro aspecto de la dimensión, el optimizador busca en el PK / CI de cada tabla base.
Aquí están las consultas en cuestión:
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];
Aquí hay un enlace a la sesión de SQL Sentry Plan Explorer.
Estoy trabajando en particionar la tabla más grande para ver si obtengo la eliminación de la partición para responder de manera similar.
Obtengo la eliminación de particiones para la consulta (simple) que filtra un aspecto de la dimensión.
Mientras tanto, aquí hay una copia de la base de datos de solo estadísticas:
https://gist.github.com/swasheck/9a22bf8a580995d3b2aa
El "viejo" estimador de cardinalidad obtiene un plan menos costoso, pero eso se debe a las estimaciones de cardinalidad más bajas en cada una de las búsquedas de índice (innecesarias).
Me gustaría saber si hay una manera de hacer que el optimizador use la columna clave al filtrar por otro aspecto de la dimensión para que pueda eliminar búsquedas en tablas irrelevantes.
Versión de 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
tabla. No estoy obteniendo el mismo plan que Paul, incluso con 4199, y creo que es por eso.
ObservationDates
. Sin UPDATE STATISTICS ObservationDates WITH ROWCOUNT = 10000
embargo, terminé corriendo manualmente para obtener el plan que Paul demostró.
ObservationDates
así que no estoy seguro de qué está pasando con eso. Además, tampoco puedo obtener el plan Paul generado. Intentaré la actualización para ver.
CREATE STATISTICS [_WA_Sys_00000008_2FCF1A8A] ON [dbo].[Observation_2010]([StationStateCode]) WITH STATS_STREAM = 0x01000000010000000000000000000000D4531EDB00000000D5080000000000009508000000000000AF030000AF000000020000000000000008D000340000000007000000E65DE0007DA5000076F9780000000000867704000000000000000000ABAAAA3C0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000