【问题标题】:Using dot notation vs OpenQuery from SQL Server to Oracle从 SQL Server 到 Oracle 使用点表示法与 OpenQuery
【发布时间】:2019-09-21 10:04:51
【问题描述】:

试图将数据从 Oracle 导入 SQL Server。 SQL 定义了一个链接服务器。我需要在 Oracle 端过滤数据,所以有一个 WHERE 子句根据一列(时间段)的值来限制数据。

用两种不同的方法尝试性能: 开放查询:

select * INTO T2 from OpenQuery(LinkedSrv,'select * from SCHEMA.TAB')

点表示法(LinkedServer..Schema.Table):

select * INTO T2 from LinkedSrv..SCHEMA.TAB

两者的执行速度都很慢,大约 5-6k 行/秒。对于 20M 行的表,这并不理想。然后发现了一件相当有趣的事情:

select * INTO T2 from LinkedSrv..SCHEMA.TAB WHERE col >= Value

这将吞吐量提高到近 10 万行/秒

使用 OpenQuery 指定标准不会影响整个过程。解释计划显示

RemoteQuery -> ComputeScalar -> Filter (WHERE) -> TableInsert in the dot notation scenario with WHERE.

除此之外,解释计划是相同的。那么...如何在本地添加 WHERE 子句(因为这是它的作用)将吞吐量提高 10 倍???

...在使用 OpenQuery 时,我可以做些什么来实现(期望的结果)同样的快速吞吐量?

谢谢!

【问题讨论】:

    标签: sql sql-server oracle linked-server


    【解决方案1】:

    点表示法和 OpenQuery 方法之间的区别在于,第一种方法使用客户端游标引擎,大部分内容在本地计算,而第二种方法将 Query 发送到远程服务器并读取输出。

    在点表示法查询中过滤数据并不总是比 OpenQuery 方法更快。它基于本地和远程服务器资源。

    查看以下 stackoverflow 问题,他们将为您提供更多信息:

    其他信息

    【讨论】:

    • 感谢您的回复。我的问题是,仍然......如果远程服务器能够以 100k 行/秒的速度发出记录(使用本地 WHERE 子句时使用客户端游标引擎),我如何才能从远程服务器获得相同的性能 -当整个查询在那里执行时,通过 OpenQuery 模式? code select * INTO T2 from LinkedSrv..SCHEMA.TAB 拉回 4k 行/秒,而 code select * INTO T2 from LinkedSrv..SCHEMA.TAB WHERE Col > Value 拉回 100k 行/秒 在这两种情况下,数据首先被带到本地。为什么会有这样的差异?
    • @AlexV 尝试清理缓冲区缓存并再次执行查询。性能还是一样100k rows/second
    • @AlexV 我在我的答案中添加了一个链接,看看它是否包含有用的信息。
    • 在两者之前添加:DBCC DROPCLEANBUFFERS 。没有 WHERE 子句 - 慢,WHERE 子句 - 快
    • 你看到查询统计有什么不同吗mssqltips.com/sqlservertip/1255/…
    猜你喜欢
    • 2012-08-11
    • 2013-08-29
    • 2019-08-19
    • 2011-05-07
    • 1970-01-01
    • 2013-01-11
    • 1970-01-01
    • 2016-02-29
    • 2020-11-27
    相关资源
    最近更新 更多