Büyük masalar için farklı mimarileri test ediyorum ve gördüğüm bir öneri, bölünmüş bir görünüm kullanmak, bu yüzden de büyük bir tablonun daha küçük, "bölümlenmiş" tablolara bölünmesi.
Bu yaklaşımı test ederken, bana anlamlı gelmeyen bir şey keşfettim. Durum görünümünde "bölümleme sütunu" nu filtrelediğimde, optimizer yalnızca ilgili tabloları arar. Ek olarak, boyut tablosundaki bu sütunu filtrelersem, optimize edici gereksiz tabloları ortadan kaldırır.
Bununla birlikte, boyutun başka bir yönüne filtre uygularsam, optimize edici her temel tablonun PK / CI'sini arar.
İşte söz konusu sorular:
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];
İşte SQL Sentry Plan Explorer oturumu için bir link .
Aslında benzer bir şekilde yanıt vermek için bölüm atma alıp almadığımı görmek için daha büyük olan tabloyu bölümlere ayırmaya çalışıyorum.
Boyutun bir yönünü filtreleyen (basit) sorgu için bölüm ortadan kaldırması alıyorum.
Bu arada, işte veritabanının sadece istatistik bir kopyası:
https://gist.github.com/swasheck/9a22bf8a580995d3b2aa
"Eski" kardinalite tahmincisi daha az pahalı bir plan alır, ancak bunun nedeni, (gereksiz) endeks aramalarının her biri için düşük kardinalite tahminleridir.
Optimize edicinin, boyutun başka bir özelliğine göre filtrelemede anahtar sütunu kullanmasını sağlamanın bir yolu olup olmadığını bilmek istiyorum, böylece alakasız tablolarda aramaları ortadan kaldırabilir.
SQL Server Sürümü:
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
masa için istatistik alamadım. Paul ile aynı planı alamıyorum, 4199'da bile ve bu yüzden böyle düşünüyorum.
ObservationDates
. UPDATE STATISTICS ObservationDates WITH ROWCOUNT = 10000
Paul'un gösterdiği planı almak için el ile koşmaya başladım .
ObservationDates
yani , dizinler) bu yüzden neler olup bittiğinden emin değilim. Ayrıca, Paul'ün planını da yapamıyorum. görmek için güncellemeyi deneyeceğim.
CREATE STATISTICS [_WA_Sys_00000008_2FCF1A8A] ON [dbo].[Observation_2010]([StationStateCode]) WITH STATS_STREAM = 0x01000000010000000000000000000000D4531EDB00000000D5080000000000009508000000000000AF030000AF000000020000000000000008D000340000000007000000E65DE0007DA5000076F9780000000000867704000000000000000000ABAAAA3C0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000