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

时间:2011-02-14 09:26:34

标签: sql sql-server-2008 view query-optimization sybase-ase

我需要从具有极低带宽的线路中的各种表中提取大量数据。我需要尽量减少来回发送的数据量。

这方面是一个Sybase数据库,在这方面是SQL Server 2008。

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

Farm 
Tree 
Branch 
etc.

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

让我们说“Farm”表有一个名为“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 个答案:

答案 0 :(得分:2)

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

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

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

根据我的经验,链接服务器连接对于片状网络并不是特别有弹性。如果它可用,您可以考虑使用Integration Services而不是链接服务器查询 - 但即使这样也可能不会更好。您可能需要考虑使用robocopybcp来移动文本文件。