插入openquery超时

igetnqfo  于 2021-06-24  发布在  Hive
关注(0)|答案(3)|浏览(472)

我正在尝试执行查询并将其插入到SQLServer中的链接服务器。
我用的就是这个 INSERT INTO OPENQUERY 声明。
链接服务器是使用cloudera odbc提供程序的apache配置单元。
从配置单元客户端执行插入操作时,在我的设置中大约需要1分钟。
但是,SQLINSERT总是在30秒后超时。
我将query timeout参数设置为0,但它似乎不会影响insert语句,但是,对于花费较长时间的select语句,它可以正常工作。
这是已知的限制吗?在使用insert语句时,是否有方法更改insert语句的超时 OPENQUERY ?
编辑
我想澄清一下我的工作设置。

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

在hive中,我有一个名为calc\u result的表,我希望定期存储来自sql服务器的计算结果。例如,我尝试使用这样的查询插入。

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

配置单元服务器将正确捕获插入操作并启动mapreduce作业。但是,由于超时,作业将在30秒后终止。
sql server将显示以下错误消息。
链接服务器“hive”的ole db提供程序“msdasql”返回消息“[cloudera][hardy](72)查询执行超时已过期。”。
然而, SELECT OPENQUERY 工作正常,将遵循链接服务器的查询超时设置(在本例中设置为0)。

wkftcu5l

wkftcu5l1#

我会尝试使用 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;

编辑:
您可以尝试用事务 Package 它并删除别名:

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

如有必要,设置dtc:如何为链接服务器启用分布式事务?

2hh7jdfx

2hh7jdfx2#

但我没有找到改变的方法 OPENQUERY 超时30秒后,我发现 EXEC AT 链接服务器在遵守超时设置的情况下,可以很好地执行插入查询。
我在2009年的博客文章中偶然发现了这个解决方案。数据库可能不是我的强项,但我觉得sql server文档可以改进。一个简单的页面列出了与链接服务器进行交互的可能方式,这样我就省去了很多尝试。

wqlqzqxt

wqlqzqxt3#

这和我想象的完全不同。在这种情况下,select/insert应该没有任何区别。
配置链接服务器超时后,在链接服务器属性中还有第二个位置,您可以检查提供程序字符串中的命令超时设置:

我想到的另一个选择是示例范围的timout。默认设置为600秒(10分钟),远高于30秒。不过,你还是可以试试看有没有影响。
无限等待:

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

相关问题