Question

Je dois tirer une grande quantité de données de différentes tables sur une ligne qui a une bande passante très faible. J'ai besoin de minimiser la quantité de données qui sont envoyées aussi et fro.

sur ce côté est une base de données Sybase, de ce côté SQL Server 2008.

Ce dont j'ai besoin, c'est de tirer toutes les tables de la base de données Sybase qui a à voir avec ce bureau. Disons que j'ai les tables suivantes comme exemple:

Farm 
Tree 
Branch 
etc.

(une ferme a de nombreux arbres, un arbre a de nombreuses branches, etc.)

permet de dire que la table "Farm" a un champ appelé "CountryID", et je veux seulement les données pour lesquelles le payside= 12. Les structures de table que je cherche sont très complexes (et je ne suis pas aussi très familier avec eux) pour que je souhaite essayer de garder les requêtes simples.

Je pense donc à mettre en place une série de vues:

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)

etc.

Pour tirer ensuite les données réelles à travers je ferais alors:

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

etc.

assez simple pour mettre en place. Je me demande comment cela va jouer cependant? Effectuera-t-il toutes les instructions Sélectionner sur le côté Sybase, puis renvoyez-vous le résultat? De plus, comme ce sera un processus itératif, est-il possible d'indexer les points de vue des appels ultérieurs?

Toute autre suggestion d'optimisation serait également la bienvenue!

Merci
Karl

Edit: Juste pour clarifier, les vues seront configurées dans SQL Server. J'utilise un serveur lié à l'aide de Sybase ASE pour configurer ces points de vue. Ce qui m'inquiète en particulier est de savoir si le fait que la vue est dans SQL Server de ce côté et non sur Sybase de ce côté signifiera que pour chaque itération, les données de la vue précutive seront extraites sur SQL Server avant les calculs être exécuté. Je veux que Sybase fasse tous les calculs et transmettez simplement les résultats.

Était-ce utile?

La solution

Il est difficile d'être certain sans tester, mais mon expérience quelque peu pertinente (à l'aide de serveurs liés aux plates-formes autres que Sybase, et sur SQL Server 2005) a été que l'utilisation de sous-requêtes (telles que votre code pour vw_Tree et vw_Branch) plus ou Moins de garanties que SQL Server tire toutes les données de la table externe dans une table Temp locale, puis la correspondre aux résultats de la requête interne.

Le problème est que SQL Server n'a pas accès aux statistiques de la table du serveur lié, afin de ne pas prendre de décisions significatives sur la manière d'optimiser la requête.

Si vous souhaitez être sûr d'avoir le travail effectué sur le serveur Sybase, votre meilleur choix sera de rédiger un code (des vues ou des procédures stockées) sur le côté Sybase et de les référer à partir de SQL Server.

Les connexions de serveur liées sont, dans mon expérience, pas particulièrement résiliente sur des réseaux flocons. Si elle est disponible, vous pouvez envisager d'utiliser des services d'intégration plutôt que des requêtes de serveur liées - mais même cela peut ne pas être beaucoup mieux. Vous devrez peut-être envisager de baisser les fichiers texte en mouvement avec Robocopy et BCP .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top