SQL Server 2008,Sybase - 低带宽上的大型选择查询

Posted

技术标签:

【中文标题】SQL Server 2008,Sybase - 低带宽上的大型选择查询【英文标题】:SQL Server 2008, Sybase - large select queries over low bandwidth 【发布时间】:2011-02-14 09:26:34 【问题描述】:

我需要通过一条带宽非常低的线路从各种表中提取大量数据。我需要尽量减少来回发送的数据量。

那边是 Sybase 数据库,这边是 SQL Server 2008。

我需要从 Sybase 数据库中提取与该办公室有关的所有表。假设我有以下表格作为示例:

Farm 
Tree 
Branch 
etc.

(一个农场有很多树,一棵树有很多树枝等)

假设“农场”表有一个名为“CountryID”的字段,我只想要 CountryID=12 的数据。我正在查看的实际表结构非常复杂(而且我对它们也不是很熟悉),所以我想尽量保持查询简单。

所以我正在考虑设置一系列视图:

CREATE VIEW vw_Farm AS 
SELECT * from Farm where CountryID=12

CREATE VIEW vw_Tree AS 
SELECT * from Tree where FarmID in (SELECT FarmID FROM vw_Farm)

CREATE VIEW vw_Branch AS 
SELECT * from Tree where BranchID in (SELECT BranchID FROM vw_Branch)

等等

然后将实际数据拉过我会这样做:

SELECT * from vw_Farm into localDb.Farm
SELECT * from vw_Tree into localDb.Tree
SELECT * from vw_Branch into localDb.Branch

等等

设置简单。我想知道这将如何执行?它会在 Sybase 端执行所有 SELECT 语句,然后只发回结果吗?另外,由于这将是一个迭代过程,是否可以为后续调用索引视图?

也欢迎任何其他优化建议!

谢谢 卡尔

编辑:为了澄清,视图将在 SQL Server 中设置。我正在使用使用 Sybase ASE 的链接服务器来设置这些视图。特别让我担心的是,视图在这一侧的 SQL Server 中而不是在另一侧的 Sybase 上这一事实是否意味着对于每次迭代,来自前一个视图的数据将在计算之前首先被拉到 SQL Server被执行。我希望 Sybase 进行所有计算,然后将结果传递出去。

【问题讨论】:

【参考方案1】:

没有测试很难确定,但我的一些相关经验(使用链接服务器到 Sybase 以外的平台,以及在 SQL Server 2005 上)是使用子查询(例如您的代码 vw_Tree 和 @987654324 @) 或多或少保证 SQL Server 会将外部表的所有数据拉到本地临时表中,然后将其与内部查询的结果匹配。

问题在于 SQL Server 无法访问链接服务器的表统计信息,因此无法就如何优化查询做出有意义的决定。

如果您想确保在 Sybase 服务器上完成工作,最好的办法是在 Sybase 端编写代码(可以是视图或存储过程)并从 SQL Server 引用它们。

根据我的经验,链接的服务器连接在不稳定的网络上并不是特别有弹性。如果可用,您可以考虑使用集成服务而不是链接服务器查询——但即使这样也不会好多少。您可能需要考虑使用 robocopy 和 bcp 移动文本文件。

【讨论】:

嗨,埃德。您的回答中有很多坏消息,但它为我提供了找到解决方法所需的信息。非常感谢

以上是关于SQL Server 2008,Sybase - 低带宽上的大型选择查询的主要内容,如果未能解决你的问题,请参考以下文章

SQL SERVER 访问Sybase速度过慢,怎么解决?

sybase 如何像SQL SERVER一样建立作业,让他能定时运行存储过程

SQL Server“不能对包含聚合或子查询的表达式执行聚合函数”,但 Sybase 可以

通过批处理在 Sybase 中运行大量 SQL 脚本

Sybase数据库sa密码丢失后应当如何找回

在sybase11.5的sybase central中无法用sa用户登录;sql advantage中也无法登陆,同样提示错误。错误如下