Frage

Bei der Arbeit haben wir zwei Server, auf einem läuft eine Anwendung, die viele Leute verwenden und die über ein SQL Server 2000-Backend verfügt.Ich konnte dies schon seit langem abfragen, kann aber nichts hinzufügen, beispielsweise gespeicherte Prozeduren oder zusätzliche Tabellen.

Dies hat dazu geführt, dass wir einen zweiten SQL Server mit dem ersten verbunden haben und ich eine Bibliothek gespeicherter Prozeduren aufgebaut habe, die Daten von beiden Seiten über einen Verbindungsserver abfragen.Einige dieser Abfragen dauern länger als ich möchte.

Kann mir jemand einige gute Artikel über die Verwendung von Verbindungsservern empfehlen?Ich bin besonders daran interessiert, herauszufinden, welche Daten zwischen den beiden übertragen werden, da normalerweise der Großteil der SQL-Anweisung remote ausgeführt werden kann, ich aber das Gefühl habe, dass möglicherweise die gesamten Tabellen übertragen werden. Normalerweise handelt es sich nur um einen Join zu einem kleinen Abschluss Tisch vor Ort.

Welche Verbindungsserveroptionen habe ich derzeit außerdem:

  • Sortierungskompatibel stimmt
  • Datenzugriff stimmt
  • Rpc True
  • Rpc Out True
  • Verwenden Sie „Remote Collation False“.
  • Kollationsname (leer)
  • Verbindungszeitlimit 0
  • Abfrage-Timeout 0

BEARBEITEN:

Ich dachte nur, ich würde diesen Beitrag aktualisieren. Ich habe eine Zeit lang offene Abfragen mit dynamischen Parametern verwendet, um die Leistung zu steigern, danke für den Tipp.Dies kann jedoch dazu führen, dass Abfragen komplizierter werden, da es sich letztendlich um Zeichenfolgen handelt.In diesem Sommer haben wir schließlich ein Upgrade von SQL Server auf 2008 durchgeführt und eine Live-Datenspiegelung implementiert.Um ehrlich zu sein, näherten sich die offenen Abfragen für meine Aufgaben der Geschwindigkeit lokaler Abfragen an, aber die Spiegelung hat den Umgang mit SQL auf jeden Fall erleichtert.

War es hilfreich?

Lösung

würde ich dynamische openqueries in einem Cursor-Schleife raten stattdessen schließt sich der verlinkten. Dies ist der einzige Weg, ich in der Lage gewesen war MS Access' zu replizieren verknüpfen Performance verbinden (zumindest für einzelne Remote-Tabellen)
Regelmäßige verknüpft schließt sich in MS SQL sind zu ineffizient durch alles, was speziell in humongous Tabellen ziehen ..

- ich möchte wissen, was über openqueries innerhalb Cursor Schleifen so schlecht ist? wenn es richtig gemacht, es gibt keine Probleme mit Sperren.

Andere Tipps

Vermeiden Sie schließt sich an den Verbindungsserver-Tabellen.

Mit einem vierteiligen Namens für Ihren kann verwendet werden, join ist aber teurer. Ihre beitreten könnten Kriterien enthalten, die verwendet werden können, um die Daten aus dem verknüpften Server und verwenden Sie die indizierten Spalten gesetzt zu begrenzen.

Beispiel:

SELECT loc.field1, lnk.field1
FROM MyTable loc
INNER JOIN RemoteServer.Database.Schema.SomeTable lnk
  ON loc.id = lnk.id
  AND lnk.RecordDate = GETDATE()
WHERE loc.SalesDate = GETDATE()

Diese Abfrage wird auch ein Kriterium in der Verknüpfung, die Anwendung kann, bevor sie von dem Verbindungsserver verwendet werden join die berechnet wird.

Die empfohlene Methode ist die Verwendung von OPENQUERY.

Durch die Vermeidung sendet die Verbindung mit der Verwendung von OPENQUERY der lokale Server nur die Abfrage der Ferne statt eine Reihe von IDs für die Join-Senden ausgeführt werden.

Mit der Verbindung eine Menge von Daten abzurufen und die Berechnungen lokal auszuführen. Entweder eine temporäre Tabelle verwenden (für Ad-hoc-Abfragen) oder legen Sie die Zeile in einer permanenten Tabelle in einem nächtlichen Job.

Begining Transaktionen können je fehlschlagen, wenn der Remote-Transaktionskoordinator im gemocht Server eingestellt ist. Mit wird es mehr Ressourcen verbrauchen.

Beachten Sie auch, dass Sie einen Produktionsserver schlagen eine Anwendung ausgeführt wird, während Sie es nicht geben, ich glaube sicher davon ausgehen, dass schwere Transaktionen verwendet, und Einfügungen und Aktualisierungen zu tun. Sie nehmen Ressourcen weg von der Anwendung entfernt.

Ihr Zweck erscheint für Berichtszwecke die Verwendung der Daten zu sein. Der Server kann eingestellt werden, ein einfaches Protokoll statt voll haben, damit es effizienter wird.

Sie werden auch Ihre Anfragen abgesagt werden wegen Datenverschiebung auf dem Verbindungsserver vermeiden. Stets darauf bedacht sein, die richtige Isolationsstufe für Ihre Fragen und Tabellenhinweise wie NOLOCK Einstellung.

Und bitte! Stellen Sie niemals eine OPENQUERY (oder einen verknüpften Server) in einer Schleife!

Wenn Sie verknüpfte Server verwenden für wie diese verbindet, ist es wichtig, den Server haben Sie sofort verbunden sind ( „local“) sein, die mit dem die meisten Daten, in dem der Verbindungsserver nur ein kleiner Teil bereitstellt die Daten, sonst, ja, ziehen sie es so viele Daten wie es die Verbindung ausführen muss.

Alternativen umfassen das Kopieren einer Teilmenge der Daten über in eine temporäre Tabelle mit so viel Arbeit abnehmen getan unten die Ergebnisse und jeder Vorverarbeitung, dass der Verbindungsserver ausführen können, und führen Sie dann auf dem „lokalen“ Seite der Verbindung.

Sie können feststellen, Sie ganz einfach die Leistung steigern kann, indem die Art und Weise Umkehren Sie es tun, eine Verbindung zum Server haben Sie keine Kontrolle über (sie werden einen Verbindungsserver für Sie vornehmen müssen) und dann auf den Server über den Link Verbindungs . Wenn Sie große Arbeit mit den Daten tun müssen, wo Sie müßten sprocs schaffen -. Dann die Daten auf dem Server schieben und Ihre sprocs dort verwendet

In einigen Fällen musste ich einfach die Verbindungsserver eine nächtliche Erstellung dieser Art Zusammenfassung durchführen, die sie auf dem lokalen Server geschoben, und dann der lokale Server ausgeführt seine Arbeit mit der Verbindung.

Königshäuser Schmerz

Wir haben mehrere verknüpfte Server in unserem Shop haben, und es stellte sich heraus, eine solche PITA .

Zunächst einmal gab es schwerwiegende Leistungsprobleme ähnlich dem, was Sie beschreiben. Ich war schockiert, als ich Netzwerk-I / O-Statistiken sah. Trotz aller Bemühungen haben wir versagt SQL Server in vernünftiges Verhalten zu deuten.

Ein weiteres Problem war, dass gespeicherte Procs hatte diese verknüpften Server-Namen überall fest einprogrammiert, ohne die Möglichkeit, sie zu überschreiben. So konnten die Entwickler nicht einfach testen auf ihre Entwicklung Sandkästen jede Funktionalität, die verknüpfte Server berührt. Das war ein großes Hindernis für eine universell einsetzbare Einheit-Testsuite zu erstellen.

Am Ende ditched wir Server vollständig verbunden und bewegt die Datensynchronisation zu Web-Services.

Abfragen die halb schließt sie über einen Verbindungsserver nicht als sehr effizient neigen. Sie könnten besser dran mit OPENQUERY füllen Daten in eine lokale temporäre Tabelle und dann arbeiten sie von dort aus.

Ich schrieb eine Remote-Verbindung-Server-Anwendung in SQL 2000 ein paar Jahren und kam über die gleichen Performance-Probleme Sie beschreiben. Ich beendete meine gespeicherten Prozeduren mehrmals um bis Umschreiben die beste Leistung zu erhalten.

Ich benutzte temporäre Tabellen ausführlich. Ich fand, dass es weniger teuer große Mengen an Datenfern in eine temporäre Tabelle abzurufen, dann, um es zu kommen, manipulieren sie, usw. Der Beitritt zu entfernten Tabellen lokalen war sehr langsam, wie Sie desribe.

Display Ausführungsplan und Anzeige Geschätzte Ausführungsplan neigten zu helfen, obwohl ich nicht viel verstanden habe, was ich suchte bei.

Ich weiß nicht, ob es wirklich eine effiziente Art und Weise ist es, diese Abfragen mit einem Remote-Server zu tun, weil es wie SQL Server scheint keinen Vorteil aus seinen normalen Optimierungen nehmen kann, wenn gegen einen Linked Server gehen. Es kann sich wie Sie die gesamte Tabelle übertragen, da in der Tat, das ist das, was passiert ist.

Ich frage mich, ob ein Replikationsszenario für Sie arbeiten könnte. Durch die Daten auf dem lokalen Server ist, sollten Sie in der Lage sein, normale Abfragen zu schreiben, wie gewünscht wird durchführen.

Ich weiß nicht, von jedem guten Artikel, die Sie zu deuten darauf hin. Wie ich kompliziertere SQL Server-Anwendungen zu schreiben, begann ich zu denken, dass ich ein besseres Verständnis erforderlich, wie SQL-Server unter gearbeitet. Zu diesem Zweck kauften wir die MS Press in Microsoft SQL Server 2005-Serie bearbeitet von Kalen Delaney hier bei der Arbeit. Band 1: Die Speicher-Engine ist definitiv der richtige Ort zu starten, aber ich habe nicht so weit hinein bekommen. Seit meiner letzten Projekte SQL Server nicht beteiligt haben, mein Studium hat lax geworden.

Gibt es eine Möglichkeit, dass Sie eher eine separate Datenbank auf dem Server einrichten könnten einen Verbindungsserver als mit?

Es ist ein sehr großzügiges Problem, das viele Lösungen hat. Aber wie wir haben so viele Benutzer erlebt sagen, dass sie alles versucht haben.

Was mein Problem gelöst ist ..

Ich habe ein Upgrade von SQL Server 2000 von sp2 zu SP4 und wenn Sie bereits SP4 auf SQL Server 2000 dann Instcat.sql laufen. Gemäß meiner Erfahrung kann ich Ihnen versichern dies sicher funktionieren wird, wenn Sie mit allen anderen Abhilfen erschöpft sind.

Danke, Mithalesh mithalesh.gupta@gmail.com

Um die hartcodierte Namensfrage zu umgehen, können dynamisches SQL und eine Funktion verwendet werden.Zum Beispiel versuche ich eine Implementierung, bei der die Funktion ufn_linkedDatabase(@purpose nvarchar(255)) mit der Eingabe 'cpi.cpi' (Zweck-CPI, Unterzweck-Standard) zurückgibt '[SERVERNAME. DOMÄNE. LCL, 2000]. [CPI]' in der Produktionsumgebung (wo wir eine alternative Portnummer für SQL Server verwenden, ich weiß nicht warum, auch im Namen des Verbindungsservers).Dann wird ein SQL-Befehl in @template varchar(max) mit dem Ausdruck @{cpi.cpi} assembliert, der den Verbindungsserver und die Datenbank darstellt, und dann @workstring = REPLACE(@template, N'@{cpi.cpi}', ...) .Wie die Funktion tatsächlich den Datenbanknamen erhält, ist von den Prozeduren unabhängig – eine Nachschlagetabelle ist hilfreich.

Probleme – OPENQUERY() ausführen, was wahrscheinlich immer noch besser ist, zumindest solange die Verbindungsserveroption „collation kompatibel“ nicht auf „true“ gesetzt ist, damit mehr Aufgaben auf dem Verbindungsserver ausgeführt werden können – wichtig auch in einem schnellen Netzwerk. und unser internes Serverraumnetzwerk ist respektabel schnell – um OPENQUERY() auszuführen, muss ich wahrscheinlich „cpi.cpi.server“ und „cpi.cpi.database“ und „cpi.cpi.server.database“ separat behandeln.Und es kann sein, dass ich am Ende genau eine Anwendung mit diesem Design schreibe. In diesem Fall ist sie überdesignt.Das bedeutet jedoch, dass die Funktion selbst keine ausgefallene Arbeit sein muss.

Die Lösung des Problems mit schneller Netzwerk-Hardware könnte ohnehin die günstigere Lösung sein.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top