Azure SQL 数据仓库的主张是两位数 TB 的数据和数十亿行。这就是它的根本设计目的,因此您很可能会发现,对于某些较小的查询、某些查询模式和较小的数据库,它们将无法执行,就像您会发现将 30TB 加载到 SQL PaaS 数据库中无法执行一样任何一个。在这些情况下,您需要重新考虑您的查询以及您是否真的想在那里运行这些查询。例如,在这种情况下,作为 UNION 查询的简单重写在我的 Azure SQL 数据仓库中带来了亚秒级的性能,例如
SELECT val FROM #output
UNION ALL
SELECT val FROM #output
UNION ALL
SELECT val FROM #output
UNION ALL
SELECT val FROM #output
UNION ALL
SELECT val FROM #output
UNION ALL
SELECT val FROM #output
UNION ALL
SELECT val FROM #output
UNION ALL
SELECT val FROM #output
SELECT *
FROM
(
SELECT 'a' s, val FROM #output
UNION ALL
SELECT 'b' s, val FROM #output
UNION ALL
SELECT 'c' s, val FROM #output
UNION ALL
SELECT 'd' s, val FROM #output
UNION ALL
SELECT 'e' s, val FROM #output
UNION ALL
SELECT 'f' s, val FROM #output
UNION ALL
SELECT 'g' s, val FROM #output
UNION ALL
SELECT 'h' s, val FROM #output
) x
PIVOT ( MAX(val) FOR s In ( [a], [b], [c], [d], [e], [f], [g], [h] ) ) pvt
-- Use CTAS to materialise the pivot view if required
CREATE TABLE #output2
WITH
(
DISTRIBUTION = ROUND_ROBIN,
LOCATION = USER_DB,
HEAP
)
AS
SELECT *
FROM
(
SELECT 'a' s, val FROM #output
UNION ALL
SELECT 'b' s, val FROM #output
UNION ALL
SELECT 'c' s, val FROM #output
UNION ALL
SELECT 'd' s, val FROM #output
UNION ALL
SELECT 'e' s, val FROM #output
UNION ALL
SELECT 'f' s, val FROM #output
UNION ALL
SELECT 'g' s, val FROM #output
UNION ALL
SELECT 'h' s, val FROM #output
) x
PIVOT ( MAX(val) FOR s In ( [a], [b], [c], [d], [e], [f], [g], [h] ) ) pvt
如果您确实需要将行作为列,您可以随时使用PIVOT
. 我最近在创建大数字表时遇到了类似的问题。原始查询使用了一个循环,这通常是不好的做法,但它在 vanilla SQL Server 上运行几秒钟,并且是一次性操作。Azure SQL Datawarehouse 的性能非常糟糕,所以我只是在本地实例上运行查询,将数据复制出来bcp
并在几分钟内将其发送到仓库中。(我还找到了一种更基于集合的方式来生成数字表:)
我们还在考虑使用产品的仓库版本中尚不可用的变更数据捕获 (CDC),因此我们研究了在 vanilla SQL Server 中托管暂存区域,在这些表上使用 CDC 并通过SSIS 和 CDC 功能。我们已经拒绝了,但你明白了;如果您有真正需要执行的查询,但不会考虑重写它们,甚至不会考虑在 VM 中拥有 SQL Server 的常规版本,然后移交给仓库,例如通过 SSIS、Polybase 等
高温高压
(这可能应该移至 dba.stackexchange.com)
PS 只是为了排除显而易见的问题,我假设您知道您可以简单地编写此查询,并且您只是以这种方式编写它以突出显示一个问题:
SELECT val, val, val, val, val, val, val
FROM #output
我对此进行了更多研究,发现如果您已连接到主数据库,那么此查询运行得又快又好。您不能使用该USE
语句来更改 Azure SQL 数据仓库中的数据库上下文,但如果您是通过某些客户端(例如 SSIS、sqlcmd)连接的,那么这可能是一种解决方法。我仍然坚持我最初的断言,即某些低容量查询模式并不特别适合这个版本的产品。我还在查看EXPLAIN
提供一种查询计划的关键字,以便您了解幕后发生的事情,但这是另一个故事......