Serveur lié Performance et d'options
Au travail, nous avons deux serveurs, l'un est en cours d'exécution d'une application beaucoup de gens utilisent qui a un Serveur SQL 2000. J'ai été libre d'interroger ce pendant une longue période, mais ne peut pas ajouter quoi que ce soit comme les procédures stockées ou des tables supplémentaires.
Cela l'a conduit à avoir un deuxième SQL Server liée à la première et à me constituer une bibliothèque de procédures stockées les données de la requête à partir de deux côtés à l'aide du serveur lié. Certaines de ces requêtes prennent plus de temps que ce que je voudrais.
Quelqu'un peut-il m'indiquer quelques bons articles sur l'utilisation de serveurs liés? Je suis particulièrement intéressé à trouver ce que des données sont transférées entre les deux, comme d'habitude, la majorité de l'instruction sql peut être effectuée à distance, mais j'ai le sentiment qu'il peut être le transfert de l'intégralité des tables, il est généralement juste une jointure à une petite table finale localement.
Également que les options de serveur lié faire j'ai actuellement:
- Compatible Avec Le Classement Vrai
- D'Accès Aux Données Vraie
- Rpc Vrai
- Rpc Vrai
- L'Utilisation À Distance De Classement Faux
- Nom De Classement (Vide)
- Délai D'Attente De Connexion 0
- Délai D'Expiration De Requête 0
EDIT:
Juste pensé que je mettrais à jour ce post, j'ai utilisé openqueries avec les paramètres de la dynamique pour un certain temps pour améliorer la performance, merci pour l'astuce. Cependant en faisant cela peut faire des requêtes plus de désordre que vous finissent par traiter des chaînes de caractères. enfin, cet été, nous avons mis à niveau SQL Server 2008 et mis en œuvre en direct de données mise en miroir. Pour être honnête, les requêtes ouvertes à l'approche de la vitesse de requêtes locales pour mes tâches, mais la mise en miroir a certainement fait le sql plus facile à traiter.
OriginalL'auteur PeteT | 2008-09-25
Vous devez vous connecter pour publier un commentaire.
Je vous conseille dynamique openqueries dans un curseur de la boucle au lieu de lié les jointures.
C'est le seul moyen que j'ai été capable de reproduire MS Access liée joindre à la performance (au moins pour une seule des tables distantes)
Régulier lié rejoint dans ms sql sont trop inefficace en tirant tout spécialement dans humongous tables..
-- Je voudrais savoir ce qui est si mal à propos de openqueries curseur à l'intérieur de boucles? si fait correctement, il n'y a pas des problèmes de verrouillage.
Pour récupérer des données à partir de l'Accès à l'ADO. À l'aide d'un objet de commande avec des paramètres permet au serveur de di optimisations. Open=requête à l'intérieur d'une boucle est mauvais parce que vous ouvrez un proche une connexion à chaque itération, et la requête doit être recompilé et le serveur ne peut pas optmize le processus complet.
OriginalL'auteur maero
Éviter les jointures de serveur lié tables.
À l'aide d'un quatre partie de nommage pour votre jointure peut être utilisé mais il est plus cher. Votre rejoignez pourraient contenir des critères qui peuvent être utilisés pour limiter le jeu de données à partir du serveur lié et utiliser les colonnes indexées.
Exemple:
Cette requête est également dans le respect des critères de la jointure qui peut être utilisé par le serveur lié avant la jointure est calculé.
La méthode recommandée est l'utilisation de OPENQUERY.
En évitant la jointure avec l'utilisation de OPENQUERY le serveur local n'envoie la requête à exécuter à distance au lieu de l'envoi d'un ensemble d'Id pour les rejoindre.
Utiliser le lien pour récupérer un ensemble de données et effectuer les calculs à l'échelle locale. Soit utiliser une table temporaire (pour les requêtes ad hoc) ou insérez une ligne dans une table permanente dans une nuit de travail.
Début des opérations peut échouer en fonction de si le coordinateur de transactions à distance est définie dans le plu serveur. Il vous permettra de consommer plus de ressources.
Également considérer que vous frapper un serveur de production de l'exécution d'une application, alors que vous ne le précisez pas, je pense, est sûr de supposer que c'est à l'aide de lourdes opérations et de faire des insertions et mises à jour. Vous prenez des ressources à partir de l'application.
Votre but semble être l'utilisation des données à des fins de reporting. Votre serveur peut être configuré pour avoir un log simple plutôt qu'en le rendant plus efficace.
Vous permettra également d'éviter que vos requêtes soient annulés en raison du mouvement de données sur le serveur lié. Soyez toujours conscient de définir le bon niveau d'isolation pour vos requêtes et les indicateurs de table comme NOLOCK.
Et s'il vous PLAÎT! Ne placez jamais une OPENQUERY (ou de tout autre serveur) à l'intérieur d'une boucle!
"Ne placez jamais un OPENQUERY (ou de tout autre serveur) dans une boucle!". Pourquoi ne pas, en particulier? N'est-ce pas une série d'cherche à tirer des informations spécifiques où le nombre d'enregistrements réellement besoin est une fraction de la piscine sera beaucoup plus efficace que la lecture de toute la chose?
Plus précisément, vous êtes d'ouverture et de fermeture d'une connexion à distance à chaque itération de la boucle. Comme d '"une série d'cherche à", qui serait mauvais, même si c'était une table locale -l'emporte sur l'objectif d'une recherche. On cherche avec 100 lignes est mieux que 100 cherche avec une ligne chaque. Vous niez aussi de nombreuses autres optimisations effectuées par le serveur.
OriginalL'auteur Ricardo C
Lorsque vous utilisez des serveurs liés pour la rejoint comme cela, il est important d'avoir le serveur, vous êtes immédiatement connecté ("local") être celui avec le plus de données, où le serveur lié est uniquement d'offrir une petite partie des données, sinon, oui, il va tirer autant de données qu'il doit effectuer la jointure.
Alternatives, notamment la copie d'un sous-ensemble de données dans une table temporaire avec aussi beaucoup de travail à faire pour mincir, les résultats et aucun pré-traitement que le serveur lié pouvez effectuer, et ensuite faire la jointure sur le "local".
Vous pouvez trouver que vous pouvez facilement augmenter la performance par l'inversion de la manière que vous le faites, de la connexion au serveur, vous n'avez aucun contrôle sur (qu'ils vont avoir besoin de faire un serveur lié pour vous) et ensuite la connexion à votre serveur sur le lien. Si vous avez besoin de faire des travaux importants avec les données où vous auriez à créer sprocs - puis poussez les données sur votre serveur et d'utiliser votre sprocs.
Dans certains cas, j'ai simplement eu le serveur lié effectuer un tous les soirs de la création de ce genre de résumé lequel il pousse vers le serveur local, puis le serveur local a effectué son travail avec la jointure.
OriginalL'auteur Cade Roux
Douleur royale
Nous avons l'habitude d'avoir plusieurs serveurs liés à notre magasin, et il s'est avéré être tel un pain PITA.
Tout d'abord, il y avait de graves problèmes de performances similaire à ce que vous décrivez. J'ai été choqué quand j'ai vu les e/S réseau les statistiques. Malgré tous les efforts, nous n'avons pas d'astuce SQL Server dans le comportement raisonnable.
Un autre problème qui a été stocké procs a ces noms de serveur codé en dur de partout, avec aucun moyen de les remplacer. Afin que les développeurs ne pouvais pas tester facilement sur leur développement sandbox de toutes les fonctionnalités qui ont touché les serveurs liés. C'était un obstacle majeur à la création d'une unité utilisable universellement-suite de tests.
Dans la fin, nous avons laissé tomber les serveurs liés complètement et déplacé de synchronisation de données, des services web.
OriginalL'auteur Constantin
Requêtes portant sur des semi-jointures sur un serveur lié tendance à ne pas être très efficace. Vous feriez mieux d'utiliser OPENQUERY pour remplir les données dans une table temporaire locale et ensuite travailler à partir de là.
OriginalL'auteur ConcernedOfTunbridgeWells
J'ai écrit une distance Liée application Server dans SQL 2000 il y a quelques années et suis tombé sur les mêmes problèmes de performances que vous décrivez. J'ai fini par la réécriture de mes procédures stockées à plusieurs reprises afin d'obtenir les meilleures performances.
J'ai utilisé des tables temporaires largement. J'ai trouvé qu'il était moins coûteux de récupérer de grandes quantités de données à distance dans une table temporaire, puis se joindre à elle, la manipuler, etc. Joindre local à distance des tables était très lent car vous décrivent.
Afficher le Plan d'Exécution et d'Afficher le Plan d'Exécution Estimé avaient tendance à aider bien que je n'ai pas de comprendre beaucoup de choses de ce que je regardais.
Je ne sais pas si il y a vraiment une manière efficace de faire ces requêtes à un serveur distant car il semble que SQL Server ne peut pas profiter de sa position normale optimisations, quand on va sur un Serveur Lié. Il peut se sentir comme vous êtes le transfert de la totalité de la table parce que c'est en fait ce qui se passe.
Je me demandais si un scénario de réplication peut travailler pour vous. En ayant les données sur votre serveur local, vous devriez être en mesure d'écrire des requêtes normales qui vont fonctionner comme souhaité.
Je ne sais pas du tout de bons articles pour vous orienter vers. Comme je l'ai écris plus compliqué applications SQL Server, j'ai commencé à penser que j'avais besoin d'une meilleure compréhension de la façon dont SQL Server travaillé dessous. À cette fin, nous avons acheté le MS de Presse à l'Intérieur de Microsoft SQL Server 2005 de la série éditée par Kalen Delaney ici à l'œuvre. Volume 1: Le Moteur de Stockage est certainement l'endroit pour commencer, mais je n'ai pas eu que de loin en elle. Depuis mes derniers projets n'ont pas impliqué de SQL Server, de mes études, il a obtenu lax.
OriginalL'auteur Andy Frieders
Est-il une possibilité que vous pourriez mettre en place une base de données distincte sur le serveur plutôt que d'utiliser un serveur lié?
OriginalL'auteur HLGEM
Son très généreux problème, ce qui peut avoir de nombreuses solutions. Mais comme nous l'avons vu tant de l'utilisateur en disant qu'ils ont tout essayé.
Ce qui a résolu mon problème est..
Mise à niveau de sql server 2000 à partir de sp2 SP4 et si vous avez déjà sp4 sur sql server 2000, puis courir Instcat.sql. De par mon expérience, je peux vous assurer que cela fonctionne pour vous, si vous êtes épuisé toutes les autres solutions.
Grâce,
Mithalesh
[email protected]
OriginalL'auteur
SQL dynamique et une fonction peut être utilisée pour obtenir autour de la hard-codée nom de la question. Par exemple, je suis en train de mise en œuvre où la fonction ufn_linkedDatabase(@objet de type nvarchar(255)) avec entrée de l'ipc.ipc' (but de l'IPC, sous-but par défaut) renvoie
'[NOM DE SERVEUR.DOMAINE.LCL,2000].[IPC] " dans l'environnement de production (où nous utilisons autre numéro de port pour le Serveur SQL, je ne sais pas pourquoi, y compris dans le nom du serveur lié). Puis une commande SQL est assemblé dans @template de type varchar(max) avec l'expression @{ipc.ipc} représente le serveur lié et base de données, puis
@workstring = REPLACE(@template, N'@{ipc.ipc}', ...) . Comment la fonction est le nom de la base est séparée de l'procédures - une table de recherche est agréable.
Questions - faire OPENQUERY(), qui est probablement encore mieux, à moins, à moins que le serveur lié option "compatible avec le classement" est mis en "vrai", de sorte que plus de la tâche peut être exécutée sur le serveur lié important, même sur un réseau rapide, et notre salle de serveur de réseau interne est respectable rapide à faire OPENQUERY() j'ai probablement besoin d'poignée " de l'ipc.l'ipc.server' et 'ipc.l'ipc.base de données " et " de l'ipc.l'ipc.serveur.la base de données " séparément. Et, je peut finir par écrire exactement une application à l'aide de cette conception, dans ce cas, c'est plus conçu. Encore, cela signifie que la fonction elle-même n'a pas à être une sorte de fantaisie travail.
Des coups rapides de matériel de réseau de à la le problème peut être le moins cher de réponse, de toute façon.
OriginalL'auteur