【发布时间】:2018-10-30 11:44:54
【问题描述】:
一段时间以来,我一直在尝试通过 SSMS 中的链接服务器从 InterSystem 缓存数据库中提取数据,这是为了使我们能够将数据连接到数据仓库中的其他源系统。
我已经建立了一个 ODBC 连接和一个到数据库的链接服务器,并且可以通过 Management Studio 中的 OPENQUERY 执行查询,但是数据量很大(> 1 亿行)。因此,当我使用 WHERE 子句执行 SQL 查询时,查询只是旋转。就像没有索引或 PK,查询正在完成大规模的表扫描。
如果我 SELECT TOP 100 没有 where 子句,则查询返回数据,所以我知道所有连接都是正确的。任何指导将不胜感激!
我也尝试使用 SSIS,使用从 ODBC 连接到 OLE DB 目标的数据流,但我在七个小时后取消了包。
下面的查询示例:
SELECT *
FROM OPENQUERY (InterSystem_Cache ,
'SELECT pt.Column1,
pt.Column2,
pt.Column3,
pt.Column4,
pt.Column5,
pt.Column6,
pt.Column7,
pt.Column8,
pt.Column9,
pt.Column10,
pt.Column11,
tr.Column12,
tr.Column13,
tr.Column14,
te.Column15,
te.Column16,
te.Column17,
te.Column18,
te.Column19,
te.Column20,
rs.Column21,
rs.Column22,
rs.Column23,
re.Column24,
re.Column25,
re.Column26,
tr.Column27,
tr.Column28,
re.Column29
FROM Database1.Table1 tr
LEFT JOIN Database1.Table2 te on te.Column16 = tr.Column13
LEFT JOIN Database1.Table3 rs on rs.Column23 = tr.Column28
LEFT JOIN Database1.Table4 re on re.Column25 = rs.Column22
LEFT JOIN Database1.Table5 pt on pt.Column6 = re.Column26
WHERE tr.Column12 = ''2018-10-30'' ')
【问题讨论】:
-
看看第二台服务器上的查询执行情况。在我看来,您必须使用“INNER JOIN”而不是“LEFT”。另外,在两台服务器上寻找等待,看看你的实际问题是什么。
-
很遗憾,我无法访问缓存服务器,我只能通过 ODBC 连接访问,因此无法查看源服务器上的执行计划。我想知道缓存数据库是否无法轻松读取 TSQL,或者这只是索引非常糟糕的情况。
-
我们遇到了同样的问题。我们仍然使用 openquery 提取数据。我发现这是我们在基础服务器上的索引。
-
我不能让查询运行 7 小时,看来我可能不得不要求每天的平面文件不寒而栗!
-
我在 Midas Plus(或者他们现在自称的任何东西)遇到了这个问题。通常,您必须加入一个索引“表”以进行优化。供应商并不总是显而易见或公开的,但他们应该能够为您提供指导。一些供应商会在您的环境中创建客户特定的“索引”以供使用。你只需要问。
标签: sql-server odbc linked-server intersystems-cache