SQL Azure - 具有nvarchar(max)列的外部数据表的低性能

时间:2016-12-09 15:26:24

标签: sql-server performance azure

我无法找出针对select进行external data table查询的原因比对同一个表的直接查询要长得多。

表的架构如下:

CREATE EXTERNAL TABLE [WebApp].[TestTable]
(
    [TestTableId] [int] NULL,
    -- some other int columns
    [Body] [nvarchar](max) NULL,
)
WITH (DATA_SOURCE = [ExternalInterface])

external data source指的是位于同一资源组和位置的数据库。

直接查询总共70k行,在1秒内完成。 对外部表的查询最多需要20分钟。

从选择中删除body列会将总时间减少到几秒钟。所以肯定它与传输的数据量有关。

我想我的配置出了问题。我只是不相信弹性查询引擎会如此缓慢。

2 个答案:

答案 0 :(得分:2)

所以,我已经设法通过将nvarchar(max)列转换为nvarchar(n)来对此进行排序。

SELECT [TestTableId], cast([Body] as nvarchar(3000)) from WebApp.TestTable

或者,指定目标表上Body列的最大长度也可以。

alter table WebApp.TestTable alter column Body nvarchar(3000)

SQL将nvarchar(max)列中的数据视为大对象,并且由于某种原因,包含LOB列的外部表的性能非常糟糕......

答案 1 :(得分:0)

将弹性表与 Varchar(max) 或 Nvarchar(Max) 一起使用会导致巨大的延迟。无论您的最大数据长度是多少,您都必须将源表更改为 Varchar,然后将弹性表更改为匹配。如果两者都不更改,则会出错。

这很容易测试,只需运行包含这些字段的查询,然后运行不包含这些字段的查询,您就会看到很大的不同。我的简单查询仅通过这一修复就从 35 分钟缩短到 11 秒。