Azure Synapse Analytics'te kaynak sınıflarıyla iş yükü yönetimi

Azure Synapse'da Synapse SQL havuzu sorgularının belleğini ve eşzamanlılığını yönetmek için kaynak sınıflarını kullanma kılavuzu.

Kaynak sınıfları nedir?

Sorgunun performans kapasitesi kullanıcının kaynak sınıfı tarafından belirlenir. Kaynak sınıfları, Synapse SQL havuzunda sorgu yürütme için işlem kaynaklarını ve eşzamanlılığı yöneten önceden belirlenmiş kaynak sınırlarıdır. Kaynak sınıfları, eşzamanlı olarak çalıştırılan sorgu sayısına ve her sorguya atanan işlem kaynaklarına sınırlar ayarlayarak sorgularınız için kaynakları yapılandırmanıza yardımcı olabilir. Bellek ve eşzamanlılık arasında bir denge vardır.

  • Daha küçük kaynak sınıfları sorgu başına bellek üst sınırını azaltır, ancak eşzamanlılığı artırır.
  • Daha büyük kaynak sınıfları sorgu başına bellek üst sınırını artırır, ancak eşzamanlılığı azaltır.

İki tür kaynak sınıfı vardır:

  • Sabit bir veri kümesi boyutu üzerinde artan eşzamanlılık için uygun olan statik kaynak sınıfları.
  • Boyutu artan ve hizmet düzeyi ölçeklendirildikçe daha yüksek performans gerektiren veri kümeleri için uygun olan dinamik kaynak sınıfları.

Kaynak sınıfları, kaynak tüketimini ölçmek için eşzamanlılık yuvaları kullanır. Eşzamanlılık yuvaları bu makalenin ilerleyen bölümlerinde açıklanmıştır.

Statik kaynak sınıfları

Statik kaynak sınıfları, veri ambarı birimlerinde ölçülen geçerli performans düzeyinden bağımsız olarak aynı miktarda bellek ayırır. Sorgular performans düzeyinden bağımsız olarak aynı bellek ayırmayı elde ettiğinden, veri ambarının ölçeği genişletilmesi bir kaynak sınıfı içinde daha fazla sorgu çalıştırılmasına olanak tanır. Statik kaynak sınıfları, veri hacmi biliniyorsa ve sabitse idealdir.

Statik kaynak sınıfları şu önceden tanımlanmış veritabanı rolleri ile uygulanır:

  • staticrc10
  • staticrc20
  • staticrc30
  • staticrc40
  • staticrc50
  • staticrc60
  • staticrc70
  • staticrc80

Dinamik kaynak sınıfları

Dinamik Kaynak Sınıfları, geçerli hizmet düzeyine bağlı olarak değişken miktarda bellek ayırır. Statik kaynak sınıfları daha yüksek eşzamanlılık ve statik veri hacimleri için yararlı olsa da, dinamik kaynak sınıfları artan veya değişken miktarda veri için daha uygundur. Ölçeği daha büyük bir hizmet düzeyine yükselttiğinizde sorgularınız otomatik olarak daha fazla bellek alır.

Dinamik kaynak sınıfları şu önceden tanımlanmış veritabanı rolleri ile uygulanır:

  • smallrc
  • mediumrc
  • daha büyük
  • xlargerc

Her kaynak sınıfı için bellek ayırma aşağıdaki gibidir.

Hizmet Düzeyi smallrc mediumrc daha büyük xlargerc
DW100c 25% 25% 25% %70
DW200c 12.5% 12.5% 22% %70
DW300c %8 %10 22% %70
DW400c %6,25 %10 22% %70
DW500c'yi seçin %5 %10 22% %70
DW1000c
DW30000c
%3 %10 22% %70

Varsayılan kaynak sınıfı

Varsayılan olarak, her kullanıcı smallrc dinamik kaynak sınıfının bir üyesidir.

Hizmet yöneticisinin kaynak sınıfı smallrc'de düzeltilmiştir ve değiştirilemez. Hizmet yöneticisi, sağlama işlemi sırasında oluşturulan kullanıcıdır. Bu bağlamda hizmet yöneticisi, yeni bir sunucuyla yeni bir Synapse SQL havuzu oluştururken "Sunucu yöneticisi oturum açma bilgileri" için belirtilen oturum açma bilgisidir.

Not

Active Directory yöneticisi olarak tanımlanan kullanıcılar veya gruplar da hizmet yöneticisidir.

Kaynak sınıfı işlemleri

Kaynak sınıfları, veri yönetimi ve işleme etkinliklerinin performansını geliştirmek için tasarlanmıştır. Karmaşık sorgular, büyük bir kaynak sınıfı altında çalışma avantajından da yararlanabilir. Örneğin, büyük birleşimler ve sıralamalar için sorgu performansı, kaynak sınıfı sorgunun bellekte yürütülmesini sağlayacak kadar büyük olduğunda iyileştirebilir.

Kaynak sınıfları tarafından yönetilen işlemler

Bu işlemler kaynak sınıfları tarafından yönetilir:

  • INSERT-SELECT, UPDATE, DELETE
  • SELECT (kullanıcı tablolarını sorgularken)
  • ALTER INDEX - YENIDEN DERLEME VEYA YENIDEN DÜZENLEME
  • ALTER TABLE REBUILD
  • CREATE INDEX
  • KÜMELENMIŞ COLUMNSTORE DIZINI OLUŞTURMA
  • SELECT OLARAK TABLO OLUŞTURMA (CTAS)
  • Veri yükleme
  • Veri Taşıma Hizmeti (DMS) tarafından gerçekleştirilen veri taşıma işlemleri

Not

Dinamik yönetim görünümlerindeki (DMV' ler) veya diğer sistem görünümlerindeki SELECT deyimleri, eşzamanlılık sınırlarının hiçbirine tabi değildir. Üzerinde yürütülen sorgu sayısından bağımsız olarak sistemi izleyebilirsiniz.

İşlemler kaynak sınıfları tarafından yönetilmiyor

Kullanıcı daha büyük bir kaynak sınıfının üyesi olsa bile bazı sorgular her zaman smallrc kaynak sınıfında çalışır. Bu muaf tutulan sorgular eşzamanlılık sınırına dahil değildir. Örneğin, eşzamanlılık sınırı 16 ise, birçok kullanıcı kullanılabilir eşzamanlılık yuvalarını etkilemeden sistem görünümlerinden seçim yapabilir.

Aşağıdaki deyimler kaynak sınıflarından muaf tutulur ve her zaman smallrc içinde çalıştırılır:

  • CREATE veya DROP TABLE
  • ALTER TABLE ... SWITCH, SPLIT veya MERGE PARTITION
  • DIZINI DEĞIŞTIR DEVRE DıŞı BıRAK
  • DROP INDEX
  • CREATE, UPDATE veya DROP STATISTICS
  • TRUNCATE TABLE
  • ALTER AUTHORIZATION
  • CREATE LOGIN
  • CREATE, ALTER veya DROP USER
  • CREATE, ALTER veya DROP PROCEDURE
  • CREATE veya DROP VIEW
  • DEĞER EKLE
  • Sistem görünümlerinden ve DMV'lerden SELECT
  • EXPLAIN
  • DBCC

Eşzamanlılık yuvaları

Eşzamanlılık yuvaları, sorgu yürütme için kullanılabilen kaynakları izlemenin kolay bir yoludur. Bunlar, bir konserde koltuk ayırmak için satın aldığınız biletler gibidir, çünkü oturma sınırlıdır. Veri ambarı başına toplam eşzamanlılık yuvası sayısı hizmet düzeyine göre belirlenir. Sorguyu yürütmeye başlamadan önce yeterli eşzamanlılık yuvası ayırabilmesi gerekir. Bir sorgu tamamlandığında eşzamanlılık yuvalarını serbest bırakır.

  • 10 eşzamanlılık yuvasıyla çalışan bir sorgu, 2 eşzamanlılık yuvasıyla çalışan bir sorgudan 5 kat daha fazla işlem kaynağına erişebilir.
  • Her sorgu 10 eşzamanlılık yuvası gerektiriyorsa ve 40 eşzamanlılık yuvası varsa, aynı anda yalnızca 4 sorgu çalıştırılabilir.

Yalnızca kaynak tarafından yönetilen sorgular eşzamanlılık yuvalarını kullanır. Sistem sorguları ve bazı önemsiz sorgular yuva kullanmaz. Kullanılan eşzamanlılık yuvalarının tam sayısı sorgunun kaynak sınıfı tarafından belirlenir.

Kaynak sınıflarını görüntüleme

Kaynak sınıfları önceden tanımlanmış veritabanı rolleri olarak uygulanır. İki tür kaynak sınıfı vardır: dinamik ve statik. Kaynak sınıflarının listesini görüntülemek için aşağıdaki sorguyu kullanın:

SELECT name
FROM   sys.database_principals
WHERE  name LIKE '%rc%' AND type_desc = 'DATABASE_ROLE';

Kullanıcının kaynak sınıfını değiştirme

Kaynak sınıfları, veritabanı rollerine kullanıcı atanarak uygulanır. Kullanıcı bir sorgu çalıştırdığında, sorgu kullanıcının kaynak sınıfıyla birlikte çalışır. Örneğin, bir kullanıcı staticrc10 veritabanı rolünün bir üyesiyse, sorguları az miktarda bellekle çalışır. Veritabanı kullanıcısı xlargerc veya staticrc80 veritabanı rollerinin üyesiyse, sorguları büyük miktarda bellekle çalışır.

Kullanıcının kaynak sınıfını artırmak için sp_addrolemember kullanarak kullanıcıyı büyük bir kaynak sınıfının veritabanı rolüne ekleyin. Aşağıdaki kod, bir kullanıcıyı largerc veritabanı rolüne ekler. Her istek sistem belleğinin %22'sini alır.

EXEC sp_addrolemember 'largerc', 'loaduser';

Kaynak sınıfını azaltmak için sp_droprolemember kullanın. 'loaduser' bir üye veya başka bir kaynak sınıfı değilse, %3 bellek izniyle varsayılan smallrc kaynak sınıfına gider.

EXEC sp_droprolemember 'largerc', 'loaduser';

Kaynak sınıfı önceliği

Kullanıcılar birden çok kaynak sınıfına üye olabilir. Bir kullanıcı birden fazla kaynak sınıfına ait olduğunda:

  • Dinamik kaynak sınıfları statik kaynak sınıflara göre önceliklidir. Örneğin, bir kullanıcı hem mediumrc(dinamik) hem de staticrc80 (statik) üyesiyse, sorgular mediumrc ile çalışır.
  • Daha büyük kaynak sınıfları, daha küçük kaynak sınıflardan önceliklidir. Örneğin, bir kullanıcı mediumrc ve largerc üyesiyse, sorgular largerc ile çalışır. Benzer şekilde, bir kullanıcı hem staticrc20 hem de statirc80 üyesiyse, sorgular staticrc80 kaynak ayırmalarıyla çalışır.

Öneriler

Not

İş yükünüz üzerinde daha fazla denetim ve öngörülebilir performans için iş yükü yönetimi özelliklerinden (iş yükü yalıtımı, sınıflandırma ve önem derecesi) yararlanmayı göz önünde bulundurun.

Belirli bir sorgu veya yükleme işlemi türünü çalıştırmaya ayrılmış bir kullanıcı oluşturmanızı öneririz. Kaynak sınıfını sık sık değiştirmek yerine bu kullanıcıya kalıcı bir kaynak sınıfı verin. Statik kaynak sınıfları iş yükü üzerinde daha fazla genel denetim sağlar, bu nedenle dinamik kaynak sınıflarını dikkate almadan önce statik kaynak sınıflarını kullanmanızı öneririz.

Yük kullanıcıları için kaynak sınıfları

CREATE TABLE varsayılan olarak kümelenmiş columnstore dizinlerini kullanır. Verileri columnstore dizinine sıkıştırmak bellek yoğunluklu bir işlemdir ve bellek baskısı dizin kalitesini düşürebilir. Bellek baskısı, verileri yüklerken daha yüksek bir kaynak sınıfına ihtiyaç duymaya neden olabilir. Yüklerin yeterli belleğe sahip olduğundan emin olmak için, yükleri çalıştırmak için belirlenmiş bir kullanıcı oluşturabilir ve bu kullanıcıyı daha yüksek bir kaynak sınıfına atayabilirsiniz.

Yükleri verimli bir şekilde işlemek için gereken bellek, yüklenen tablonun yapısına ve veri boyutuna bağlıdır. Bellek gereksinimleri hakkında daha fazla bilgi için bkz. Rowgroup kalitesini en üst düzeye çıkarma.

Bellek gereksinimini belirledikten sonra yük kullanıcısının statik veya dinamik bir kaynak sınıfına atanıp atanmayacağını seçin.

  • Tablo bellek gereksinimleri belirli bir aralığın içinde olduğunda statik kaynak sınıfı kullanın. Yükler uygun bellekle çalışır. Veri ambarını ölçeklendirdiğinizde yüklerin daha fazla belleğe ihtiyacı olmaz. Statik kaynak sınıfı kullanıldığında bellek ayırmaları sabit kalır. Bu tutarlılık bellek tasarrufu sağlar ve daha fazla sorguyu eşzamanlı olarak çalıştırmaya olanak tanır. Daha fazla denetim sağladığından, yeni çözümlerin önce statik kaynak sınıflarını kullanmasını öneririz.
  • Tablo bellek gereksinimleri çok farklı olduğunda dinamik bir kaynak sınıfı kullanın. Yükler, geçerli DWU veya cDWU düzeyinin sağladığından daha fazla bellek gerektirebilir. Veri ambarını ölçeklendirmek yükleme işlemlerine daha fazla bellek ekler ve bu da yüklerin daha hızlı performans göstermesini sağlar.

Sorgular için kaynak sınıfları

Bazı sorgular yoğun işlem gücü kullanır ve bazıları yoğun değildir.

  • Sorgular karmaşık olduğunda ancak yüksek eşzamanlılığa gerek duymadığında dinamik bir kaynak sınıfı seçin. Örneğin, günlük veya haftalık raporlar oluşturmak zaman zaman kaynaklara ihtiyaç duyar. Raporlar büyük miktarlarda veri işliyorsa, veri ambarını ölçeklendirmek kullanıcının mevcut kaynak sınıfına daha fazla bellek sağlar.
  • Kaynak beklentileri gün boyunca değiştiğinde statik bir kaynak sınıfı seçin. Örneğin, veri ambarı birçok kişi tarafından sorgulandığında statik kaynak sınıfı iyi çalışır. Veri ambarı ölçeklendirilirken kullanıcıya ayrılan bellek miktarı değişmez. Sonuç olarak, sistemde paralel olarak daha fazla sorgu yürütülebilir.

Uygun bellek atamaları sorgulanan veri miktarı, tablo şemalarının yapısı ve çeşitli birleşimler, seçme ve grup koşulları gibi birçok faktöre bağlıdır. Genel olarak, daha fazla bellek ayırma sorguların daha hızlı tamamlanmasını sağlar, ancak genel eşzamanlılığı azaltır. Eşzamanlılık sorun değilse, aşırı ayrılan bellek aktarım hızına zarar vermez.

Performansı ayarlamak için farklı kaynak sınıflarını kullanın. Sonraki bölümde, en iyi kaynak sınıfını öğrenmenize yardımcı olan saklı bir yordam velanmaktadır.

En iyi kaynak sınıfını bulmak için örnek kod

Belirli bir SLO'daki kaynak sınıfı başına eşzamanlılık ve bellek atamasını ve belirli bir kaynak sınıfındaki bölümlenmemiş CCI tablosundaki yoğun bellek kullanan CCI işlemleri için en iyi kaynak sınıfını bulmak için aşağıdaki belirtilen saklı yordamı kullanabilirsiniz:

Bu saklı yordamın amacı aşağıdadır:

  1. Belirli bir SLO'da kaynak sınıfı başına eşzamanlılığı ve bellek atamasını görmek için. Kullanıcının bu örnekte gösterildiği gibi hem şema hem de tablo adı için NULL sağlaması gerekir.
  2. Belirli bir kaynak sınıfındaki bölümlenmemiş CCI tablosunda bellek yoğunluklu CCI işlemleri (yükleme, kopyalama tablosu, dizini yeniden derleme vb.) için en iyi kaynak sınıfını görmek için. Depolanan proc, gerekli bellek atamasını bulmak için tablo şemasını kullanır.

Bağımlılık Kısıtlamaları &

  • Bu saklı yordam, bölümlenmiş cci tablosunun bellek gereksinimini hesaplamak için tasarlanmamıştır.
  • Bu saklı yordam, CTAS/INSERT-SELECT'in SELECT bölümü için bellek gereksinimlerini dikkate almaz ve bunun bir SELECT olduğunu varsayar.
  • Bu saklı yordam, bu saklı yordamın oluşturulduğu oturumda kullanılabilen geçici bir tablo kullanır.
  • Bu saklı yordam geçerli tekliflere (örneğin, donanım yapılandırması, DMS yapılandırması) bağlıdır ve bu değişikliklerden herhangi biri değişirse bu depolanmış proc düzgün çalışmaz.
  • Bu saklı yordam, mevcut eşzamanlılık sınırı tekliflerine bağlıdır ve bu değişiklikler söz konusu olduğunda bu saklı yordam düzgün çalışmaz.
  • Bu saklı yordam, mevcut kaynak sınıfı tekliflerine bağlıdır ve bu değişikliklerin değişmesi durumunda bu saklı yordam düzgün çalışmaz.

Not

Sağlanan parametrelerle saklı yordamı yürütürken çıkış almıyorsanız, iki durum olabilir.

  1. DW Parametresi geçersiz bir SLO değeri içeriyor
  2. Veya tablodaki CCI işlemi için eşleşen bir kaynak sınıfı yoktur.

Örneğin, DW100c'de kullanılabilir en yüksek bellek izni 1 GB'tır ve tablo şeması 1 GB gereksinimini aşacak kadar genişse.

Kullanım örneği

Söz dizimi:
EXEC dbo.prc_workload_management_by_DWU @DWU VARCHAR(7), @SCHEMA_NAME VARCHAR(128), @TABLE_NAME VARCHAR(128)

  1. @DWU: Geçerli DWU'nun DW DB'den ayıklanması için bir NULL parametresi sağlayın veya 'DW100c' biçiminde desteklenen DWU'ları sağlayın
  2. @SCHEMA_NAME: Tablonun şema adını belirtin
  3. @TABLE_NAME: İlgi alanının tablo adını belirtin

Bu depolanmış proc'yi yürüten örnekler:

EXEC dbo.prc_workload_management_by_DWU 'DW2000c', 'dbo', 'Table1';  
EXEC dbo.prc_workload_management_by_DWU NULL, 'dbo', 'Table1';  
EXEC dbo.prc_workload_management_by_DWU 'DW6000c', NULL, NULL;  
EXEC dbo.prc_workload_management_by_DWU NULL, NULL, NULL;  

Aşağıdaki deyim, önceki örneklerde kullanılan Table1'i oluşturur. CREATE TABLE Table1 (a int, b varchar(50), c decimal (18,10), d char(10), e varbinary(15), f float, g datetime, h date);

Saklı yordam tanımı

-------------------------------------------------------------------------------
-- Dropping prc_workload_management_by_DWU procedure if it exists.
-------------------------------------------------------------------------------
IF EXISTS (SELECT * FROM sys.objects WHERE type = 'P' AND name = 'prc_workload_management_by_DWU')
DROP PROCEDURE dbo.prc_workload_management_by_DWU
GO

-------------------------------------------------------------------------------
-- Creating prc_workload_management_by_DWU.
-------------------------------------------------------------------------------
CREATE PROCEDURE dbo.prc_workload_management_by_DWU
(@DWU VARCHAR(8),
 @SCHEMA_NAME VARCHAR(128),
 @TABLE_NAME VARCHAR(128)
)
AS

IF @DWU IS NULL
BEGIN
-- Selecting proper DWU for the current DB if not specified.

SELECT @DWU = 'DW'+ CAST(CASE WHEN Mem> 4 THEN Nodes*500
  ELSE Mem*100
  END AS VARCHAR(10)) +'c'
    FROM (
      SELECT Nodes=count(distinct n.pdw_node_id), Mem=max(i.committed_target_kb/1000/1000/60)
        FROM sys.dm_pdw_nodes n
        CROSS APPLY sys.dm_pdw_nodes_os_sys_info i
        WHERE type = 'COMPUTE')A
END

-- Dropping temp table if exists.
IF OBJECT_ID('tempdb..#ref') IS NOT NULL
BEGIN
  DROP TABLE #ref;
END;

-- Creating ref. temp table (CTAS) to hold mapping info.
CREATE TABLE #ref
WITH (DISTRIBUTION = ROUND_ROBIN)
AS
WITH
-- Creating concurrency slots mapping for various DWUs.
alloc
AS
(
SELECT 'DW100c' AS DWU,4 AS max_queries,4 AS max_slots,1 AS slots_used_smallrc,1 AS slots_used_mediumrc,2 AS slots_used_largerc,4 AS slots_used_xlargerc,1 AS slots_used_staticrc10,2 AS slots_used_staticrc20,4 AS slots_used_staticrc30,4 AS slots_used_staticrc40,4 AS slots_used_staticrc50,4 AS slots_used_staticrc60,4 AS slots_used_staticrc70,4 AS slots_used_staticrc80
  UNION ALL
   SELECT 'DW200c',8,8,1,2,4,8,1,2,4,8,8,8,8,8
  UNION ALL
   SELECT 'DW300c',12,12,1,2,4,8,1,2,4,8,8,8,8,8
  UNION ALL
   SELECT 'DW400c',16,16,1,4,8,16,1,2,4,8,16,16,16,16
  UNION ALL
   SELECT 'DW500c',20,20,1,4,8,16,1,2,4,8,16,16,16,16
  UNION ALL
   SELECT 'DW1000c',32,40,1,4,8,28,1,2,4,8,16,32,32,32
  UNION ALL
   SELECT 'DW1500c',32,60,1,6,13,42,1,2,4,8,16,32,32,32
  UNION ALL
   SELECT 'DW2000c',48,80,2,8,17,56,1,2,4,8,16,32,64,64
  UNION ALL
   SELECT 'DW2500c',48,100,3,10,22,70,1,2,4,8,16,32,64,64
  UNION ALL
   SELECT 'DW3000c',64,120,3,12,26,84,1,2,4,8,16,32,64,64
  UNION ALL
   SELECT 'DW5000c',64,200,6,20,44,140,1,2,4,8,16,32,64,128
  UNION ALL
   SELECT 'DW6000c',128,240,7,24,52,168,1,2,4,8,16,32,64,128
  UNION ALL
   SELECT 'DW7500c',128,300,9,30,66,210,1,2,4,8,16,32,64,128
  UNION ALL
   SELECT 'DW10000c',128,400,12,40,88,280,1,2,4,8,16,32,64,128
  UNION ALL
   SELECT 'DW15000c',128,600,18,60,132,420,1,2,4,8,16,32,64,128
  UNION ALL
   SELECT 'DW30000c',128,1200,36,120,264,840,1,2,4,8,16,32,64,128
)
-- Creating workload mapping to their corresponding slot consumption and default memory grant.
,map  
AS
(
  SELECT CONVERT(varchar(20), 'SloDWGroupSmall') AS wg_name, slots_used_smallrc AS slots_used FROM alloc WHERE DWU = @DWU
UNION ALL
  SELECT CONVERT(varchar(20), 'SloDWGroupMedium') AS wg_name, slots_used_mediumrc AS slots_used FROM alloc WHERE DWU = @DWU
UNION ALL
  SELECT CONVERT(varchar(20), 'SloDWGroupLarge') AS wg_name, slots_used_largerc AS slots_used FROM alloc WHERE DWU = @DWU
UNION ALL
  SELECT CONVERT(varchar(20), 'SloDWGroupXLarge') AS wg_name, slots_used_xlargerc AS slots_used FROM alloc WHERE DWU = @DWU
  UNION ALL
  SELECT 'SloDWGroupC00',1
  UNION ALL
    SELECT 'SloDWGroupC01',2
  UNION ALL
    SELECT 'SloDWGroupC02',4
  UNION ALL
    SELECT 'SloDWGroupC03',8
  UNION ALL
    SELECT 'SloDWGroupC04',16
  UNION ALL
    SELECT 'SloDWGroupC05',32
  UNION ALL
    SELECT 'SloDWGroupC06',64
  UNION ALL
    SELECT 'SloDWGroupC07',128
)

-- Creating ref based on current / asked DWU.
, ref
AS
(
  SELECT  a1.*
  ,       m1.wg_name          AS wg_name_smallrc
  ,       m1.slots_used * 250 AS tgt_mem_grant_MB_smallrc
  ,       m2.wg_name          AS wg_name_mediumrc
  ,       m2.slots_used * 250 AS tgt_mem_grant_MB_mediumrc
  ,       m3.wg_name          AS wg_name_largerc
  ,       m3.slots_used * 250 AS tgt_mem_grant_MB_largerc
  ,       m4.wg_name          AS wg_name_xlargerc
  ,       m4.slots_used * 250 AS tgt_mem_grant_MB_xlargerc
  ,       m5.wg_name          AS wg_name_staticrc10
  ,       m5.slots_used * 250 AS tgt_mem_grant_MB_staticrc10
  ,       m6.wg_name          AS wg_name_staticrc20
  ,       m6.slots_used * 250 AS tgt_mem_grant_MB_staticrc20
  ,       m7.wg_name          AS wg_name_staticrc30
  ,       m7.slots_used * 250 AS tgt_mem_grant_MB_staticrc30
  ,       m8.wg_name          AS wg_name_staticrc40
  ,       m8.slots_used * 250 AS tgt_mem_grant_MB_staticrc40
  ,       m9.wg_name          AS wg_name_staticrc50
  ,       m9.slots_used * 250 AS tgt_mem_grant_MB_staticrc50
  ,       m10.wg_name          AS wg_name_staticrc60
  ,       m10.slots_used * 250 AS tgt_mem_grant_MB_staticrc60
  ,       m11.wg_name          AS wg_name_staticrc70
  ,       m11.slots_used * 250 AS tgt_mem_grant_MB_staticrc70
  ,       m12.wg_name          AS wg_name_staticrc80
  ,       m12.slots_used * 250 AS tgt_mem_grant_MB_staticrc80
  FROM alloc a1
  JOIN map   m1  ON a1.slots_used_smallrc     = m1.slots_used and m1.wg_name = 'SloDWGroupSmall'
  JOIN map   m2  ON a1.slots_used_mediumrc    = m2.slots_used and m2.wg_name = 'SloDWGroupMedium'
  JOIN map   m3  ON a1.slots_used_largerc     = m3.slots_used and m3.wg_name = 'SloDWGroupLarge'
  JOIN map   m4  ON a1.slots_used_xlargerc    = m4.slots_used and m4.wg_name = 'SloDWGroupXLarge'
  JOIN map   m5  ON a1.slots_used_staticrc10    = m5.slots_used and m5.wg_name NOT IN ('SloDWGroupSmall','SloDWGroupMedium','SloDWGroupLarge','SloDWGroupXLarge')
  JOIN map   m6  ON a1.slots_used_staticrc20    = m6.slots_used and m6.wg_name NOT IN ('SloDWGroupSmall','SloDWGroupMedium','SloDWGroupLarge','SloDWGroupXLarge')
  JOIN map   m7  ON a1.slots_used_staticrc30    = m7.slots_used and m7.wg_name NOT IN ('SloDWGroupSmall','SloDWGroupMedium','SloDWGroupLarge','SloDWGroupXLarge')
  JOIN map   m8  ON a1.slots_used_staticrc40    = m8.slots_used and m8.wg_name NOT IN ('SloDWGroupSmall','SloDWGroupMedium','SloDWGroupLarge','SloDWGroupXLarge')
  JOIN map   m9  ON a1.slots_used_staticrc50    = m9.slots_used and m9.wg_name NOT IN ('SloDWGroupSmall','SloDWGroupMedium','SloDWGroupLarge','SloDWGroupXLarge')
  JOIN map   m10  ON a1.slots_used_staticrc60    = m10.slots_used and m10.wg_name NOT IN ('SloDWGroupSmall','SloDWGroupMedium','SloDWGroupLarge','SloDWGroupXLarge')
  JOIN map   m11  ON a1.slots_used_staticrc70    = m11.slots_used and m11.wg_name NOT IN ('SloDWGroupSmall','SloDWGroupMedium','SloDWGroupLarge','SloDWGroupXLarge')
  JOIN map   m12  ON a1.slots_used_staticrc80    = m12.slots_used and m12.wg_name NOT IN ('SloDWGroupSmall','SloDWGroupMedium','SloDWGroupLarge','SloDWGroupXLarge')
  WHERE   a1.DWU = @DWU
)
SELECT  DWU
,       max_queries
,       max_slots
,       slots_used
,       wg_name
,       tgt_mem_grant_MB
,       up1 as rc
,       (ROW_NUMBER() OVER(PARTITION BY DWU ORDER BY DWU)) as rc_id
FROM
(
    SELECT  DWU
    ,       max_queries
    ,       max_slots
    ,       slots_used
    ,       wg_name
    ,       tgt_mem_grant_MB
    ,       REVERSE(SUBSTRING(REVERSE(wg_names),1,CHARINDEX('_',REVERSE(wg_names),1)-1)) as up1
    ,       REVERSE(SUBSTRING(REVERSE(tgt_mem_grant_MBs),1,CHARINDEX('_',REVERSE(tgt_mem_grant_MBs),1)-1)) as up2
    ,       REVERSE(SUBSTRING(REVERSE(slots_used_all),1,CHARINDEX('_',REVERSE(slots_used_all),1)-1)) as up3
    FROM    ref AS r1
    UNPIVOT
    (
        wg_name FOR wg_names IN (wg_name_smallrc,wg_name_mediumrc,wg_name_largerc,wg_name_xlargerc,
        wg_name_staticrc10, wg_name_staticrc20, wg_name_staticrc30, wg_name_staticrc40, wg_name_staticrc50,
        wg_name_staticrc60, wg_name_staticrc70, wg_name_staticrc80)
    ) AS r2
    UNPIVOT
    (
        tgt_mem_grant_MB FOR tgt_mem_grant_MBs IN (tgt_mem_grant_MB_smallrc,tgt_mem_grant_MB_mediumrc,
        tgt_mem_grant_MB_largerc,tgt_mem_grant_MB_xlargerc, tgt_mem_grant_MB_staticrc10, tgt_mem_grant_MB_staticrc20,
        tgt_mem_grant_MB_staticrc30, tgt_mem_grant_MB_staticrc40, tgt_mem_grant_MB_staticrc50,
        tgt_mem_grant_MB_staticrc60, tgt_mem_grant_MB_staticrc70, tgt_mem_grant_MB_staticrc80)
    ) AS r3
    UNPIVOT
    (
        slots_used FOR slots_used_all IN (slots_used_smallrc,slots_used_mediumrc,slots_used_largerc,
        slots_used_xlargerc, slots_used_staticrc10, slots_used_staticrc20, slots_used_staticrc30,
        slots_used_staticrc40, slots_used_staticrc50, slots_used_staticrc60, slots_used_staticrc70,
        slots_used_staticrc80)
    ) AS r4
) a
WHERE   up1 = up2
AND     up1 = up3
;

-- Getting current info about workload groups.
WITH  
dmv  
AS  
(
  SELECT
          rp.name                                           AS rp_name
  ,       rp.max_memory_kb*1.0/1048576                      AS rp_max_mem_GB
  ,       (rp.max_memory_kb*1.0/1024)
          *(request_max_memory_grant_percent/100)           AS max_memory_grant_MB
  ,       (rp.max_memory_kb*1.0/1048576)
          *(request_max_memory_grant_percent/100)           AS max_memory_grant_GB
  ,       wg.name                                           AS wg_name
  ,       wg.importance                                     AS importance
  ,       wg.request_max_memory_grant_percent               AS request_max_memory_grant_percent
  FROM    sys.dm_pdw_nodes_resource_governor_workload_groups wg
  JOIN    sys.dm_pdw_nodes_resource_governor_resource_pools rp    ON  wg.pdw_node_id  = rp.pdw_node_id
                                                                  AND wg.pool_id      = rp.pool_id
  WHERE   rp.name = 'SloDWPool'
  GROUP BY
          rp.name
  ,       rp.max_memory_kb
  ,       wg.name
  ,       wg.importance
  ,       wg.request_max_memory_grant_percent
)
-- Creating resource class name mapping.
,names
AS
(
  SELECT 'smallrc' as resource_class, 1 as rc_id
  UNION ALL
    SELECT 'mediumrc', 2
  UNION ALL
    SELECT 'largerc', 3
  UNION ALL
    SELECT 'xlargerc', 4
  UNION ALL
    SELECT 'staticrc10', 5
  UNION ALL
    SELECT 'staticrc20', 6
  UNION ALL
    SELECT 'staticrc30', 7
  UNION ALL
    SELECT 'staticrc40', 8
  UNION ALL
    SELECT 'staticrc50', 9
  UNION ALL
    SELECT 'staticrc60', 10
  UNION ALL
    SELECT 'staticrc70', 11
  UNION ALL
    SELECT 'staticrc80', 12
)
,base AS
(   SELECT  schema_name
    ,       table_name
    ,       SUM(column_count)                   AS column_count
    ,       ISNULL(SUM(short_string_column_count),0)   AS short_string_column_count
    ,       ISNULL(SUM(long_string_column_count),0)    AS long_string_column_count
    FROM    (   SELECT  sm.name                                             AS schema_name
                ,       tb.name                                             AS table_name
                ,       COUNT(co.column_id)                                 AS column_count
                           ,       CASE    WHEN co.system_type_id IN (36,43,106,108,165,167,173,175,231,239)
                                AND  co.max_length <= 32
                                THEN COUNT(co.column_id)
                        END                                                 AS short_string_column_count
                ,       CASE    WHEN co.system_type_id IN (165,167,173,175,231,239)
                                AND  co.max_length > 32 and co.max_length <=8000
                                THEN COUNT(co.column_id)
                        END                                                 AS long_string_column_count
                FROM    sys.schemas AS sm
                JOIN    sys.tables  AS tb   on sm.[schema_id] = tb.[schema_id]
                JOIN    sys.columns AS co   ON tb.[object_id] = co.[object_id]
                           WHERE tb.name = @TABLE_NAME AND sm.name = @SCHEMA_NAME
                GROUP BY sm.name
                ,        tb.name
                ,        co.system_type_id
                ,        co.max_length            ) a
GROUP BY schema_name
,        table_name
)
, size AS
(
SELECT  schema_name
,       table_name
,       75497472                                            AS table_overhead

,       column_count*1048576*8                              AS column_size
,       short_string_column_count*1048576*32                       AS short_string_size,       (long_string_column_count*16777216) AS long_string_size
FROM    base
UNION
SELECT CASE WHEN COUNT(*) = 0 THEN 'EMPTY' END as schema_name
         ,CASE WHEN COUNT(*) = 0 THEN 'EMPTY' END as table_name
         ,CASE WHEN COUNT(*) = 0 THEN 0 END as table_overhead
         ,CASE WHEN COUNT(*) = 0 THEN 0 END as column_size
         ,CASE WHEN COUNT(*) = 0 THEN 0 END as short_string_size

,CASE WHEN COUNT(*) = 0 THEN 0 END as long_string_size
FROM   base
)
, load_multiplier as
(
SELECT  CASE
          WHEN FLOOR(8 * (CAST (CAST(REPLACE(REPLACE(@DWU,'DW',''),'c','') AS INT) AS FLOAT)/6000)) > 0
            AND CHARINDEX(@DWU,'c')=0
          THEN FLOOR(8 * (CAST (CAST(REPLACE(REPLACE(@DWU,'DW',''),'c','') AS INT) AS FLOAT)/6000))
          ELSE 1
        END AS multiplication_factor
)
       SELECT  r1.DWU
       , schema_name
       , table_name
       , rc.resource_class as closest_rc_in_increasing_order
       , max_queries_at_this_rc = CASE
             WHEN (r1.max_slots / r1.slots_used > r1.max_queries)
                  THEN r1.max_queries
             ELSE r1.max_slots / r1.slots_used
                  END
       , r1.max_slots as max_concurrency_slots
       , r1.slots_used as required_slots_for_the_rc
       , r1.tgt_mem_grant_MB  as rc_mem_grant_MB
       , CAST((table_overhead*1.0+column_size+short_string_size+long_string_size)*multiplication_factor/1048576    AS DECIMAL(18,2)) AS est_mem_grant_required_for_cci_operation_MB
       FROM    size
       , load_multiplier
       , #ref r1, names  rc
       WHERE r1.rc_id=rc.rc_id
                     AND CAST((table_overhead*1.0+column_size+short_string_size+long_string_size)*multiplication_factor/1048576    AS DECIMAL(18,2)) < r1.tgt_mem_grant_MB
       ORDER BY ABS(CAST((table_overhead*1.0+column_size+short_string_size+long_string_size)*multiplication_factor/1048576    AS DECIMAL(18,2)) - r1.tgt_mem_grant_MB)
GO

Sonraki adımlar

Veritabanı kullanıcılarını ve güvenliğini yönetme hakkında daha fazla bilgi için bkz. Synapse SQL'de veritabanının güvenliğini sağlama. Daha büyük kaynak sınıflarının kümelenmiş columnstore dizin kalitesini nasıl iyileştirebileceği hakkında daha fazla bilgi için bkz. Columnstore sıkıştırması için bellek iyileştirmeleri.