我无法找出针对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
列会将总时间减少到几秒钟。所以肯定它与传输的数据量有关。
我想我的配置出了问题。我只是不相信弹性查询引擎会如此缓慢。
答案 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 秒。