Navigation · Als Startseite festlegen · Zu Favoriten hinzufügen · Mobile Tencent · Tencent-Startseite Nachrichten Blog Forum Kommentare Finanzen Wertpapiere Hongkonger Aktienfonds Unterhaltung Stars Filme Musik Sport NBA Fußball Umfassend Autos Immobilien Haushaltsgeräte Technologie Digital Mobile Downloads Frauengefühle Kindererziehung Mode Einkaufen Reisen Lesen Original Bildung: Ins Ausland gehen, Spiele, Anime-Animation, Sternbilder, Video, Live-Bilder, Expo, Wohltätigkeit, Kinder, neue, beliebte, heiße chinesische Goldscheibe. Besuchen Sie die bunte Welt der Mode und Luxusgüter. Nationale meistverkaufte Mobiltelefone. Folgen Sie der Rangliste, um zu sehen, welche Prominenten heute Geburtstag haben. Ihr Standort: Tencent Startseite > Technologie und Digitales > Digitale Scroll-Nachrichten > Text
Catch-21 für die SQL Server-Datenbankentwicklung http://digi.QQ.com 21. Dezember 2009 09:43 Zhongguancun Online Wenn Sie für ein auf SQL Server basierendes Projekt verantwortlich sind oder neu bei SQL Server sind, haben Sie möglicherweise die Möglichkeit Wenn Sie Probleme mit der Datenbankleistung haben, erhalten Sie in diesem Artikel einige nützliche Anleitungen (die meisten davon können auch mit anderen DBMS verwendet werden).
Hier werde ich weder Tipps zur Verwendung von SQL Server vorstellen, noch kann ich eine Allheilmittellösung anbieten. Ich fasse lediglich einige Erfahrungen zusammen, wie man ein gutes Design erstellt. Diese Erfahrung beruht auf dem, was ich in den letzten Jahren gelernt habe, in denen ich viele der gleichen Designfehler immer wieder wiederholen sah.
1. Kennen Sie die Tools, die Sie verwenden
Unterschätzen Sie das nicht, es ist der kritischste Punkt, den ich in diesem Artikel ansprechen werde. Vielleicht haben Sie auch gesehen, dass viele SQLServer-Programmierer nicht alle T-SQL-Befehle und die nützlichen Tools beherrschen, die SQLServer bereitstellt.
„Was? Ich werde einen Monat damit verschwenden, SQL-Befehle zu lernen, die ich nie verwenden werde???“, könnten Sie sagen. Richtig, das müssen Sie nicht tun. Sie sollten jedoch ein Wochenende damit verbringen, alle T-SQL-Befehle durchzugehen. Ihre Aufgabe hier besteht darin, zu verstehen, dass Sie sich in Zukunft beim Entwerfen einer Abfrage daran erinnern werden: „Übrigens ist hier ein Befehl, der die von mir benötigte Funktion vollständig erfüllen kann.“ Gehen Sie also zu MSDN, um die genaue Syntax von zu überprüfen diesen Befehl.
Lassen Sie es mich noch einmal wiederholen: Verwenden Sie keine Cursor. Wenn Sie die Leistung des gesamten Systems zerstören möchten, sind sie Ihre effektivste erste Wahl. Die meisten Anfänger verwenden Cursor, ohne sich der Auswirkungen bewusst zu sein, die sie auf die Leistung haben. Sie beanspruchen Speicher, sperren Tabellen auf all ihre seltsamen Arten und arbeiten wie eine Schnecke. Und das Schlimmste ist, dass sie dafür sorgen können, dass alle Leistungsoptimierungen, die Ihr DBA durchführen kann, gleichbedeutend damit sind, dass Sie es nicht tun. Wussten Sie, dass Sie jedes Mal, wenn Sie FETCH ausführen, einen SELECT-Befehl ausführen? Das heißt, wenn Ihr Cursor 10.000 Datensätze hat, führt er 10.000 SELECTs aus! Es ist viel effizienter, wenn Sie eine Reihe von SELECT, UPDATE oder DELETE verwenden, um die entsprechende Arbeit abzuschließen.
Anfänger denken im Allgemeinen, dass die Verwendung von Cursorn eine vertrautere und komfortablere Art des Programmierens sei, aber leider kann dies zu einer schlechten Leistung führen. Offensichtlich besteht der Gesamtzweck von SQL darin, was Sie erreichen möchten, und nicht darin, wie.
Ich habe einmal eine Cursor-basierte gespeicherte Prozedur mit T-SQL neu geschrieben. Die Tabelle hatte nur 100.000 Datensätze. Die ursprüngliche gespeicherte Prozedur dauerte 40 Minuten, die neue gespeicherte Prozedur jedoch nur 10 Sekunden. Ich denke, Sie sollten hier sehen können, was ein inkompetenter Programmierer tut! ! !
Manchmal können wir ein kleines Programm schreiben, um Daten abzurufen und zu verarbeiten und die Datenbank zu aktualisieren, was manchmal effizienter ist. Denken Sie daran: T-SQL kann nichts gegen Schleifen unternehmen.
Ich möchte Sie noch einmal daran erinnern: Die Verwendung von Cursorn bietet keine Vorteile. Ich habe noch nie erlebt, dass mit Cursorn irgendetwas effektiv gemacht wurde, außer bei der DBA-Arbeit.
3. Standardisieren Sie Ihre Datentabellen
Warum nicht die Datenbank normalisieren? Es gibt wahrscheinlich zwei Ausreden: Leistungsgründe und pure Faulheit. Was den zweiten Punkt betrifft: Früher oder später müssen Sie dafür bezahlen. Und was die Leistung betrifft, müssen Sie nichts optimieren, was überhaupt nicht langsam ist. Ich sehe oft, dass Programmierer eine Datenbank „denormalisieren“, weil der Grund darin liegt, dass „das ursprüngliche Design zu langsam war“, aber oft ist das Ergebnis, dass sie das System langsamer machen. DBMS ist für den Umgang mit kanonischen Datenbanken konzipiert. Denken Sie also daran: Entwerfen Sie die Datenbank entsprechend den Anforderungen der Kanonisierung.
4. Verwenden Sie nicht SELECT *
Das ist nicht einfach, das weiß ich nur zu gut, weil ich es ständig selbst mache. Wenn Sie jedoch die benötigten Spalten in SELECT angeben, bietet dies folgende Vorteile:
1 Reduzieren Sie den Speicherverbrauch und die Netzwerkbandbreite
2 Sie können ein sichereres Design erhalten
3 Geben Sie dem Abfrageoptimierer die Möglichkeit, alle erforderlichen Spalten aus dem Index zu lesen
Seite 2: Verstehen Sie, was Sie mit Ihren Daten machen werden
Es ist eine gute Sache, einen robusten Index für Ihre Datenbank zu erstellen. Aber das zu tun ist einfach eine Kunst. Wenn Sie einer Tabelle einen Index hinzufügen, ist SELECT schneller, INSERT und DELETE jedoch deutlich langsamer, da das Erstellen und Verwalten des Index viel zusätzliche Arbeit erfordert. Offensichtlich ist der Schlüssel zur Frage hier: Welche Art von Operation möchten Sie an dieser Tabelle ausführen? Dieses Problem ist insbesondere bei DELETE und UPDATE nicht leicht zu verstehen, da diese Anweisungen häufig SELECT-Befehle im WHERE-Teil enthalten.
6. Erstellen Sie keinen Index für die Spalte „Geschlecht“.
Zunächst müssen wir verstehen, wie Indizes den Zugriff auf eine Tabelle beschleunigen. Sie können sich Indizes als eine Möglichkeit vorstellen, eine Tabelle anhand bestimmter Kriterien zu unterteilen. Wenn Sie einen Index für eine Spalte wie „Geschlecht“ erstellen, teilen Sie die Tabelle einfach in zwei Teile: männlich und weiblich. Sie haben es mit einer Tabelle mit 1.000.000 Datensätzen zu tun. Welche Bedeutung hat diese Unterteilung? Denken Sie daran: Die Pflege von Indizes ist zeitaufwändig. Befolgen Sie beim Entwerfen des Index bitte diese Regel: Ordnen Sie die Spalten von der höchsten zur niedrigsten Anzahl entsprechend der Anzahl unterschiedlicher Inhalte an, die die Spalte enthalten kann, z. B. Name + Provinz + Geschlecht.
7. Verwenden Sie Transaktionen
Bitte verwenden Sie Transaktionen, insbesondere wenn Abfragen zeitaufwändig sind. Wenn mit Ihrem System etwas schief geht, rettet dies Ihr Leben. Im Allgemeinen werden Programmierer mit etwas Erfahrung verstehen, dass Sie häufig auf unvorhersehbare Situationen stoßen, die zum Absturz der gespeicherten Prozedur führen.
8. Hüten Sie sich vor Deadlocks
Greifen Sie in einer bestimmten Reihenfolge auf Ihre Tabellen zu. Wenn Sie zuerst Tabelle A und dann Tabelle B sperren, müssen diese in dieser Reihenfolge in allen gespeicherten Prozeduren gesperrt werden. Wenn Sie (versehentlich) zuerst Tabelle B und dann Tabelle A in einer gespeicherten Prozedur sperren, kann dies zu einem Deadlock führen. Wenn die Sperrsequenz nicht im Voraus detailliert entworfen wird, ist ein Deadlock nicht leicht zu erkennen.
Eine häufig gestellte Frage lautet: Wie kann ich einer ComboBox schnell 100.000 Datensätze hinzufügen? Das ist nicht richtig und Sie können und müssen dies nicht tun. Es ist ganz einfach. Wenn Ihr Benutzer 100.000 Datensätze durchsuchen muss, um den Datensatz zu finden, den er benötigt, wird er Sie definitiv verfluchen. Hier benötigen Sie eine bessere Benutzeroberfläche und dürfen Ihren Benutzern nicht mehr als 100 oder 200 Datensätze anzeigen.
Im Vergleich zu serverseitigen Cursorn können clientseitige Cursor den Server- und Netzwerk-Overhead reduzieren und auch die Sperrzeit verkürzen.
11. Verwenden Sie die Parameterabfrage
Manchmal sehe ich im technischen CSDN-Forum Fragen wie diese: „SELECT * FROM aWHEREa.id='A'B, eine Ausnahme tritt aufgrund einer Abfrage in einfache Anführungszeichen auf, was soll ich tun?“, und die häufigste Antwort lautet: Verwenden Sie zwei Einfache Anführungszeichen statt einfache Anführungszeichen. Das ist falsch. Dadurch werden die Symptome und nicht die Grundursache behandelt, da Sie auch bei anderen Zeichen auf solche Probleme stoßen werden, ganz zu schweigen davon, dass dadurch schwerwiegende Fehler auftreten. Darüber hinaus wird dadurch auch verhindert, dass das SQL Server-Puffersystem ordnungsgemäß funktioniert. Durch die Verwendung der Parameterabfrage verschwinden alle diese Probleme.
12. Verwenden Sie beim Codieren von Programmen große Datendatenbanken
Die von Programmierern in der Entwicklung verwendete Testdatenbank verfügt im Allgemeinen nicht über große Datenmengen, der Endbenutzer verfügt jedoch häufig über große Datenmengen. Unser üblicher Ansatz ist falsch, und der Grund ist ganz einfach: Festplatten sind heutzutage nicht mehr sehr teuer, aber warum werden Leistungsprobleme erst bemerkt, wenn sie irreversibel sind?
13. Verwenden Sie INSERT nicht zum Importieren großer Datenmengen
Bitte tun Sie dies nicht, es sei denn, es ist absolut notwendig. Nutzen Sie UTS oder BCP, um Flexibilität und Geschwindigkeit auf einen Schlag zu erhalten.
14. Achten Sie auf Timeout-Probleme
Beim Abfragen der Datenbank ist der Standardwert der allgemeinen Datenbank relativ klein, z. B. 15 Sekunden oder 30 Sekunden. Die Ausführung einiger Abfragen dauert länger, insbesondere wenn die Datenmenge in der Datenbank weiter zunimmt.
Seite 3: Ignorieren Sie nicht das Problem der gleichzeitigen Änderung desselben Datensatzes
15. Ignorieren Sie nicht das Problem der gleichzeitigen Änderung desselben Datensatzes
Manchmal ändern zwei Benutzer gleichzeitig denselben Datensatz. Wenn der letztere Modifikator die Vorgänge des vorherigen Modifikators ändert, gehen einige Aktualisierungen verloren. Der Umgang mit dieser Situation ist nicht schwierig: Erstellen Sie ein Zeitstempelfeld, überprüfen Sie es vor dem Schreiben, führen Sie die Änderungen zusammen, sofern dies zulässig ist, und informieren Sie den Benutzer, wenn ein Konflikt vorliegt.
16. Wenn Sie Datensätze in die Detailtabelle einfügen, führen Sie SELECT MAX(ID) nicht in der Haupttabelle aus
Dies ist ein häufiger Fehler, der zu Fehlern führt, wenn zwei Benutzer gleichzeitig Daten eingeben. Sie können SCOPE_IDENTITY, IDENT_CURRENT und IDENTITY verwenden. Wenn möglich, verwenden Sie IDENTITY nicht, da es bei Vorhandensein von Triggern zu Problemen führen kann (siehe Diskussion hier).
17. Vermeiden Sie es, Spalten als NULL-Werte festzulegen
Wenn möglich, sollten Sie es vermeiden, Spalten NULL-fähig zu machen. Das System weist jeder Zeile der NULL-fähigen Spalte ein zusätzliches Byte zu, was bei der Abfrage zu einem höheren Systemaufwand führt. Darüber hinaus erschwert das Setzen von NULL-Werten für Spalten die Codierung, da diese Spalten bei jedem Zugriff überprüft werden müssen.
Ich sage nicht, dass NULL-Werte eine Quelle von Problemen sind, obwohl manche Leute das glauben. Ich denke, dass es manchmal gut funktionieren kann, eine Spalte NULL-fähig zu machen, wenn in Ihren Geschäftsregeln „Nulldaten“ zulässig sind, aber die Verwendung von NULL-Werten in einer Situation wie der folgenden ist problematisch.
Kundenname1
Kundenadresse1
Kunden-E-Mail1
Kundenname2
Kundenadresse2
Kunden-E-Mail3
Kundenname1
Kundenadresse2
Kunden-E-Mail3
In diesem Fall müssen Sie Ihre Tabelle normalisieren.
18. Versuchen Sie, den Datentyp TEXT nicht zu verwenden
Verwenden Sie TEXT nicht, es sei denn, Sie haben es mit einem sehr großen Datensatz zu tun. Weil es nicht einfach abzufragen ist, langsam ist und bei unsachgemäßer Verwendung viel Platz verschwendet. Im Allgemeinen kann VARCHAR Ihre Daten besser verarbeiten.
19. Versuchen Sie, keine temporären Tabellen zu verwenden
Versuchen Sie, keine temporären Tabellen zu verwenden, es sei denn, dies ist unbedingt erforderlich. Im Allgemeinen können Unterabfragen anstelle temporärer Tabellen verwendet werden. Die Verwendung temporärer Tabellen führt zu einem Systemaufwand, und wenn Sie mit COM+ programmieren, wird es Ihnen auch viele Probleme bereiten, da COM+ einen Datenbankverbindungspool verwendet und die temporäre Tabelle von Anfang bis Ende vorhanden ist. SQL Server bietet einige Alternativen, beispielsweise den Datentyp „Tabelle“.
20. Lernen Sie zu analysieren und abzufragen
SQL Server Query Analyzer ist Ihr bester Freund, mit dem Sie verstehen können, wie sich Abfragen und Indizes auf die Leistung auswirken.
21. Nutzen Sie referenzielle Integrität
Das Definieren von Primärschlüsseln, eindeutigen Einschränkungen und Fremdschlüsseln kann viel Zeit sparen.