Testuję różne architektury dla dużych tabel i jedną z sugestii, które widziałem, jest użycie widoku podzielonego na partycje, w którym duży stół jest podzielony na serię mniejszych „podzielonych na partycje” tabel.
Testując to podejście, odkryłem coś, co nie ma dla mnie większego sensu. Kiedy filtruję „kolumnę partycjonowania” w widoku faktów, optymalizator szuka tylko odpowiednich tabel. Ponadto, jeśli filtruję tę kolumnę w tabeli wymiarów, optymalizator eliminuje niepotrzebne tabele.
Jeśli jednak odfiltruję jakiś inny aspekt wymiaru, optymalizator będzie szukał wartości PK / CI każdej tabeli podstawowej.
Oto pytania, o których mowa:
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];
Oto link do sesji SQL Sentry Plan Explorer.
Pracuję nad partycjonowaniem większej tabeli, aby zobaczyć, czy dostanę eliminację partycji, aby zareagować w podobny sposób.
Dostaję eliminację partycji dla (prostego) zapytania, które filtruje aspekt wymiaru.
Tymczasem oto kopia bazy danych przeznaczona wyłącznie do statystyk:
https://gist.github.com/swasheck/9a22bf8a580995d3b2aa
„Stary” estymator liczności otrzymuje tańszy plan, ale wynika to z niższych szacunków liczności przy każdym z (niepotrzebnych) indeksów.
Chciałbym wiedzieć, czy istnieje sposób na to, aby optymalizator użył kolumny klucza podczas filtrowania według innego aspektu wymiaru, aby mógł wyeliminować szukanie w zbędnych tabelach.
Wersja 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
tabeli. Nie dostaję tego samego planu co Paul, nawet z 4199, i myślę, że właśnie dlatego.
ObservationDates
. Skończyłem biegać UPDATE STATISTICS ObservationDates WITH ROWCOUNT = 10000
ręcznie, aby uzyskać plan, który zademonstrował Paul.
ObservationDates
więc nie jestem pewien, co się z tym dzieje. też nie jestem w stanie uzyskać planu generowanego przez Paula. Spróbuję aktualizacji, aby zobaczyć.
CREATE STATISTICS [_WA_Sys_00000008_2FCF1A8A] ON [dbo].[Observation_2010]([StationStateCode]) WITH STATS_STREAM = 0x01000000010000000000000000000000D4531EDB00000000D5080000000000009508000000000000AF030000AF000000020000000000000008D000340000000007000000E65DE0007DA5000076F9780000000000867704000000000000000000ABAAAA3C0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000