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

4

我无法找出外部数据表的select查询比直接查询相同表格要慢得多的原因。

表格的结构如下:

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

外部数据源是指位于同一资源组和位置的数据库。

直接查询总共70k行只需1秒钟。对外部表进行查询需要长达20分钟。

从选择中删除body列将使总时间缩短到几秒钟。因此,这肯定与传输的数据量有关。

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

2个回答

3

我已经通过将 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
谢谢,老兄。这救了我的一天。;) 我把一个查询从3分钟减少到了... 3秒钟! - Mario Lopez

0

使用具有Varchar(max)或Nvarchar(Max)的弹性表会导致巨大的延迟。您必须将源表更改为具有任何数据长度的Varchar,然后更改Elastic表以匹配。如果不更改两个表,则会出现错误。

只需运行包含这些字段的查询,然后运行不包含这些字段的查询,就可以轻松测试。您会看到很大的差异。我的简单查询通过这个修复从35分钟变成了11秒。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接