簡體   English   中英

在Azure SQL數據倉庫表中對數據進行分區

[英]Partition data within an Azure SQL Data Warehouse table

我正在嘗試使用Azure SQL數據倉庫中的分區表。 但是我看到的東西對我來說毫無意義。 我顯然做錯了,但我不知道是什么。

我的意圖是用10000行數據填充第一個表(Marc.foo),檢查分區元數據,然后將分區切換到第二個空表(Marc.foo2)。

我首先創建兩個分區表:

IF OBJECT_ID('Marc.foo', 'U') IS NOT NULL
  DROP TABLE Marc.foo
GO

IF OBJECT_ID('Marc.foo2', 'U') IS NOT NULL
  DROP TABLE Marc.foo2
GO

CREATE TABLE Marc.foo
(
    id int NOT NULL
)
WITH 
(   
     DISTRIBUTION = HASH (id),
     CLUSTERED COLUMNSTORE INDEX, 
     PARTITION (id RANGE RIGHT FOR VALUES (0, 1000, 2000, 3000, 4000, 5000, 6000, 7000, 8000, 9000))
)
GO

CREATE TABLE Marc.foo2
(
    id int NOT NULL
)
WITH 
(   
     DISTRIBUTION = HASH (id),
     CLUSTERED COLUMNSTORE INDEX, 
     PARTITION (id RANGE RIGHT FOR VALUES (0, 1000, 2000, 3000, 4000, 5000, 6000, 7000, 8000, 9000))
)
GO

然后,我用10000行填充第一個表(Marc.foo):

IF OBJECT_ID('tempdb..#numbers', 'U') IS NOT NULL
  DROP TABLE #numbers
GO

WITH 
    CTE_2 AS (SELECT 1 as id UNION ALL SELECT 1 as id), 
    CTE_4 AS (SELECT a.id FROM CTE_2 a, CTE_2 b), 
    CTE_16 AS (SELECT a.id FROM CTE_4 a, CTE_4 b), 
    CTE_256 AS (SELECT a.id FROM CTE_16 a, CTE_16 b), 
    CTE_64K AS (SELECT a.id FROM CTE_256 a, CTE_256 b)
SELECT      id
INTO        #numbers
FROM        CTE_64K

INSERT INTO Marc.foo(id)
SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) FROM #numbers WHERE id <=10000

因為我只是將數據加載到表中,所以我將在表上創建統計信息:

CREATE STATISTICS stats_Marc_foo_id ON Marc.foo(id) WITH FULLSCAN

現在,我檢查分區元數據:

SELECT      sch.name AS [schema_name],
            tbl.[name] AS [table_name],
            ds.type_desc, 
            prt.[partition_number],
            rng.[value] AS [current_partition_range_boundary_value],
            prt.[rows] AS [partition_rows]
FROM        sys.schemas                             sch
            INNER JOIN sys.tables                   tbl ON  sch.schema_id       = tbl.schema_id
            INNER JOIN sys.partitions               prt ON  prt.[object_id]     = tbl.[object_id]
            INNER JOIN sys.indexes                  idx ON  prt.[object_id]     = idx.[object_id] AND prt.[index_id] = idx.[index_id]
            INNER JOIN sys.data_spaces              ds  ON  idx.[data_space_id] = ds.[data_space_id]
            INNER JOIN sys.partition_schemes        ps  ON  ds.[data_space_id]  = ps.[data_space_id]
            INNER JOIN sys.partition_functions      pf  ON  ps.[function_id]    = pf.[function_id]
            LEFT JOIN sys.partition_range_values    rng ON  pf.[function_id]    = rng.[function_id] AND rng.[boundary_id] = prt.[partition_number]
WHERE       sch.name = 'Marc' AND
            tbl.name = 'foo'

問題1:這給了我關於current_partition_range_boundary_value的期望,但是partition_rows(我希望是1000)為每個分區返回5957行。

最后,我嘗試將分區1從Marc.foo切換到Marc.foo2

ALTER TABLE Marc.foo SWITCH PARTITION 1 to Marc.foo2 PARTITION 1

我希望當我從Marc.foo2中進行SELECT時,我應該看到1000行的id值從1到1000。但是我又得到了零行。

問題2:我做錯了什么?

您的代碼中有錯誤。 您的CTE會為所有行帶回數字1,您可以通過檢查#numbers表的內容來確認。 因此,您的id <= 10000條件無效,該語句始終返回65,536行:

1 1 1 1 1

通過將ROW_NUMBER上移到SELECT ... INTO糾正此問題,例如

WITH 
    CTE_2 AS (SELECT 1 as id UNION ALL SELECT 1 as id), 
    CTE_4 AS (SELECT a.id FROM CTE_2 a, CTE_2 b), 
    CTE_16 AS (SELECT a.id FROM CTE_4 a, CTE_4 b), 
    CTE_256 AS (SELECT a.id FROM CTE_16 a, CTE_16 b), 
    CTE_64K AS (SELECT a.id FROM CTE_256 a, CTE_256 b)
SELECT      ROW_NUMBER() OVER (ORDER BY (SELECT NULL))  AS id
INTO        #numbers
FROM        CTE_64K

我想這個故事的寓意是,不要在未檢查的情況下編寫自己的數字生成例程:)

除了數字表,這是問題所在

問題1:這給了我關於current_partition_range_boundary_value的期望,但是partition_rows(我希望是1000)為每個分區返回5957行。

我仍然無法從中獲得期望的答案。

最后,我嘗試將分區1從Marc.fooMarc.foo2

ALTER TABLE Marc.foo SWITCH PARTITION 1 to Marc.foo2 PARTITION 1

我希望當我從Marc.foo2中進行SELECT時,我應該看到1000行的id值從1到1000。但是我又得到了零行。

問題2:我做錯了什么?

我誤解了RANGE RIGHT。 如果我們查看CREATE TABLE的partition子句,則會看到:

PARTITION (id RANGE RIGHT FOR VALUES (0, 1000, 2000, 3000, 4000, 5000, 
6000, 7000, 8000, 9000)))

這意味着ID最高但不包括零的行將位於分區1中,ID介於0和999之間的行將位於分區2中。

分區1中沒有行。這按設計進行。 如果我切換分區2,則行將出現在Marc.foo2

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM