插入 OPENQUERY 超时

INSERT OPENQUERY timeout

我正在尝试执行查询并将查询插入 SQL 服务器中的链接服务器。

为此,我正在使用 INSERT INTO OPENQUERY 语句。

链接服务器是使用 Cloudera ODBC Provider 的 Apache HIVE。

从 HIVE 客户端执行时,插入操作在我的设置中大约需要 1 分钟。

但是,SQL INSERT 总是在 30 秒后超时。

我将 Query Timeout 参数设置为 0,但它似乎不影响 INSERT 语句,但是,对于需要较长时间的 SELECT 语句,它工作正常。

这是已知的限制吗? 使用 OPENQUERY 时是否可以更改插入语句的超时?

编辑

我想澄清一下我正在使用的设置。

----------                     ----------------------    ---------------
| MS SQL | => Linked Server => | Hive ODBC Provider | => | Hive Server |
----------                     ----------------------    ---------------

在 Hive 中,我有一个名为 calc_result 的 table,我想在其中定期存储来自 SQL 服务器的计算结果。例如,我尝试使用这样的查询进行插入。

insert openquery(HIVE, 'select timestamp timestamp , tag tag, value value from calc_result')
values('2019-04-22 11:50:41', 'test',2.0)

插入操作被 HIVE 服务器正确捕获,并且 MapReduce 作业开始。但是,由于超时,作业将在 30 秒后被杀死。

SQL 服务器将显示以下错误消息。

OLE DB provider "MSDASQL" for linked server "HIVE" returned message "[Cloudera][Hardy] (72) Query execution timeout expired.".

但是,SELECT OPENQUERY 工作正常并且会遵循链接服务器的 查询超时 设置(在本例中设置为 0)。

Edit 这与我想象的完全不同的用例。在那种情况下,select/insert 应该没有任何区别。

由于您配置了链接服务器超时,链接服务器属性中还有第二个位置,您可以检查提供程序字符串中的 命令超时 设置:

我想到的另一个选项是实例范围的超时。默认设置为 600 秒(10 分钟),远高于您的 30 秒。不过大家还是可以试试看有没有影响。

无限等待:

sp_configure 'show advanced options',1
go
reconfigure
go
sp_configure 'remote query timeout (s)',0
go
reconfigure
go

我会尝试使用 SELECT INTO 临时 table 然后使用常规 INSERT INTO:

实现它
SELECT c1, c2
INTO #temp_tab
FROM OPENQUERY(mylinkedserver, 'SELECT c1, c2 FROM remote_table');

INSERT INTO normal_table(col1, col2)
SELECT c1, c2
FROM #temp_tab;

编辑:

您可以尝试用事务包装它并删除别名:

BEGIN TRAN;
insert openquery(HIVE, 'select timestamp, tag, value from calc_result')
values('2019-04-22 11:50:41', 'test',2.0);
COMMIT;

如有必要,设置 DTC:How can I enable distributed transactions for a linked server?

虽然我没有找到将OPENQUERY超时从 30 秒更改为 30 秒的方法,但我发现使用 EXEC AT 链接服务器可以在遵守超时设置的同时很好地处理 INSERT 查询。

我偶然发现了解决方案 in this 2009 blog post。数据库可能不是我的强项,但我觉得 SQL 服务器文档可以改进。列出与链接服务器交互的可能方式的简单页面可以让我避免多次重试。