我在“Azure SQL数据仓库”中运行一个非常简单的查询(见下文),需要5秒钟。如果我在“Azure SQL Server”中运行相同的查询,则需要0秒,这似乎更正常。 (这个查询基本上是一堆没有条件的LEFT JOINS,如果你运行它,你会从执行计划中看到。)
这怎么可能需要5秒钟?
CREATE TABLE #output(
val INT
)
INSERT INTO #output VALUES (1)
SELECT
(SELECT val FROM #output),
(SELECT val FROM #output),
(SELECT val FROM #output),
(SELECT val FROM #output),
(SELECT val FROM #output),
(SELECT val FROM #output),
(SELECT val FROM #output),
(SELECT val FROM #output)
答案 0 :(得分:1)
Azure SQL数据仓库的提议是两位数TB的数据和数十亿行。这就是它从根本上设计的,所以你可能会发现,对于某些较小的查询,某些查询模式和它们刚刚赢得的小型数据库,就像你发现将30TB加载到SQL PaaS数据库中一样&# 39; t执行任何一项。在这些情况下,您需要重新考虑您的查询以及您是否真的想在那里运行这些查询。例如,在这种情况下,作为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等
HTH
(这应该移到dba.stackexchange.com)
PS只是为了排除显而易见的,我假设您知道您可以简单地编写此查询,并且您只是以这种方式编写它以突出显示问题:
SELECT val, val, val, val, val, val, val
FROM #output
我对此进行了一些挖掘,发现如果你连接到master数据库,那么这个查询运行得很好而且速度很快。您不能使用USE
语句来更改Azure SQL数据仓库中的数据库上下文,但如果您通过某个客户端(例如SSIS,sqlcmd)进行连接,那么这可能是一种解决方法。我仍然支持我最初的断言,即某些低容量查询模式并不特别适合此版本的产品。我还在查看EXPLAIN
关键字,该关键字提供了一种查询计划,这样您就可以了解幕后发生了什么,但那是另一个故事... < / p>