我正在尝试执行查询并将查询插入到SQL Server中的链接服务器。
为此,我正在使用INSERT INTO OPENQUERY
语句。
链接服务器是使用Cloudera ODBC Provider的Apache HIVE。
从HIVE客户端执行插入操作大约需要1分钟。
但是,SQL INSERT总是在30秒后超时。
我将Query Timeout参数设置为0,但它似乎并没有影响INSERT语句,但是,对于花费较长时间的SELECT语句,它可以正常工作。
这是已知限制吗?
使用OPENQUERY
时是否可以更改insert语句的超时时间?
编辑
我想澄清一下我正在使用的设置。
---------- ---------------------- ---------------
| MS SQL | => Linked Server => | Hive ODBC Provider | => | Hive Server |
---------- ---------------------- ---------------
在Hive中,我有一个名为calc_result的表,我想在其中定期存储SQL Server的计算结果。例如,我尝试使用这样的查询插入。
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服务器将显示以下错误消息。
链接服务器“ HIVE”的OLE DB访问接口“ MSDASQL”返回消息“ [Cloudera] [Hardy](72)查询执行超时已过期。”。
但是,SELECT OPENQUERY
可以正常工作,并且可以遵循链接服务器的查询超时设置(在这种情况下,该设置为0)。
答案 0 :(得分:1)
编辑与我想象的完全不同。在这种情况下,选择/插入应该没有任何区别。
配置链接服务器超时后,链接服务器属性中的第二个位置可以检查提供程序字符串中的命令超时设置:
我想到的另一个选择是实例范围的timout。默认设置为600秒(10分钟),比您的30秒还高。但是,您仍然可以尝试查看是否有影响。
无限等待:
sp_configure 'show advanced options',1
go
reconfigure
go
sp_configure 'remote query timeout (s)',0
go
reconfigure
go
答案 1 :(得分:0)
我会尝试使用SELECT INTO
临时表,然后使用常规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?
答案 2 :(得分:0)
虽然我找不到从30秒更改OPENQUERY
超时的方法,但我发现使用EXEC AT
链接服务器在坚持超时设置的同时,可以很好地用于INSERT查询。
我不小心偶然发现了解决方法in this 2009 blog post。数据库可能不是我的强项,但我认为可以改进SQL Server文档。一个简单的页面列出了与链接服务器进行交互的可能方式,可以为我省去很多重试。