Sorgu bölümlendirilmiş tablolar ve dizinler üzerinde geliştirmeler işleme
SQL Server 2008 bölümlenmiş tablolarda çok paralel planları sorgu işleme performansı artırır, paralel ve seri planlar gösterilir ve her iki derleme ve çalıştırma yürütme planları içinde sağlanan bölümleme bilgilerini geliştirir şeklini değiştirir.Bu konu bu geliştirmeleri açıklar, bölümlenmiş tablolar ve dizinler sorgu yürütme planları yorumlamak rehberlik sağlar ve bölümlenmiş nesneler üzerinde sorgu performansını artırmak için en iyi yöntemleri sağlar.
Not
Partitioned tablolar ve dizinler desteklenen yalnızca,SQL ServerEnterprise ve Developer, deneme sürümleri.
Yeni bölüm duyarlı arama işlemi
In SQL Server 2008, the internal representation of a partitioned table is changed so that the table appears to the query processor to be a multicolumn index with PartitionID as the leading column.PartitionID is a hidden computed column used internally to represent the ID of the partition containing a specific row.Örneğin tablo kabul eder.Tolarak tanımlananT(a, b, c)bölümlenmiş sütun,a, ve kümelenmiş dizin sütunb.InSQL Server 2008, bu bölümlenmiş tablo dahili olmayan kabul edilir bölümlenmiş tablo şema ileT(PartitionID, a, b, c)ve bileşik anahtar kümelenmiş dizin ( PartitionID, b).Böylece sorgu iyileştiricisi gerçekleştirmek için temel işlem aramaPartitionIDbölümlenmiş bir tablo veya dizini.
Bölüm eleme şimdi yapılır bu arama işlemi.
Ayrıca, sorgu iyileştiricisi üzerinde bir koşul bir arama veya tarama işlemi yapılabilir, genişletilmişPartitionID(AS the Logical leading sütun) ve büyük olasılıkla diğer dizin anahtar sütunları ve daha sonra bir ikinci düzey arama, farklı bir durumu ile yapılabilir bir ya da karşılayan niteliği birinci düzey için ayrı ayrı her değer için daha fazla ek sütunlar operasyon. aramaAdlı başka bir deyişle, bu işlem, birTarama Atla bir arama gerçekleştirmek erişilecek bölümlerini belirlemek için bir koşula dayalı işlem ve satır, bir koşul. aşağıdaki bölümlerden geri dönmek için işleç içinde bir ikinci düzey dizin arama işlemi tarama sorgu iyileştirici sağlar. Örneğin, aşağıdaki sorguyu düşünün.
SELECT * FROM T WHERE bir<10 ve b = 2;
Bu örnek için bu tabloyu kabulTolarak tanımlananT(a, b, c)bölümlenmiş sütun,a, ve kümelenmiş dizin sütunb.Tablo için bölüm sınırlarıTaşağıdaki tarafından tanımlanan bölümleme işlev:
CREATE PARTITION işlev myRangePF1 (int) AS aralık sol için VALUES (3, 7, 10);
Sorgu çözmek için birinci düzey query processor gerçekleştirdiği işlem koşulu karşılayan satırları içeren her bölümü bulmak için aramaT.a < 10.Bu, erişilecek bölümlerini tanımlar.Tanımlanan her bölüm içinde işlemcinin daha sonra ikinci düzey gerçekleştirecek sütun üzerinde kümelenmiş dizin içinde aramabkoşulu karşılayan satırları bulmak içinT.b = 2veT.a < 10.
Aşağıdaki resimde, atlama tarama işlemi mantıksal bir temsilidir.Tablo gösterirTsütunlardaki veriler ileaveb.Bölümler, kesik çizgili dikey çizgiyle gösterilen bölüm sınırları ile 1-4 arası numaralandırılır.Bir bölümü (gösterilmez şekilde) birinci düzey arama işlemi, bölüm 1, 2 ve 3 örtük olarak bölümleme tanımlanan tablo ve sütun koşulunu arama koşulu karşılayan belirledia.Başka bir deyişle,T.a < 10.İkinci düzey arama bölümüne atlama tarama işlemi tarafından geçiş yol ile eğri çizgi gösterilmiştir.Aslında koşulu karşılayan satırları bu bölümlerin her atlama tarama işlemi ararb = 2.Arar, üç ayrı dizin gibi atlama tarama işlemi toplam maliyeti aynıdır.
Plan sorgu yürütme bölümleme bilgilerini görüntüleme
Kullanarak sorgu yürütme planları bölümlenmiş tablolar ve dizinler incelenebilirTransact-SQLküme ifadeleri küme SHOWPLAN_XML ya da küme STATISTICS XML ya da grafik yürütme planı çıktıda kullanarakSQL Server Management Studio.Örneğin, görüntüleyebilirsiniz tıklatarak derleme zamanı yürütme planıGörüntü tahmini yürütme planıQuery Editor araç ve Dahil fiili yürütme planıtıklatarak çalışma planı.
Bu araçları kullanarak, aşağıdaki bilgileri belirlemek:
Taramalar gibi işlemleri, arar, ekler, güncelleştirmeler, birleştirir ve erişim tablolar ve dizinler bölümlenmiş siler.
Sorgu tarafından erişilebilir bölümleri.Örneğin, erişilen bölümlerinin toplam sayısını ve aralıkları erişilen bitişik bölümlerinin çalışma - kullanılabilir saat yürütme planları.
Zaman atlama tarama işlemi bir veya daha çok bölümlerden verileri almak için bir arama veya tarama işleminde kullanılır.
Yürütme planları, görüntüleme hakkında daha fazla bilgi için bkz:Yürütme planı nasıl yapılır konuları.
Bölüm bilgileri ile ilgili Gelişmeler
SQL Server 2008 Her iki derleme-Gelişmiş bölümleme hakkında bilgi sağlar saat ve çalışma-saat yürütme planları.Yürütme planları şimdi aşağıdaki bilgileri sağlayın:
İsteğe bağlı birBölümlenmiş özniteliği, arama, tarama, ekleme, güncelleştirme, birleştirme veya silme, bir işleç gerçekleştirildiğini belirten bir bölümlenmiş tablo.
Yeni birSeekPredicateNew öğesi alt gibi önde gelen dizin anahtar sütun ve filtre uygulama koşullarını aralık belirten arar içeren bir SeekKeys PartitionID öğesi ile PartitionID.İki varlıkSeekKeys alt öğelerini belirtir bir atlama tarama işlemi PartitionIDkullanılır.
Erişilen disk bölümlerinin toplam sayısını sağlayan Özet bilgileri.Bu bilgiler yalnızca çalışma - kullanılabilir saat planları.
Grafik yürütme planı çıktı ve XML gösterim planı çıktı bu bilgileri nasıl görüntüleneceğini göstermek için aşağıdaki sorguyu bölümlenmiş tablo göz önünde bulundurun.fact_sales.Bu sorguyu iki bölüm verileri güncelleştirir.
UPDATE fact_sales
küme miktar = Miktar * 2
WHERE date_id BETWEEN 20080802 AND 20080902;
Özellikleri aşağıda gösterilmiştirKümelenmiş dizin arama işleç derleme-saat bu sorguyu. için yürütme planı Tanımını görüntülemek içinfact_salesTablo ve bölüm tanım, "Örnek" Bu konuda.
Bölümlenmiş öznitelik
Gibi bir işleç, birDizin arama yürütüldüğünde bölümlenmiş tablosu veya dizin, partitioned özniteliği derleme - içinde görüntülenen saat ve çalışma-saat planlamak ve ayarlanması için True(1).Öznitelik ayarlanmışsa, görüntülemiyorFalse(0).
The Partitioned attribute can appear in the following physical and logical operators:
Tablo tarama
Dizin tarama
Dizin arama
Ekleme
güncelleştirme
Sil
Birleştirme
Önceki resimde gösterildiği gibi bu öznitelik özelliklerinde görüntülenir işleç içinde olduğu tanımlanır.XML, gösterim planı çıktı, bu özelliği olarak görünürBölümlenmiş = "1"RelOp düğümünde işleç, tanımlandığı,.
Yeni doğrulama arama
, XML gösterim planı çıktı,SeekPredicateNew öğe görünür operatör hangi BT tanımlanır., İki adede kadar örnekleri içerebilirSeekKeys sub-element. İlkSeekKeys birinci düzey arama işlemi bölüm kimliği düzeyinde mantıksal dizini. öğeyi belirtir. Diğer bir deyişle, bu arama, sorgu koşullarını karşılamak için birimleri belirler.İkinciSeekKeys öğe birinci düzey arama tanımlanan her bir bölüm içinde oluşan atlama tarama işlemi ikinci düzey arama bölümünü belirtir.
Bölüm Özet bilgisi
Çalışma Zamanı Yürütme planları ', erişilen bölümleri sayısı ve erişilebilir gerçek bölüm kimliğini bölümü özet bilgi sağlar.Doğru bölüm sorguya erişilebilir ve tüm diğer bölümler dikkate elendiğinde doğrulamak için bu bilgileri kullanabilirsiniz.
Aşağıdaki bilgiler sağlanmıştır: Gerçek bölüm sayısıve bölümleri erişim.
Gerçek bölüm sayısı sorgusu. tarafından erişilen bölümlerinin toplam sayısıdır
Disk bölümleri erişim, gösterim planı XML çıktısında öğesinde yeni RuntimePartitionSummaryRelOp düğümü olarak görünen bölümü Özet bilgisi olan işleç, tanımlandığı,. İçeriği, aşağıdaki örnekte gösterilmektedirRuntimePartitionSummary öğe, (Bölüm 2 ve 3) gösteren iki toplam bölüm erişilir.
<RunTimePartitionSummary>
<PartitionsAccessed PartitionCount="2" >
<PartitionRange Start="2" End="3" />
</PartitionsAccessed>
</ RunTimePartitionSummary>
Diğer gösterim planı yöntemleri kullanarak bölümü bilgilerini görüntüleme
SHOWPLAN_ALL, SHOWPLAN_TEXT ve STATISTICS PROFILE gösterim planı yöntemleri, aşağıdaki özel durum, bu konuda anlatılan bölüm bilgileri bildirmez.Bir parçası olarakArama yüklemi, erişilecek bölümleri bir bölüm kimliği temsil eden hesaplanmış sütun aralık karşılaştırma tanımlanır Aşağıdaki örnekte gösterildiğiArama için bir Kümelenmiş dizin ara işleç. koşulunu Bölüm 2 ve 3 erişilir, ve arama operatörü filtrelerle koşulu karşılayan satırlarıdate_id BETWEEN 20080802 AND 20080902.
|--kümelenmiş dizin Seek(OBJECT:([db_sales_test].[dbo].[fact_sales].[ci]),
Arama:([PtnId1000>= (2) Ve [PtnId1000<= (3)
Ve [db_sales_test]. [dbo]. [fact_sales]. [date_id>= (20080802)
Ve [db_sales_test]. [dbo]. [fact_sales]. [date_id<(20080902) =)
İLERİYE DOĞRU SIRALI)
Bölümlenmiş kümeler için plan yürütme yorumlama
InSQL Server 2008bölümlenmiş bir yığın mantıksal bir dizin bölümünde kimliği olarak işlem görür,Bölüm eleme bölümlenmiş bir yığın üzerinde yürütme planı gösterilen birTablo tarama bir arama koşulunu bölüme kimliği işleç Aşağıdaki örnek, sağlanan gösterim planı bilgileri gösterir:
|--Tablo tarama (OBJECT: ([db].[dbo].[T]), arama: ([PtnId1001]=[Expr1011]) Sipariş İLETME)
Yürütme yorumlama Collocated birleşimler için planlar
birleştirmek birlikte bulunma aynı veya eşdeğer bir bölümleme işlev kullanılarak bölümlenmiş iki tablo ve sorguyu birleştirmek durumunu bölümleme her iki tarafında birleştirmek sütunları belirtilir oluşabilir.Sorgu iyileştirici, burada eşit bölüm kimlikleri her tablo bölümlerini ayrı ayrı katılan bir plan oluşturabilirsiniz.Daha az bellek ve işlemci saat isteyebilirsiniz çünkü collocated birleşim birleşimler olmayan collocated çok daha hızlı olabilir.İyileştirici olmayan collocated bir plan ya da Maliyet tahminleri alarak bir collocated planı seçer.
Collocated planda,İç içe döngü birleştirmek iç tarafı. bir veya birden çok Birleştirilmiş tablo ya da dizin bölümleri okur İçindeki sayılarSabit tarama Bölüm numaralarını. işleçleri göstermek
Collocated birleştirmeler için paralel planları bölümlenmiş tablolar ve dizinler için oluşturulduğunda birParallelism işleç İç içe döngü birleştirmek işleçleri. Sabit tarama arasında görünür. Bu durumda, birden çok birleştirmek okuyun ve farklı bir bölüme çalışma dış tarafındaki akıtır.
Aşağıdaki resimde gösterilmiştir bir paralel sorgu planı collocated bir birleştirmek.
Bölümlenmiş nesneleri paralel sorgu yürütme stratejisi
Query processor paralel yürütme stratejisi, bölümlenmiş nesnelerden sorgular için kullanır.Yürütme stratejisinin bir parçası, her bölüme ayırmak için sorgu ve iş parçacığı oranı için gereken tablo bölümleri query processor belirler.Çoğu durumda, sorgu işlemcisi hemen hemen eşit veya eşit sayıda her bölüm için iş parçacığı ayırır ve daha sonra sorguyu bölümleri arasında paralel olarak yürütür.Aşağıdaki paragraflarda, iş parçacığı ayırma daha ayrıntılı açıklayın.
İş parçacığı sayısını bölüm sayısı azsa, query processor başlangıçta atanan bir iş parçacığı içermeyen bir veya birden çok bölüm bırakarak, farklı bir bölüm, her iş parçacığı atar.Bir yürütme iş parçacığı sona erdiğinde, kadar her bölümü tek bir iş parçacığı atanmış olan sorgu işlemcisi, sonraki bölüme atar.Bu, diğer bölümler için iş parçacığı query processor reallocates tek durum.
İş parçacığı için bölüm sayısı ise query processor her bölüm için bir iş parçacığı atar.Bir iş parçacığı sona erdiğinde, onu başka bir bölüme reallocated değil.
İş parçacığı sayısını bölüm sayısından büyükse, her bölüm için iş parçacığı sayısı eşit query processor ayırır.İş parçacığı sayısı, bölüm sayısı tam katı değilse, sorgu işlemcisinde tüm kullanılabilir iş parçacığı kullanmak için bazı bölümleri için ek bir iş parçacığı ayırır.Yalnızca bir bölüm varsa, tüm iş parçacıkları, birime atanacak dikkat edin.Aşağıdaki çizimde, dört bölüm ve 14 iş parçacığı vardır.Her bölüm 3 iş parçacığı atanmış olan ve toplam 14 iş atamaları için ek bir iş iki bölüm vardır.Bir iş parçacığı sona erdiğinde, onu başka bir bölüme yeniden değil.
Yukarıdaki örnek iş parçacığı ayırma için kolay bir yol önerir, ancak gerçek stratejisi daha karmaşıktır ve Sorgu yürütmesi sırasında oluşan diğer değişkenler için hesaplar.Örneğin, tablo bölümlenmiş ve kümelenmiş dizin sütun olan bir ve bir sorgu olmaz koşul yan tümceWHERE A IN (13, 17, 25),query processor bir tahsis veya daha fazla iş parçacığı her birine bu üç değer arama ( A=13, A=17, ve A=25)yerine, her tablo bölümü.Yalnızca gerekli yürütmek bölümleri sorguda bu değerleri içerir ve tüm bu arama koşullarına ortaya aynı tablo bölümü olarak, tüm iş parçacıkları aynı tablo birime atanacak.
Başka bir örnek almak için düşünün tablonun dört olmadığını sütun üzerinde bir sınır noktaları (10, 20, 30) ile sütun B'deki dizin bölümleri ve sorguyu bir koşul yan tümce varsaWHERE B IN (50, 100, 150). Çünkü tablo bölümleri temel değerleri olan A, B değerlerini herhangi bir oluşabilir tablo bölümleri.Böylece, query processor her üç değeri (50, 100, 150) b her birinde dört tablo bölümleri arama.Her biri bu 12 sorgu taramalar paralel olarak çalışabilir, sorgu işlemcisi iş parçacığı orantılı olarak atayın.
sütun temel alan tablo bölümleri |
Her sütunun B arar tablo bölümü |
---|---|
tablo Bölüm 1: A<10 |
B = 50; B = 100, B = 150 |
tablo Bölüm 2: A>= 10 AND A<20 |
B = 50; B = 100, B = 150 |
tablo Bölüm 3: A>= 20 AND A<30 |
B = 50; B = 100, B = 150 |
tablo Bölüm 4: A>= 30 |
B = 50; B = 100, B = 150 |
En iyi yöntemler
Büyük bölümlenmiş tablolar ve dizinler büyük miktarda veri erişim sorguların performansını artırmak için aşağıdaki en iyi uygulamalar önerilir:
Her bölüm, pek çok disk üzerinde şeritler.
Mümkün olduğunda, bir sunucu için yeterli ana bellek kullanmak uyma sık erişilen disk bölümleri veya tüm g/Ç maliyetini azaltmak için bellek bölümü.
Dizinler ve tablolar, sorgu verileri belleğe sığmıyor, sıkıştırın.Bu g/Ç maliyetini azaltır.
Hızlı işlemciler ve olabildiğince fazla sunucu kullanmak işlemci cores olarak siz, paralel sorgu işleme yeteneği yararlanmak için göze.
Sunucu olun var. yeterli g/Ç Denetleyicisi bant genişliği
kümelenmiş dizin oluşturmak her büyük bölümlenmiş tablo B Ağaç tarama en iyi duruma getirme yararlanmak için.
Teknik İnceleme, en iyi yöntemi önerilerini izleyin "Bölümlenmiş bir tablo içinde toplu veri yükleme", toplu veri yükleme bölümlenmiş tablolar. içinde
Örnek
Aşağıdaki örnek, tek bir tablo yedi bölümleri içeren bir sınama veritabanı oluşturur.Bu örnekte, sorgu yürütülürken daha önce açıklanan araçları hem derleme ve çalıştırma planı bölümleme bilgilerini görüntülemek için kullanın.
Not
Bu örnek, 1 milyondan fazla satırı tabloya ekler.Bu örnek çalışan, donanımınıza bağlı olarak birkaç dakika sürebilir.Bu örnekte çalıştırmadan önce 1,5 GB'den fazla boş disk alanı olup olmadığını denetleyin.
USE master;
GO
IF DB_ID (N'db_sales_test') IS NOT NULL
DROP DATABASE db_sales_test;
GO
CREATE DATABASE db_sales_test;
GO
USE db_sales_test;
GO
CREATE PARTITION FUNCTION [pf_range_fact](int) AS RANGE RIGHT FOR VALUES
(20080801, 20080901, 20081001, 20081101, 20081201, 20090101);
GO
CREATE PARTITION SCHEME [ps_fact_sales] AS PARTITION [pf_range_fact]
ALL TO ([PRIMARY]);
GO
CREATE TABLE fact_sales(date_id int, product_id int, store_id int,
quantity int, unit_price numeric(7,2), other_data char(1000))
ON ps_fact_sales(date_id);
GO
CREATE CLUSTERED INDEX ci ON fact_sales(date_id);
GO
PRINT 'Loading...';
SET NOCOUNT ON;
DECLARE @i int;
SET @i = 1;
WHILE (@i<1000000)
BEGIN
INSERT INTO fact_sales VALUES(20080800 + (@i%30) + 1, @i%10000, @i%200, RAND() * 25, (@i%3) + 1, '');
SET @i += 1;
END;
GO
DECLARE @i int;
SET @i = 1;
WHILE (@i<10000)
BEGIN
INSERT INTO fact_sales VALUES(20080900 + (@i%30) + 1, @i%10000, @i%200, RAND() * 25, (@i%3) + 1, '');
SET @i += 1;
END;
PRINT 'Done.';
GO
-- Two-partition query.
SET STATISTICS XML ON;
GO
SELECT date_id, SUM(quantity*unit_price) AS total_price
FROM fact_sales
WHERE date_id BETWEEN 20080802 AND 20080902
GROUP BY date_id ;
GO
SET STATISTICS XML OFF;
GO
-- Single-partition query.
SET STATISTICS XML ON;
GO
SELECT date_id, SUM(quantity*unit_price) AS total_price
FROM fact_sales
WHERE date_id BETWEEN 20080801 AND 20080831
GROUP BY date_id;
GO
SET STATISTICS XML OFF;
GO
See Also