Verknüpfte Server-Performance und Optionen
Bei der Arbeit haben wir zwei Server, einer läuft, einer Anwendung, eine Menge Leute verwenden, die eine SQL Server 2000-back-end. Bin ich frei zur Abfrage dieser für eine lange Zeit, aber kann nichts hinzufügen, um es beispielsweise gespeicherte Prozeduren oder extra-Tabellen.
Dies hat dazu geführt, uns mit einer zweiten SQL-Server mit der ersten verbunden und mir den Aufbau einer Bibliothek gespeicherter Prozeduren, Abfrage von Daten von beiden Seiten mit verknüpften server. Einige dieser Abfragen sind dauert länger, als das, was ich möchte.
Kann jemand mir einige gute Artikel zur Verwendung von verknüpften Servern? Ich bin besonders daran interessiert, herauszufinden, welche Daten übertragen werden zwischen den beiden, wie in der Regel die Mehrheit der sql-Anweisung durchgeführt werden konnte aus der Ferne aber ich habe das Gefühl, es kann die übertragung der vollständigen Tabellen, ist es meist nur eine Verknüpfung zu einer kleinen Finale Tabelle lokal.
Auch, was die verlinkten server-Optionen habe ich derzeit:
- - Sortierung Kompatibel True
- Datenzugriff True
- Rpc Wahr
- Rpc Echten
- Use Remote Collation False
- Collation Name (Leer)
- Verbindungs-Timeout 0
- Abfrage-Timeout 0
EDIT:
Nur dachte, würde ich ein update in diesem post habe ich verwendet openqueries mit dynamischen Parametern für eine Weile, um die Leistung zu steigern, vielen Dank für den Tipp. Aber dadurch können Abfragen mehr chaotisch, als Sie am Ende den Umgang mit strings. schließlich in diesem Sommer haben wir ein Upgrade SQL Server 2008 und umgesetzt, live-Daten-spiegelung. Um ehrlich zu sein die offenen Fragen näherten sich die Geschwindigkeit der lokalen Abfragen für meine Aufgaben, aber die spiegelung hat sicherlich die sql einfacher zu handhaben.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich würde raten, dynamische openqueries in einer cursor-Schleife statt der verlinkten Verknüpfungen.
Dies ist der einzige Weg, ich habe in der Lage zu replizieren MS Access " im Zusammenhang mit join-Leistung (zumindest für die einzelnen entfernten Tabellen)
Regelmäßige verlinkten Verknüpfungen in ms sql sind zu ineffizient, um durch herausziehen alles, was speziell in gigantischer Tabellen..
-- Ich würde gerne wissen, was ist so schlimm daran, openqueries innen cursor-Schleifen? wenn es richtig gemacht, gibt es keine locking Probleme.
Vermeiden Sie Verknüpfungen zu verknüpften server-Tabellen.
Über eine vierteilige Benennung für die join kann verwendet werden, aber teurer. Ihr Beitritt könnte enthalten Kriterien, die verwendet werden können, zu begrenzen, den Datensatz aus der verknüpften server, und verwenden Sie den indizierten Spalten.
Beispiel:
Diese Abfrage ist auch die Anwendung einer Kriterien, die im join verwendet werden können, die von den verknüpften server vor dem join berechnet wird.
Die empfohlene Methode ist die Verwendung von OPENQUERY.
Durch die Vermeidung der Verknüpfung mit der Verwendung von OPENQUERY nur der lokale server sendet die Anfrage zum Remote ausgeführt werden, anstatt das senden einer Reihe von IDs für den join.
Den link zum abrufen eines Satzes von Daten, und führen Sie die Berechnungen lokal. Verwenden Sie entweder eine temporäre Tabelle (ad-hoc-Abfragen), oder legen Sie die Zeilen in eine permanente Tabelle in einer nächtlichen job.
Anfang Transaktionen können fehlschlagen, je nachdem, ob die remote transaction coordinator festgelegt ist, in der mochte server. Mit es verbraucht mehr Ressourcen.
Bedenken Sie auch, dass Sie auf einem Produktionsserver ausführen einer Anwendung, während Sie nicht angeben, glaube ich sicher annehmen kann, dass ist mit schweren Transaktionen und tun, Einfügungen und Aktualisierungen. Sie nehmen Ressourcen Weg von der Anwendung.
Ihren Zweck scheint die Verwendung der Daten für Zwecke der Berichterstattung. Ihre server können so eingestellt werden, dass eine einfache log-anstelle von vollständigen effizienter gestaltet werden.
Werden Sie auch vermeiden, dass Ihre Abfragen abgebrochen werden, da die Daten-Bewegung auf den verlinkten server. Immer daran denken, die Einstellung der richtigen Isolationsstufe für Ihre Anfragen und Tabelle Hinweise, wie NOLOCK.
BITTE! Stellen Sie niemals eine OPENQUERY (oder verlinkten server) innerhalb einer Schleife!
Wenn Sie Verbindungsserver verwenden für joins wie dieser, ist es wichtig, den server, Sie werden sofort verbunden ("local") werden die mit den meisten der Daten, wobei der Verbindungsserver ist nur ein kleiner Teil der Daten, ansonsten, ja, es ziehen so viele Daten wie notwendig, um die Verknüpfung ausführen.
Alternativ kann beispielsweise auch das kopieren einer Teilmenge der Daten in einer temporären Tabelle, mit wie viel Arbeit getan, um schlank nach unten, die Ergebnisse und alle pre-processing, dass die verknüpften server ausführen können, und führen Sie dann die Verknüpfung auf die "local" - Seite.
Diese Weise können Sie leicht steigern Sie die Leistungsfähigkeit durch die Umkehrung der Art und Weise Sie es tun, eine Verbindung zu dem server, den Sie keine Kontrolle haben (Sie brauchen, um einen verknüpften server für Sie) und dann eine Verbindung zu Ihrem server über den link. Wenn Sie brauchen, um zu tun, große Arbeit mit den Daten, wo Sie hätte schaffen sprocs - dann schieben Sie die Daten auf Ihren server, und verwenden Sie Ihre sprocs es.
In einigen Fällen, ich hatte einfach das Verbindungsservers ausführen, die eine nächtliche Schaffung dieser Art von Zusammenfassung, die es gedrückt, um den lokalen server, und dann den lokalen server durchgeführt, Ihre arbeiten mit join.
Königliche Schmerz
Wir haben mehrere miteinander verbundene Server in unserem shop und es stellte sich heraus, dass so ein PITA.
Zunächst gab es heftige performance-Probleme ähnlich, was Sie beschreiben. Ich war schockiert, als ich sah, Netzwerk-I/O-Statistiken. Trotz allen Bemühungen nicht gelungen ist, Tipp, SQL-Server in angemessener Verhalten.
Ein weiteres problem war, dass die gespeicherte procs hatte diese verknüpften server-Namen hartcodiert überall, mit keine Möglichkeit, Sie zu überschreiben. Damit Entwickler nicht leicht zu testen, auf Ihre Entwicklung Sandboxen alle Funktionen, die berührt verlinkten Servern. Dies war ein großes Hindernis für die Schaffung eines universell einsetzbaren unit-test-suite.
Wir am Ende abserviert verlinkten Servern vollständig und zog die Synchronisation der Daten auf web-services.
Abfragen, die semi-joins über einen verknüpften server in der Regel nicht sehr effizient. Sie könnten besser mit OPENQUERY zum füllen von Daten in eine lokale temporäre Tabelle, und dann arbeiten Sie von dort aus.
Schrieb ich eine remote-Linked-Server-Anwendung in SQL 2000 vor ein paar Jahren und kam über die gleichen performance-Probleme, die Sie beschreiben. Ich landete umschreiben meine gespeicherte Prozeduren mehrere Male, um zu erhalten die beste Leistung.
Ich verwendet temporäre Tabellen ausführlich. Ich fand, dass es weniger teuer, um das abrufen großer Mengen von remote-Daten in eine temp-Tabelle, dann fügen Sie es, manipulieren, etc. Beitritt lokal zu remote-Tabellen sehr langsam war, als Sie desribe.
Display Ausführungsplan und den Geschätzten Ausführungsplan Anzeigen eher helfen, obwohl ich nicht verstehen eine Menge von dem, was ich sah.
Ich weiß nicht, ob es wirklich eine effiziente Art und Weise zu tun, diese Abfragen mit einem remote-server, weil es scheint, dass SQL Server keinen Vorteil aus seiner normalen Optimierungen, wenn man gegen einen Verknüpften Server. Es kann das Gefühl, Sie übertragen die gesamte Tabelle, weil in der Tat, dass ist das, was passiert ist.
Frage ich mich, wenn ein Replikations-Szenario könnte für Sie arbeiten. Indem er die Daten auf Ihrem lokalen server, sollten Sie in der Lage zu schreiben, normale Abfragen, die ausgeführt wird, wie gewünscht.
Ich nicht kennen, die gute Artikel zu zeigen Ihnen den Weg. Als ich mehr schreiben, komplizierte SQL-Server-Anwendungen, begann ich zu denken, dass ich brauchte, besser zu verstehen, wie SQL Server gearbeitet darunter. Zu diesem Zweck kauften wir die MS Press-Inside Microsoft SQL Server 2005 Serie bearbeitet von Kalen Delaney hier bei der Arbeit. Band 1: Die Speicher-Engine ist definitiv der Ort, um zu starten, aber ich habe nicht so weit hinein. Seit meiner letzten Projekte nicht beteiligt SQL Server, mein Studium hat Sie bekommen lax.
Gibt es eine Möglichkeit, dass Sie könnte die Einrichtung einer separaten Datenbank auf dem server und nicht mit einem server verbunden?
Sehr großzügig problem, das können viele Lösungen. Aber wie wir erlebt haben, so viele user, die sagen, dass Sie alles versucht haben.
Was mein problem gelöst ist..
Habe ich ein Upgrade von sql server 2000 sp2 auf SP4 und wenn du schon sp4 auf sql server 2000 ausführen von Instcat.sql. Nach meiner Erfahrung kann ich Ihnen versichern, das funktioniert für Sie sicher, wenn Sie erschöpft sind, mit all den anderen workarounds.
Dank,
Mithalesh
[email protected]
Dynamische SQL-Funktion kann verwendet werden, um rund um die hard-codierte Namen Frage. Zum Beispiel, ich bin versucht, eine Implementierung, wo die Funktion ufn_linkedDatabase(@Zweck vom Datentyp nvarchar(255)) mit der Eingabe 'lik.cpi' (Zweck, CPI, sub-purpose Standard) gibt
'[SERVER-NAME.DOMAIN.LCL,2000].[Lik]' in der production-Umgebung (wo wir die Verwendung von alternativen port-Nummer für den SQL-Server, ich weiß nicht, warum, auch in verknüpften server-Namen). Dann ein SQL-Befehl zusammengebaut in der @template varchar(max) mit dem Ausdruck @{cpi.cpi} Vertretung des verknüpften Servers und der Datenbank, und dann
@workstring = REPLACE(@template, N'@{cpi.cpi}', ...) . Wie die Funktion wird tatsächlich der name der Datenbank ist unabhängig von den Verfahren - eine lookup-Tabelle ist schön.
Fragen - zu tun OPENQUERY(), das ist wahrscheinlich immer noch besser, zumindest, wenn der Verbindungsserver option "Sortierung kompatibel" festgelegt ist "true", so dass mehr von der Aufgabe ausgeführt werden kann auf dem Verbindungsserver - wichtig auch in einem schnellen Netzwerk und unsere server-Raum ein internes Netzwerk ist anständig schnell zu tun OPENQUERY() muss ich wohl für 'cpi.cpi.server' und 'lik.cpi.Datenbank' und 'lik.cpi.server.Datenbank " getrennt. Und, ich bis Ende Mai schriftlich genau eine Anwendung mit diesem design, in dem Fall ist es überdimensioniert. Noch, das bedeutet, dass die Funktion selbst muss nicht jede Art von Lust zu arbeiten.
Werfen schnelle Netzwerk-hardware an das problem möglicherweise billiger Antwort, trotzdem.