web-dev-qa-db-fra.com

Où les requêtes serveur liées sont-elles exécutées?

J'ai deux instances servera et serverb , et j'ai créé un lien serveur dans Servera pour Serverbb AS linksrv_b .

Je peux exécuter une requête sur Servera en utilisant la convention de dénomination de quatre parties:

SELECT * FROM Linksrv_B.master.sys.databases

ou OPENQUERY():

SELECT * FROM OPENQUERY(Linksrv_B, 'SELECT * FROM master.sys.databases')  

Je sais que le serveur lié fonctionne dans une base de données hétérogène à l'aide de la transaction distribuée sous forme de rowset.

  1. Où le fournisseur OLEDB est-il initié/connecté? Servera ou Serverb?
  2. Où la requête est-elle exécutée sur Servera ou Serverb? L'optimiseur entre-t-il en jeu si le serveur?
  3. Où le jeu de résultats est-il mis en cache?
  4. Quelqu'un pourrait-il nous donner une explication détaillée comment fonctionne un serveur lié.
7
info.sqldba

1 - Le fournisseur OLEDB est initié sur le serveur A, Server B le voit comme une connexion et une requête normales, il ne sait pas que Sever A est un serveur SQL, il n'est qu'un client.

2 - La requête est exécutée sur les deux. Server A passe la requête au serveur B qui l'exécute, puis serveur A fonctionne avec les résultats. L'optimiseur entre en jeu les deux, mais ne peut pas parler aux autres serveurs.

Étant donné une requête d'aucune complexité, la performance sera équivalente. Toutefois, lorsque vous commencez à entrer dans des requêtes complexes ou de grands ensembles de données, vous verrez des gains de performance en récupérant simplement ce dont vous avez besoin du serveur B dans une table Temp, puis en l'utilisant avec les données contenues sur le serveur A. (en supposant que vous devez mélanger et correspondre aux données entre serveurs). Essentiellement, avec la syntaxe OpenQuery, vous passez la requête dans son ensemble au serveur B (espérons-le, y compris une clause où) qui renvoie ensuite des données à Serer A. avec la nommage de quatre parties, vous n'avez aucun contrôle et l'optimiseur décidera rapidement de simplement Exécutez toutes les données de la table du serveur B puis éliminez ensuite sur d'autres critères (jointures, où, etc.).

3 - Le résultat n'est pas mis en cache (sauf sous forme de données SQL caches normalement). Sauf si vous stockez les résultats de la requête liée du serveur dans une table temporelle quelque part.

4 - Si vous êtes familiarisé avec la manière dont les applications se connectent à une base de données et exécutent des requêtes, le processus est très similaire. À l'exception des différences d'authentification, il est identique, il permet de mélanger facilement et de faire correspondre des données de plusieurs serveurs dans un ensemble de résultats unique. Mais votre performance dépendra grandement sur la quantité de données tirées du serveur B et de rester conscient de la capacité limitée de l'optimiseur afin de vous empêcher de tirer la totalité de la table du serveur B, même si vous n'avez terminé que de 5 de ces lignes.

4
Jonathan Fite