Frage Schlechte interne Datenbank - ersetzen Sie es oder chuck Hardware an ihm?


Also - wir haben eine interne Firmendatenbank, die übliche Art von Sachen: verwaltet Kunden, Telefonanrufe, Angebote und Kundenverträge / Schemen.

Es ist ein Access 2000-Front-End und ein SQL Server 2000 Standard-Back-End. Single Server, Dual Xeon 3.2 GHz, 2 GB RAM, Windows Server 2003, erhalten den ganzen Tag über 40% CPU-Last, verteilt auf die 4 Kerne, die für das Betriebssystem (HT) sichtbar sind.

Die Back-End-Datenbank ist schlecht entworfen und hat organisch über 10 Jahre gewachsen, gehalten von weniger als qualifizierten Personen. Es ist schlecht normalisiert, und einige der offensichtlichen Probleme enthalten Tabellen mit Zehntausenden von Zeilen ohne Primärschlüssel oder Index, die auch stark in Multi-Tabellen-Joins für einige der am häufigsten verwendeten Teile des Systems verwendet werden (z. B. a Call-Manager-Anwendung, die 8 Stunden am Tag auf jedem zweiten Monitor sitzt und alle paar Sekunden eine große ineffiziente Abfrage ausführt).

Das Front-End ist nicht viel besser, es ist das typische Durcheinander von Hunderten von Formularen, geschachtelten gespeicherten Abfragen, schlecht geschriebenem Embedded SQL im VBA-Code, Dutzenden von "Macken" usw., und wann immer eine Änderung gemacht wird, scheint etwas, das nichts miteinander zu tun hat. Wir haben uns auf eine MDB festgelegt, die "gut genug" funktioniert und nun eine "No-Change" -Richtlinie hat, da wir keine Access-Schwergewichte im Haus haben (und auch keine Pläne haben, eine zu installieren).

Das Unternehmen wächst langsam, es steigen die Anzahl der Clients, Anrufe usw. und die Zahl der gleichzeitigen Benutzer nimmt leicht zu. Die Leistung wird seit kurzem merklich schlechter (warten darauf, zwischen den Formularen zu wechseln, auf das Auffüllen der Listen zu warten usw.) )

Perfmon sagt:

  • Festplattenübertragungen pro Sekunde: zwischen 0 und 30, durchschnittlich 4.
  • Aktuelle Festplattenwarteschlangenlänge: schwebt um 1

SQL Server Profiler sieht jede Minute Hunderttausende von Abfragen. Die CPU-Auslastung auf den Clients ist ziemlich gleich Null, was darauf hinweist, dass sie auf serverseitige Abfragen wartet, um ausgeführt zu werden. Ich habe diese Arbeitslast über den DB Engine Tuning Advisor verteilt und ihre Vorschläge auf eine Testsicherung angewendet, aber das hat nicht wirklich viel bewirkt.

Übrigens, wir haben eine Mischung aus 100MB und Gigabit-Ethernet, alles in einem Subnetz, 40 Nutzer auf zwei Etagen.

Zur Frage.

Wie ich es sehe, haben wir zwei Möglichkeiten, diese Situation zu lösen / zu verbessern.

  • Wir können es verwerfen und durch ein völlig neues CRM-System ersetzen, entweder nach Maß oder nach Maß
  • Wir können die Lebensdauer dieses Systems verlängern, indem wir Hardware darauf einspannen.

Wir können ein Intel i7-System mit verrückten Leistungszahlen für eine Größenordnung weniger Kosten als das Ersetzen der Software bauen.

Wenn ein neues System schließlich entwickelt wird, kann es in dieser Box gehostet werden, so dass keine Hardware verschwendet wird. Ein neues CRM-System wird ständig verschoben, ausgeschaltet und ausgeschaltet - ich sehe das seit mindestens einem Jahr nicht mehr.

Irgendwelche Gedanken zu dieser Situation, besonders wenn Sie selbst hier waren, würden am meisten geschätzt.

Vielen Dank


39
2017-08-10 10:45


Ursprung


+1 für die Beschreibung und den Inhalt. Das sehen wir alle täglich. - Dayton Brown
Hier gilt das gleiche. Große Frage. - Joseph Kern
Die Ausgabe von DTA bedeutet nicht, dass Sie die Grenze der Datenbankoptimierungen erreicht haben. Holen Sie sich einen SQL Server-Spezialisten! Sie können Wunder wirken und geben Ihrer bestehenden Hardware noch ein paar Lebensjahre - Nick Kavadias


Antworten:


Ich werde hier allen nicht zustimmen. Chuck einige Hardware bei ihm. Es ist billig, schnell, einfach und kostet Sie Zeit, um eine richtige CRM-Lösung zu implementieren. Der Grund, warum ich etwas befürworte, das nicht nur für dieses Board, sondern auch für den Stackoverflow ein Greuel ist, ist, dass ich Projektmanager / Manager bin und für eine Weile auf der "Business" -Seite war ist in Anführungszeichen wegen meines Hasses auf das Wort). Basierend auf Ihrer Beschreibung der Software dauert es fast ein Jahr, um etwas anderes wieder aufzubauen. Das Entdecken / Dokumentieren der Geschäftsregeln / Macken wird wahrscheinlich 2 Monate dauern. Es wird auch unglaublich teuer sein, zu entwickeln. Besonders im Vergleich zu den Kosten eines ausgetrickten Servers.

Ich bin gerade dabei, eine Reihe von Web-Apps für ein Unternehmen zu hosten. Die interne IT-Abteilung wird es nicht auf bessere Hardware umstellen, weil sie diese auf einer neuen Plattform neu entwickeln wollen. Diese Kosten sind ungefähr das Dreifache, was es kosten würde, es auf neue Hardware zu bringen. Nicht zu erwähnen, dass das Unternehmen den Vertrag möglicherweise nicht in einem Jahr erneuert hat.


20
2017-08-10 12:05



Seine Frage war "NewHardware OR NewCRM" und nicht "NewHardware AND NewCRM" ... Und wirklich, Sie gehen nicht gegen das Board (kaufen Sie ein neues CRM), so sehr wie die Frage umrahmt (Umzug von OR nach AND). - Joseph Kern
Ein paar andere Kommentare sagen "Mach beides". Wenn er beides tut, dann ist das wirklich keine Frage. Aber kann er sich beides leisten? - Joseph Kern
Joseph, ich habe unten vollständig geantwortet, aber - Neue Hardware, plus ein Upgrade auf neuere Server-Editionen, PLUS Optimierung einiger Abfragen und Hinzufügen von Indizes wird wahrscheinlich am effektivsten sein. Sie möchten den Wettbewerbsvorteil, den benutzerdefinierte CRMs kleinen, wachsenden Unternehmen bieten, nicht preisgeben. - Karl Katzke
My Do Both, wenn Sie es lesen, halten Sie die Hardware in Betrieb, während Sie es bearbeiten. Abhängig von den Ressourcen, die benötigt werden, können einige hundert $$ im RAM vorhanden sein, während Teile davon refactoriert werden. Probleme zu zeigen, die er mit der Verschrottung gehabt hatte und mit völlig neuen ging, ob neu, ist ein kundenspezifisches geschriebenes System oder Schlüssel aus der Schachtel. - SpaceManSpiff
+1 für den Blick auf das große Bild: Es wird weniger kosten, Hardware zu werfen, als es Entwickler / IT zu werfen. Es sei denn, Sie finden ein Standard-CRM, das alles, was Sie benötigen, kostet weniger als der Server, und es wird keine Zeit dauern, um zu migrieren, das heißt. - Ernie


Sie müssen möglicherweise auch nicht. Mein Vorschlag ist, einfach einige Indizes / Schlüssel zur Tabelle hinzuzufügen.

Tabellen mit Zehntausenden von Zeilen ohne Primärschlüssel oder Index, die auch in Joins mit mehreren Tabellen stark verwendet werden

Bevor Sie eine Menge Geld oder Zeit investieren, nehmen Sie sich ein paar Stunden Zeit und fügen Sie allen Tabellen, die an diesen Joins beteiligt sind, Indizes (oder Primärschlüssel) hinzu, insbesondere für Spalten, die in einer where-Klausel verwendet werden. Sie könnten die Leistung in wenigen Stunden um den Faktor 10 verbessern.


14
2017-08-10 14:44



+1 oder ein Faktor von 100 - richtige Indizes sind nicht zu unterschätzen ... - Oskar Duveborn


Das Fehlen von Festplatten-E / A führt dazu, dass Abfragen größtenteils aus dem RAM gespeist werden. Wenn Sie plötzlich Ihre heißen Tabellen nicht mehr in den RAM-Speicher legen und der Server mit der Arbeit an den Festplatten beginnt, könnten Sie eine schlechte Fahrt erleben. 2GB oder RAM ist heutzutage nicht viel, aber in der SQL2000-Ära wäre es beträchtlich gewesen. Ich vermute, dass die Menge der Daten, die die Anwendung normalerweise bearbeitet, kleiner ist als der RAM, den Sie haben. Vielleicht möchten Sie sich die Menge an "gebrauchtem" Speicherplatz in den Datendateien ansehen. Dadurch erhalten Sie eine Vorstellung davon, wie viel Arbeitsspeicher die Datenbank im schlimmsten Fall verbrauchen könnte. SQL Server speichert nicht die Daten, die nicht im RAM benötigt werden, aber es kann schwierig sein zu wissen, welche Tabellen wann verwendet werden.

Hyperthreading ist mit SQL Server nicht immer hilfreich. Sie können eine bessere Leistung erzielen, wenn Sie sie ausschalten. Es ist schwer zu testen, weil es einen Neustart erfordert, und das ist ein großer Aufwand für einen Produktionsserver.

"Hunderttausende von Abfragen pro Minute" bedeutet Tausende von Abfragen pro Sekunde. Das klingt ziemlich beschäftigt, aber ein großer Teil dieses Verkehrs kann nur durch den Zugriff von cursor abgerufen werden. Access ist besonders schlecht beim effizienten Abrufen von Resultsets aus SQL. Sie erzielen möglicherweise eine bessere Leistung, indem Sie die SQL Server-Parallelisierungseinstellung deaktivieren.

Sie möchten auch nach Sperren suchen. Das Werfen von Hardware bei einem Blockierungsproblem führt nicht immer zu der erhofften dramatischen Verbesserung. Wenn nicht viel blockiert wird und Abfragen von RAM statt von Festplatte befriedigt werden, verlassen Sie sich im Grunde auf das Grunzen des Prozessors und dessen Fähigkeit, Daten über die Speicherkanäle zu ziehen. In diesem Fall sollte schnellere Hardware eine gute Verbesserung bieten. Wenn Sie es eilig haben (um dieses Problem zu überwinden) und langsam wachsen, könnte das gut genug sein.

Als eine Lösung wird das Hinzufügen von Hardware nicht so gut skaliert wie die Verbesserung der Datenbank. Wenn Sie einen Wachstumsschub bekommen, könnte es sein, dass Ihre neue Hardware Probleme hat. Ein anderer Gedanke ist, dass erfolgreiche Anwendungen Benutzer anziehen. Wenn die Anwendung schneller reagiert, wird die Wahrscheinlichkeit erhöht, dass Benutzer mehr Berichte und Ähnliches ausführen, als wenn sie auf einen Kaffee warten müssten, während sie auf den Abschluss des Berichts warten.

Wenn das Datenbankschema wirklich schlecht ist, können Sie möglicherweise einige Performance-Gewinne erzielen, indem Sie sich einfach die Indexierung der Tabellen ansehen. Konzentriere dich auf Tabellen, von denen du weißt, dass sie oft abgefragt werden. Sie können Profiler verwenden, um Abfragen zu überwachen, die auf dem Server ausgeführt werden. Sagen Sie ihm einfach, dass er nach Abfragen suchen soll, die viele Daten lesen (z. B. 100.000 Seiten) und sich dann auf Abfragen konzentrieren, die nicht viel lesen. Sie haben erwähnt, dass einige Tabellen keine Schlüssel haben. Gibt es natürliche Schlüssel in den Daten, die nicht durch Einschränkungen oder eindeutige Indizes erzwungen werden?

Haben die Tabellen Clustered-Indizes? Der Mangel an gruppierter Indexierung kann alle Arten von sekundären Effekten verursachen.

Gibt es viele Nonclustered-Indizes mit vielen Spalten? Dies ist oft ein Versuch, viele abdeckende Indizes zu erstellen, anstatt eine effektivere Indexierungsstrategie zu implementieren. SQL Server kann während einer Abfrage effektiv abdeckende Indizes erstellen, wenn dies sinnvoll ist und nicht gruppierte und gruppierte Indizes unterstützt werden.

Schließlich lohnt es sich zu fragen: Wird die Wartung (Neuindizierung und / oder Aktualisierung von Statistiken) auf den Tischen durchgeführt?


8
2017-08-10 14:45



+1 versuchen, Spalten in häufig verwendeten Tabellen zu finden, um richtig zu indizieren, mit ein bisschen Glück könnte es leicht und schnell sein, es zu beheben - wenn nicht, sollte die kleine Zeit nicht zu teuer sein, wenn Sie oder was auch immer DBA / DBA der Bauunternehmer gibt auf und geht früh weiter, wenn es nicht so aussieht, als gäbe es eine Silberkugel, die darauf schießen könnte ... - Oskar Duveborn
Der Zugang ist nicht "besonders schlecht beim effizienten Abrufen von Resultsets aus SQL", es sei denn, die App wurde schlecht entworfen. Jet / ACE kann schlechte Annahmen treffen, wenn es Anforderungen an SQL Server sendet. Einer davon ist, dass Jet / ACE eine Stapelaktualisierung in ein UPDATE pro Zeile aufteilt. Dies ist vom Standpunkt der Leistung her gesehen schrecklich, aber es versucht, ein guter Server-Bürger zu sein, da es dem Server ermöglicht, die Anfragen mit denen anderer Benutzer zu serialisieren und zu verschachteln, anstatt alles mit einem langen Update zu verbinden. Dies kann umgangen werden, indem die Seite des Betriebsservers auf einen SPROC verschoben wird. - David W. Fenton
Die meisten Access-Apps, die ich sehe, sind nicht entworfen, sie passieren einfach und entwickeln sich dann "organisch". Ich bin ein Opfer von Access geworden, das große Ergebnismengen Zeile für Zeile abruft, mit dem Netzwerkverkehr und der Latenz, die mit einem solchen Verhalten einhergehen, so oft, dass ich aufgehört habe zu zählen. Ich bin nicht 100% sicher, dass dies nicht mit modernen Versionen von Access behoben wurde, die etwas wie SNAC anstatt Jet / Ace verwenden könnten oder wenn dies etwas ist, das von erfahreneren Access-Codierern bearbeitet werden könnte, aber es ist etwas, das Ich habe oft gesehen. - darin strait


Das ist eine Geschäftsfrage, keine technische Frage.

Als Geschäftsinhaber: Wie strategisch ist das System für das Geschäft? je weniger strategisch, je weniger ich mich darum kümmere & es behebe und alles Geld ausgegeben habe, ist das Geld, das ich anderweitig einsetzen könnte, um mein Geschäft zu erweitern.

Computer-Leute erschrecken mich, als sie alle in einen großen Raum kommen und über Design streiten und mir ein Vermögen kosten. Halten Sie das System am Laufen! ob das Performance-Tuning bedeutet (ohne Re-Architecture) oder dass mehr Hardware darauf geworfen wird, es ist nur eine Priorität, wenn es nicht mehr funktioniert.

Als IT-Berater: Ihr System ist alt und hat operative Kosten versteckt. Wir können ein System entwickeln, das zu Ihnen passt, das skaliert und eine Plattform für zukünftiges Wachstum und strategischen Vorteil bietet. Melden Sie sich hier an und alle Ihre Träume werden wahr.

Als IT-Mitarbeiter: Ich kann hier der Superheld sein und das Unternehmen retten, indem ich ein unmittelbar bevorstehendes Desaster abwenden kann, indem ich die Hölle aus diesem Ding optimiere! Mein Manager wird mich mit Geschenken und Lob überschütten, denn ich habe die Firma Tausende gerettet.


6
2017-08-10 15:09



+1, um beim Beantworten der Frage lustig zu sein. - Ernie


Ich sage beides.

Gerade jetzt deine 40% oder so CPU hast du gesagt? Beschweren Sie sich (sehr) schon? Wenn nicht, hast du noch Luft. Mehr Speicher reicht vielleicht gerade für eine Weile.

Frage nach dem Weg, haben Sie Softwareentwickler im Haus? Wenn die Antworten NEIN sind, versuchen Sie nicht einmal, es zu wiederholen. Du wirst genau dort enden, wo du jetzt bist.

Angenommen, Sie haben interne Entwickler, können Ihre internen Entwickler ein Projekt ordnungsgemäß durchführen? Ich spreche völlig aus, richtig (relistic) Timeline, im Grunde das gleiche wie wenn es ein Kundenprojekt war. Wenn nicht, dann kümmere dich nicht darum, oder es endet dort, wo du jetzt bist.

Solange sich Unternehmen nicht selbst zu Kunden machen und internen Projekten die gleichen Ressourcen geben müssen, landen Sie genau dort, wo Sie jetzt sind. Da gewesen, habe ich eine ganze Kommode mit T-Shirts gemacht.

Also, wenn Sie es nicht richtig machen können, sind Sie zwei Möglichkeiten sind aus der Box Turn Key, die Sie Mitarbeiter werden hassen, weil sie jetzt müssen Sie die Form des Systems passen Sie kaufen. Oder es wird angepasst werden und Sie müssen immer noch PROJECT Zeit anpassen anpassen.

ODER Refactor was du hast. Denken Sie daran, dass die Leute die gleiche vollständige Funktionalität erwarten, wenn die neue hereinkommt, deshalb müssen Sie alles andere auf einmal tun. Wenn Sie es neu einteilen, haben Sie die Möglichkeit, herauszufinden, wie es funktioniert, und dann, anstatt es ad-hoc zu ändern, planen Sie es in vielen kleinen Unterprojekten aus.

Ohne das System zu sehen, würde ich wahrscheinlich so viele Dinge wie möglich im Back-End normalisieren und so viel von SQL in gespeicherte Procs verschieben. Erstellen Sie dann ein neues Frontend aus C # Forms oder einer Webanwendung. Wenn Sie Ihre Geschäftslogik und SQL aus dem Frontend herausholen können, ist es einfacher, es später erneut zu machen. Wenn Sie das, was Sie tun, in kleinen Projekten aufbewahren, wenn es jederzeit beiseite geschoben oder gestoppt wird, haben Sie Fortschritte gemacht, die genutzt werden.


2
2017-08-10 12:29





Einige gute Antworten hier bereits - aber ich kann nur darauf hinweisen, dass (vorausgesetzt, es gibt in Haus-Entwickler) eine relativ geringe Menge an Arbeit eine große Wirkung haben - fügen Sie Primärschlüssel hinzu (Sie sollten nicht einmal alle Ihre Fragen zu ändern Verwenden Sie sie, fügen Sie Indizes zu den Feldern hinzu, die Sie verwenden, und stimmen Sie Ihre Abfragen ein wenig ab, und Sie konnten einen absolut großen Anstieg sehen. Kaufen Sie sich jetzt etwas RAM dafür, um die Zeit und den Spielraum zu kaufen, den Sie brauchen, um es zu reparieren und dann zur Arbeit zu kommen.

Zum Thema "fix it or ditch it", wenn die Funktionen des Systems grundsätzlich für Sie arbeiten und tun, was Sie brauchen, schreiben Sie das Rad nicht neu. Wenn Ihre Benutzer Gymnastik machen müssen, um das Ding zu benutzen, weil es nicht Ihren Bedürfnissen entspricht, dann macht es keinen Sinn, sich darum zu bemühen.


2
2017-08-10 13:44





Nun ... das ist jetzt schon eine Weile her, aber ich dachte, ich würde das Ergebnis hier aufzeichnen.

Am Ende bin ich Zeile für Zeile durch die VBA gegangen, um ein anderes Problem zu lösen. Da merkte ich, dass einige Aufrufe von Rowsets für 20-30 + Sekunden blockiert wurden.

Als ich mich in sie grub, stellte ich fest, dass das Rowset auf einer MS Access-Abfrage basierte.

Das war das Auswählen von Daten aus einer anderen Access-Abfrage.

Das war das Auswählen von Daten aus einer weiteren Access-Abfrage.

All das sah so aus, als wären sie zusammen mit dem Abfrage-Designer per Drag & Drop verschoben worden.

Ich ging durch die oberen sechs Benutzer Schmerzpunkte und stellte fest, dass sie alle genau die gleichen waren.

Also entfernte ich die Stapel von angeketteten Abfragen vollständig und ersetzte jede von ihnen durch eine einzige Pass-Through-Abfrage, die in T-SQL geschrieben und direkt auf dem Server ausgeführt werden konnte.

Die Verbesserung war in jedem Fall absolut unübersehbar und es gab kein Warten auf Anfragen mehr für irgendjemanden.

Und dann habe ich die Firma verlassen. Keine Ahnung, ob es noch da ist ... aber ich vermisse es nicht.


2
2017-08-29 16:07



An verschachtelten Abfragen ist nichts von Natur aus falsch. Und was wirklich wichtig ist, ist nicht, was in der Quelle QueryDefs in Access ist, sondern was Jet / ACE letztendlich an den Server sendet, was Sie mit SQL Profiler herausfinden können. Ja, es ist möglich, in Acces schlechte Anfragen zu schreiben, die ineffizient sind und Dinge verlangsamen, aber das ist in jeder Datenbank möglich! - David W. Fenton