一段时间以来,我一直在尝试从InterSystem缓存数据库中通过SSMS中的链接服务器提取数据,这是为了使我们能够将数据连接到数据仓库中的其他源系统。
我已经建立了到数据库的ODBC连接和链接服务器,并且可以通过Management Studio中的OPENQUERY执行查询,但是数据量很大(> 1亿行)。因此,当我使用WHERE子句执行SQL查询时,查询只会旋转。就像没有索引或PK一样,查询正在完成大规模表扫描。
如果我在没有where子句的情况下选择TOP 100,则查询返回数据,因此我知道所有连接都是正确的。任何指导将不胜感激!
我还尝试使用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'' ')
答案 0 :(得分:0)
这看起来像是一个索引问题,如果您无权访问Cache系统,则将无法解决它。如果您知道数据以tr.Column12
的时间顺序进入缓存,或者如果您满意每行仅查询一次结果,则可以保存上次运行的最大tr.%ID
值并添加{{1 }}放入WHERE子句,因为tr.%ID>yourLastImported%ID
通常是递增的(但是特定的应用程序可以覆盖它)。尝试尝试的另一种方法是只在tr上不使用所有JOIN的情况下运行相同的查询,并查看它是否缩短了查询时间-如果问题实际上出在访问子表上,则可以做一些优化。