Frage

Wir haben ein bisschen eine chaotisch Datenbank Situation.

Unser Haupt Back-Office-System wird in Visual Fox Pro mit lokalen Daten geschrieben (ja, ich weiß!)

Um die Daten in unseren Websites effektiv zu arbeiten, haben wir Daten regelmäßig auf eine SQL-Datenbank ausgewählt zu exportieren. Doch der Prozess, diese im Grunde tut löscht die Tabellen jedes Mal und macht einen erneuten Einsatz.

Dies bedeutet, dass wir zwei SQL-Datenbanken haben -. Eine, die unser FoxPro Exportprozess schreibt, und eine andere, die unsere Webseiten lesen von

Diese Frage betrifft die von einer SQL-Datenbank in dem anderen Transformation (SqlFoxProData -> SqlWebData).

Für eine bestimmte Tabelle (eine unserer wichtigsten Anwendungstabellen), weil verschiedene Datentransformationen Orte während dieses Prozesses nehmen, es ist keine einfache UPDATE, INSERT und DELETE-Anweisungen mit selbst beitritt, aber wir haben Cursor stattdessen verwenden (ich weiß!)

Das ist für viele Monate fein gearbeitet, aber jetzt beginnen wir auf Performance-Probleme zu treffen, wenn ein Update stattfindet (dies regelmäßig während des Tages geschehen kann)

Im Grunde genommen, wenn wir SqlWebData.ImportantTable von SqlFoxProData.ImportantTable aktualisieren, es verursacht gelegentliche Verbindung Timeouts / Deadlocks / andere Probleme auf den Live-Websites.

Ich habe hart an der Optimierung von Abfragen, Caching usw. usw. gearbeitet, aber es ist bis zu einem Punkt kommen, wo ich für eine andere Strategie suchen, um die Daten zu aktualisieren.

Eine Idee, die in dem Sinne gekommen ist, zwei Kopien von ImportantTable zu haben (A und B), eine Vorstellung davon Tabelle derzeit ‚aktiv‘, die nicht-aktive Tabelle zu aktualisieren, dann die currenly Actice Tabelle Schalt

d. Webseite von ImportantTableA lesen, während wir ImportantTableB aktualisieren, dann schalten wir Websites von ImportantTableB zu lesen.

Frage ist, ist dies möglich und eine gute Idee? Ich habe so etwas wie es vorher getan, aber ich bin nicht überzeugt, dass es unbedingt gut ist für die Optimierung / Indizierung etc.

Alle Vorschläge willkommen, ich weiß, dass dies eine chaotische Situation ist ... und das langfristige Ziel wäre unsere FoxPro-Anwendung zu bekommen, um SQL zeigen.

(Wir verwenden SQL 2005, wenn es hilft)

soll ich, dass die Datenkonsistenz hinzufügen nicht besonders wichtig in dem Fall ist, da die Daten immer etwas veraltet sind

War es hilfreich?

Lösung

Es gibt viele Möglichkeiten, diese Katze Haut.

Ich würde zuerst die Probleme mit Sperren angreifen. Es ist äußerst selten, dass ich CURSORS verwenden würde, und ich denke, die Leistung zu verbessern und Sperrverhalten könnte es eine Menge Ihrer Probleme lösen.

Ich gehe davon aus, dass ich es durch die Verwendung von zwei separaten Importiertabellen lösen würde. Ein für den Export in FoxPro SQL und einem in das endgültige Format in SQL-Seite-an-Seite umgewandelt. Dann entweder tauschen die letzte für die Produktion sp_rename verwenden oder einfach mit 3 INSERT / UPDATE / DELETE-Transaktionen alle Änderungen aus der letzten Tabelle Produktion anzuwenden. So oder so, es wird einige Verriegelung, dort zu sein, aber wie groß reden wir?

Andere Tipps

Es sollte möglich sein, eine db für die Website zu halten und nur von der anderen SQL-DB-Tabelle dieser Tabelle repliziert werden.

Dies wird vorausgesetzt, dass Sie aktualisieren keine Daten von der Website selbst.

"Für eine bestimmte Tabelle (eine unserer wichtigsten Anwendungstabellen), weil verschiedene Datentransformationen nehmen Orte während dieses Prozesses, es ist keine einfache UPDATE, INSERT und DELETE-Anweisungen mit selbst beitritt, aber wir haben Cursor zu verwenden statt (ich weiß!) "

Ich kann nicht von einem Fall denken, wo ich jemals brauchen würde, einen Einsatz, aktualisieren oder löschen auszuführen, um einen Cursor zu verwenden. Wenn Sie die Select für die Cursor schreiben können, können Sie es in ein Insert, Update konvertieren oder löschen. Sie können in diesen Aussagen zu anderen Tabellen verknüpfen und den Fall abgetan für die bedingte Verarbeitung verwenden. die Zeit nehmen, in einem Satz -basierte Mode zu tun dies kann Ihr Problem lösen.

Eine Sache, die Sie berücksichtigen, wenn Sie eine Menge Daten zu bewegen. Wir schaffen occassionally einen Blick auf die Daten, die wir wollen und haben dann zwei Tabellen - eine aktive und eine, die Daten geladen werden. die Tabelle wechseln die Ansicht verwendet, um die, die Sie gerade finshed loading Wenn das Laden von Daten finsihed, als Teil des Prozesses einen einfachen Befehl ausführen. So werden die Nutzer nur nach unten für ein paar Sekunden am meisten. Sie werden nicht schaffen Verriegelungspunkte, bei denen sie den Zugriff auf Daten versuchen, wie Sie geladen werden.

Sie auch bei Verwendung von SSIS aussehen könnten, die Daten zu bewegen.

Haben Sie die Möglichkeit haben, machen die Updates mehr Atom, anstatt der angegebenen ‚klar und wieder einsetzen‘? Ich denke, Microsoft Visual FoxPro unterstützt Auslöser, nicht wahr? Für Ihre Schlüsseltabellen können Sie einen Trigger zum Update / Insert hinzufügen / löschen Sie die ID der Datensätze zu erfassen, die sich ändern, dann bewegen (oder löschen) nur die Datensätze?

Oder wie wäre es, alle Änderungen an einer Offline-Datenbank zu schreiben, und lassen SQL Server-Replikation kümmern uns um die Synchronisierung?

[sorry, dies ein Kommentar gewesen wäre, wenn ich genug Ruf habe!]

Auf der Grundlage Ihrer Antwort auf Ernie oben, fragte Sie, wie Sie Datenbanken replizieren. Hier ist Microsofts How-to zur Replikation in SQL2005.

Allerdings, wenn Sie fragen, über Replikation und wie es zu tun, zeigt es mir, dass Sie ein wenig Licht in Erfahrung für SQL Server. Davon abgesehen, ist es ziemlich einfach, Dinge zu vermasseln und während ich alle bin für durch Erfahrung lernen, wenn diese unternehmenskritischen Daten ist, könnten Sie besser dran, die Einstellung eines DBA oder zumindest, die Prüfung der # $ @ # $ % davon aus, bevor Sie es tatsächlich umzusetzen.

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