sql - 从 SQL Server 到 Oracle 使用点表示法与 OpenQuery

尝试将数据从 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 时,我可以做些什么来实现(期望的结果)相同的快速吞吐量?

谢谢!

最佳答案

点表示法和 OpenQuery 方法之间的区别在于,前者使用客户端游标引擎,大部分内容在本地求值,而后者将查询发送到远程服务器并读取输出。

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

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

  • SQL 2005 - Linked Server to Oracle Queries Extremely Slow

附加信息

  • Best Performer: Distributed query (Four-part) or OPENQUERY when executing linked server queries in SQL Server

https://stackoverflow.com/questions/55959977/

相关文章:

javascript - 使用 cheerio 在两个标签之间进行网页抓取

python-3.x - aiohttp异步请求的任务异常

reactjs - VSCode 不会在 typescript 中导入 组件

c# - 为什么 IServerStreamWriter 不发送通知响应?

continuous-integration - 如何在 1 个作业中定义 2 个具有不同 when

amazon-web-services - CloudFormation 无法创建 CodeDepl

amazon-dynamodb - AWS DynamoDB 中没有任何注释的普通 POJO

azure-active-directory - Azure B2C 访问 token 缺少 ten

php - 电子商务 : how to display custom success notice

angular - 重新分配通过异步管道使用的 Observable