Es gibt viele Gründe für eine langsame Abfragegeschwindigkeit. Die häufigsten sind die folgenden: 1. Es gibt keinen Index oder der Index wird nicht verwendet (das ist das häufigste Problem bei langsamen Abfragen und ein Fehler im Programmdesign). 2. Der E/A-Durchsatz ist niedrig, wodurch ein Engpasseffekt entsteht. 3. Wenn das Erstellen berechneter Spalten fehlschlägt, sind die Abfragen nicht optimiert. 4. Nicht genügend Speicher 5. Langsame Netzwerkgeschwindigkeit 6. Die abgefragte Datenmenge ist zu groß (Sie können mehrere Abfragen oder andere Methoden verwenden, um die Datenmenge zu reduzieren) 7. Sperren oder Deadlocks (dies ist auch das häufigste Problem bei langsamen Abfragen und ein Fehler im Programmdesign) 8. sp_lock, sp_who, aktive Benutzerprüfung, der Grund ist Lese-/Schreibwettbewerb bei Ressourcen. 9. Unnötige Zeilen und Spalten werden zurückgegeben 10. Die Abfrageanweisung ist nicht gut und nicht optimiert Sie können Abfragen wie folgt optimieren: 1. Legen Sie Daten, Protokolle und Indizes auf verschiedene E/A-Geräte, um die Lesegeschwindigkeit zu erhöhen. Bisher konnte Tempdb auf RAID0 abgelegt werden, aber SQL2000 unterstützt dies nicht mehr. Je größer die Datenmenge (Größe), desto wichtiger ist eine Verbesserung der E/A. 2. Teilen Sie die Tabelle vertikal und horizontal, um die Größe der Tabelle zu reduzieren (sp_spaceuse). 3. Rüsten Sie Ihre Hardware auf 4. Erstellen Sie Indizes basierend auf Abfragebedingungen, optimieren Sie Indizes, optimieren Sie Zugriffsmethoden und begrenzen Sie die Datenmenge im Ergebnissatz. Beachten Sie, dass der Füllfaktor angemessen sein sollte (am besten verwenden Sie den Standardwert 0). Der Index sollte so klein wie möglich sein. Es ist besser, Spalten mit kleinen Bytes zum Erstellen von Indizes zu verwenden (siehe Indexerstellung). Erstellen Sie keinen einzelnen Index für ein Feld mit einer begrenzten Anzahl von Werten, wie z. B. das Feld „Geschlecht“. 5. Verbessern Sie die Internetgeschwindigkeit; 6. Erweitern Sie den Arbeitsspeicher des Servers. Windows 2000 und SQL Server 2000 unterstützen 4-8 GB Arbeitsspeicher. Virtuellen Speicher konfigurieren: Die Größe des virtuellen Speichers sollte basierend auf den gleichzeitig auf dem Computer ausgeführten Diensten konfiguriert werden. Wenn Sie Microsoft SQL Server 2000 ausführen, sollten Sie die Größe des virtuellen Speichers auf das 1,5-fache des im Computer installierten physischen Speichers einstellen. Wenn Sie zusätzlich die Volltextsuchfunktion installieren und den Microsoft Search-Dienst zum Durchführen von Volltextindizierungen und -abfragen ausführen möchten, sollten Sie die Größe des virtuellen Speichers so konfigurieren, dass er mindestens dreimal so groß ist wie der im Computer installierte physische Speicher. Konfigurieren Sie die Serverkonfigurationsoption „Maximaler Serverspeicher“ von SQL Server auf das 1,5-fache des physischen Speichers (die Hälfte der Einstellung für die Größe des virtuellen Speichers). 7. Erhöhen Sie die Anzahl der Server-CPUs. Dabei muss jedoch berücksichtigt werden, dass die parallele Verarbeitung mehr Ressourcen (z. B. Speicher) erfordert als die serielle Verarbeitung. MsSQL prüft und wählt automatisch aus, ob eine parallele oder serielle Verarbeitung verwendet werden soll. Eine einzelne Aufgabe wird in mehrere Aufgaben aufgeteilt, die auf dem Prozessor ausgeführt werden können. Beispielsweise werden die Sortier-, Verknüpfungs-, Scan- und GROUP BY-Klauseln verzögerter Abfragen gleichzeitig ausgeführt. SQL SERVER bestimmt den optimalen Grad der Parallelität basierend auf der Systemlast. Komplexe Abfragen, die viel CPU verbrauchen, eignen sich am besten für die parallele Verarbeitung. Die Aktualisierungsvorgänge UPDATE, INSERT und DELETE können jedoch nicht parallel verarbeitet werden. 8. Wenn Sie zum Abfragen LIKE verwenden, reicht die einfache Verwendung eines Index nicht aus, da die Volltextindizierung Speicherplatz verbraucht. wie ,a%‘. Verwenden Sie einen Index wie ,%a‘. Verwenden Sie keinen Index. Bei Abfragen wie ,%a%‘ ist die Abfragezeit proportional zur Gesamtlänge des Feldwerts, daher kann der Typ CHAR nicht verwendet werden, sondern VARCHAR. Erstellen Sie einen Volltextindex für Felder mit sehr langen Werten. 9. Trennung von DB-Server und Anwendungsserver; Trennung von OLTP und OLAP 10. Verteilte partitionierte Ansichten können zur Implementierung von Datenbankserverkomplexen verwendet werden. Eine Föderation ist eine Gruppe von Servern, die separat verwaltet werden, aber zusammenarbeiten, um die Verarbeitungslast des Systems zu teilen. Dieser Mechanismus der Bildung einer Datenbankserverföderation durch Partitionierung von Daten kann eine Gruppe von Servern erweitern, um die Verarbeitungsanforderungen großer mehrschichtiger Websites zu unterstützen. Weitere Informationen finden Sie unter Entwerfen eines föderierten Datenbankservers. (Siehe die SQL-Hilfedatei „Partitionierte Ansicht“) a. Bevor Sie partitionierte Ansichten implementieren, müssen Sie zunächst die Tabelle horizontal partitionieren. b. Definieren Sie nach dem Erstellen der Mitgliedstabelle auf jedem Mitgliedsserver eine verteilte partitionierte Ansicht, und jede Ansicht hat denselben Namen. Daher können Abfragen, die auf den Namen der verteilten partitionierten Ansicht verweisen, auf jedem Mitgliedsserver ausgeführt werden. Das System funktioniert, als ob auf jedem Mitgliedsserver eine Kopie der Originaltabelle vorhanden wäre. Tatsächlich gibt es jedoch auf jedem Server nur eine Mitgliedstabelle und eine verteilte partitionierte Ansicht. Der Speicherort der Daten ist für die Anwendung transparent. 11. Erstellen Sie Indizes mit DBCC REINDEX und DBCC INDEXDEFRAG neu, verkleinern Sie Daten und Protokolle mit DBCC SHRINKDB und DBCC SHRINKFILE. Richten Sie eine automatische Protokollverkleinerung ein. Richten Sie bei großen Datenbanken keine automatische Datenbankvergrößerung ein, da dies die Serverleistung verringert. Beim Schreiben von T-SQL müssen viele Dinge beachtet werden. Hier sind die gemeinsamen Punkte: Erstens läuft der Prozess der DBMS-Verarbeitung von Abfrageplänen wie folgt ab: 1. Lexikalische und grammatikalische Überprüfung von Abfrageanweisungen 2. Senden Sie die Anweisung an den DBMS-Abfrageoptimierer 3. Der Optimierer führt eine algebraische Optimierung und eine Zugriffspfadoptimierung durch 4. Generieren Sie einen Abfrageplan aus einem vorkompilierten Modul 5. Senden Sie es dann zum entsprechenden Zeitpunkt an das System zur Verarbeitung und Ausführung 6. Schließlich wird das Ausführungsergebnis an den Benutzer zurückgegeben. Als nächstes werfen wir einen Blick auf die Datenspeicherstruktur von SQL SERVER: Die Größe einer Seite beträgt 8 KB (8060) Bytes, 8 Seiten bilden einen Festplattenbereich und werden gemäß dem B-Baum gespeichert. 12. Der Unterschied zwischen Commit und Rollback Rollback: Rollback aller Transaktionen. Commit: Übernimmt die aktuelle Transaktion. Es ist nicht nötig, Transaktionen in dynamischem SQL zu schreiben. Wenn Sie sie schreiben müssen, schreiben Sie sie bitte außerhalb, z. B.: begin tran exec(@s) commit trans oder schreiben Sie dynamisches SQL als Funktion oder gespeicherte Prozedur. 13. Verwenden Sie die Where-Klausel in der Select-Anweisung der Abfrage, um die Anzahl der zurückgegebenen Zeilen zu begrenzen und Tabellenscans zu vermeiden. Wenn unnötige Daten zurückgegeben werden, werden die E/A-Ressourcen des Servers verschwendet, die Netzwerklast erhöht und die Leistung verringert. Wenn die Tabelle sehr groß ist, führt das Sperren der Tabelle während des Tabellenscans dazu, dass andere Verbindungen nicht auf die Tabelle zugreifen können, was schwerwiegende Folgen haben kann. 14. SQL-Kommentare haben keinen Einfluss auf die Ausführung 15. Vermeiden Sie die Verwendung des Cursors möglichst, da dieser viele Ressourcen verbraucht. Wenn eine zeilenweise Ausführung erforderlich ist, versuchen Sie, Techniken ohne Cursor zu verwenden, z. B.: Schleifen auf dem Client, Verwendung temporärer Tabellen, Tabellenvariablen, Unterabfragen, Case-Anweisungen usw. Ein Cursor kann nach den von ihm unterstützten Abrufoptionen klassifiziert werden: Nur Zeilen müssen sequenziell von der ersten bis zur letzten Zeile abgerufen werden. FETCH NEXT ist die einzige zulässige Abrufoperation und die Standardeinstellung. Durch die Bildlauffunktion können Sie eine beliebige Zeile an einer beliebigen Stelle im Cursor abrufen. Die Cursor-Technologie ist unter SQL2000 sehr leistungsfähig geworden und ihr Zweck besteht in der Unterstützung von Schleifen. Es gibt vier Parallelitätsoptionen READ_ONLY: Es sind keine Aktualisierungen durch Cursorpositionierung (Update) zulässig und es werden keine Sperren für die Zeilen vorgenommen, aus denen der Ergebnissatz besteht. OPTIMISTISCH MIT WERTEN: Die optimistische Parallelitätskontrolle ist ein Standardbestandteil der Transaktionskontrolltheorie. Die optimistische Parallelitätssteuerung wird in Situationen verwendet, in denen nur eine geringe Wahrscheinlichkeit besteht, dass ein zweiter Benutzer eine Zeile in der Zeitspanne zwischen dem Öffnen eines Cursors und dem Aktualisieren einer Zeile aktualisieren könnte. Wenn ein Cursor mit dieser Option geöffnet wird, werden keine Sperren für seine Zeilen gehalten, wodurch seine Verarbeitungsleistung maximiert wird. Wenn der Benutzer versucht, eine Zeile zu ändern, wird der aktuelle Wert der Zeile mit dem Wert verglichen, der beim letzten Abrufen der Zeile ermittelt wurde. Wenn sich ein Wert ändert, erkennt der Server, dass jemand anderes diese Zeile aktualisiert hat, und gibt einen Fehler zurück. Bei Übereinstimmung der Werte nimmt der Server die Änderung vor. Wählen Sie diese Parallelitätsoption: OPTIMISTISCH MIT ZEILENVERSIONIERUNG: Diese optimistische Parallelitätskontrolloption basiert auf Zeilenversionierung. Bei der Zeilenversionierung muss die Tabelle über eine Art Versionskennung verfügen, mit der der Server feststellen kann, ob sich die Zeile seit dem Einlesen in den Cursor geändert hat. In SQL Server wird diese Funktion durch den Zeitstempel-Datentyp bereitgestellt, bei dem es sich um eine Binärzahl handelt, die die relative Reihenfolge der Änderungen in der Datenbank darstellt. Jede Datenbank hat einen globalen aktuellen Zeitstempelwert: @@DBTS. Jedes Mal, wenn eine Zeile mit einer Zeitstempelspalte in irgendeiner Weise geändert wird, speichert SQL Server zuerst den aktuellen @@DBTS-Wert in der Zeitstempelspalte und erhöht dann den Wert von @@DBTS. Wenn eine Tabelle eine Zeitstempelspalte hat, wird der Zeitstempel auf Zeilenebene aufgezeichnet. Der Server kann dann den aktuellen Zeitstempelwert einer Zeile mit dem beim letzten Abruf gespeicherten Zeitstempelwert vergleichen, um festzustellen, ob die Zeile aktualisiert wurde. Der Server muss nicht die Werte aller Spalten vergleichen, sondern nur die der Zeitstempelspalte. Wenn die Anwendung keine Zeitstempelspaltentabelle hat, die optimistische Parallelität basierend auf der Zeilenversionierung erfordert, wird für den Cursor standardmäßig die optimistische Parallelitätssteuerung basierend auf numerischen Werten verwendet. SCROLL LOCKS: Diese Option implementiert eine pessimistische Parallelitätskontrolle. Bei der pessimistischen Parallelitätskontrolle versucht die Anwendung, Datenbankzeilen zu sperren, während sie in einen Cursor-Ergebnissatz gelesen werden. Bei Verwendung eines Servercursors wird eine Aktualisierungssperre auf eine Zeile gesetzt, während sie in den Cursor eingelesen wird. Wenn ein Cursor innerhalb einer Transaktion geöffnet wird, bleibt die Transaktionsaktualisierungssperre bestehen, bis die Transaktion festgeschrieben oder zurückgesetzt wird. Die Cursorsperre wird entfernt, wenn die nächste Zeile abgerufen wird. Wenn der Cursor außerhalb einer Transaktion geöffnet wird, wird die Sperre aufgehoben, wenn die nächste Zeile abgerufen wird. Wenn der Benutzer eine vollständige pessimistische Parallelitätskontrolle benötigt, sollte der Cursor daher innerhalb einer Transaktion geöffnet werden. Eine Aktualisierungssperre verhindert, dass eine andere Aufgabe eine Aktualisierungssperre oder eine exklusive Sperre erhält, und verhindert dadurch, dass andere Aufgaben die Zeile aktualisieren. Eine Aktualisierungssperre blockiert jedoch keine gemeinsam genutzten Sperren und hindert daher einen anderen Task nicht daran, die Zeile zu lesen, es sei denn, der zweite Task fordert ebenfalls einen Lesevorgang mit einer Aktualisierungssperre an. Rollensperren: Diese Cursor-Parallelitätsoptionen können Rollensperren basierend auf den Sperrhinweisen generieren, die in der SELECT-Anweisung der Cursordefinition angegeben sind. Beim Abrufen jeder Zeile wird eine Bildlaufsperre aktiviert und bis zum nächsten Abruf oder bis zum Schließen des Cursors aufrechterhalten, je nachdem, was zuerst eintritt. Beim nächsten Abruf erwirbt der Server Scroll-Sperren für die Zeilen im neuen Abruf und gibt die Scroll-Sperren für die Zeilen im vorherigen Abruf frei. Scroll-Sperren sind unabhängig von Transaktionssperren und können nach einem Commit- oder Rollback-Vorgang aufrechterhalten werden. Wenn die Option zum Schließen von Cursorn beim Commit deaktiviert ist, schließt die COMMIT-Anweisung keine offenen Cursor und Bildlaufsperren bleiben bis nach dem Commit erhalten, um die Isolation der abgerufenen Daten aufrechtzuerhalten. Die Art der erworbenen Rollensperre hängt von den Cursor-Parallelitätsoptionen und den Sperrhinweisen in der Cursor-SELECT-Anweisung ab. Sperrhinweise Nur-Lese, Optimistisch, Numerisch, Optimistisch, Zeilenversionierung, Sperren, Kein Hinweis, Entsperrt, Entsperrt, Entsperrt, Aktualisieren, NOLOCK, Entsperrt, Entsperrt, Entsperrt, Entsperrt, HOLDLOCK, Geteilt, Geteilt, Geteilt, Aktualisieren, UPDLOCK, Fehler, Aktualisieren, Aktualisieren, Aktualisieren, TABLOCKX, Fehler, Entsperrt, Entsperrt, Aktualisieren, Sonstiges, Entsperrt, Entsperrt, Entsperrt, Aktualisieren, *Durch die Angabe des NOLOCK-Hinweises wird die Tabelle, für die der Hinweis angegeben ist, innerhalb eines Cursors schreibgeschützt. 16. Verwenden Sie den Profiler, um Abfragen zu verfolgen, die für Abfragen benötigte Zeit zu ermitteln und die SQL-Probleme herauszufinden. Verwenden Sie den Indexoptimierer, um Indizes zu optimieren 17. Beachten Sie den Unterschied zwischen UNion und UNion all. UNION alles ist gut 18. Seien Sie vorsichtig, wenn Sie DISTINCT verwenden. Verwenden Sie es nicht, wenn es nicht notwendig ist. Wie UNION verlangsamt es die Abfrage. Doppelte Datensätze sind in der Abfrage kein Problem 19. Geben Sie bei der Abfrage keine unnötigen Zeilen und Spalten zurück 20. Verwenden Sie sp_configure 'query governor cost limit' oder SET QUERY_GOVERNOR_COST_LIMIT, um die von der Abfrage verbrauchten Ressourcen zu begrenzen. Wenn die durch die Auswertung einer Abfrage verbrauchten Ressourcen den Grenzwert überschreiten, bricht der Server die Abfrage automatisch ab und beendet sie, bevor sie ausgeführt wird. SET LOCKTIME stellt die Sperrzeit ein 21. Verwenden Sie select top 100 / 10 Percent, um die Anzahl der vom Benutzer zurückgegebenen Zeilen zu begrenzen, oder SET ROWCOUNT, um die Zeilen der Operation zu begrenzen 22. Verwenden Sie vor SQL2000 im Allgemeinen nicht die folgenden Anweisungen: „IS NULL“, „<>“, „!=“, „!>“, „!<“, „NOT“, „NOT EXISTS“, „NOT IN“, „NOT LIKE“ und „LIKE '%500'“, da diese keine Indizes verwenden und es sich bei allen um Tabellenscans handelt. Fügen Sie dem Spaltennamen in der WHere-Klausel außerdem keine Funktionen wie Convert, Substring usw. hinzu. Wenn Sie eine Funktion verwenden müssen, erstellen Sie eine berechnete Spalte und dann stattdessen einen Index. Sie können auch die Schreibmethode ändern: Ändern Sie WHERE SUBSTRING(firstname,1,1) = 'm' in WHERE firstname like 'm%' (Indexscan). Achten Sie darauf, Funktion und Spaltennamen zu trennen. Erstellen Sie außerdem nicht zu viele Indizes und machen Sie sie nicht zu groß. NOT IN durchsucht die Tabelle mehrmals. Verwenden Sie stattdessen EXISTS, NOT EXISTS, IN, LEFT OUTER JOIN, insbesondere Left Join. Exists ist schneller als IN, und am langsamsten ist die NOT-Operation. Wenn der Wert einer Spalte null enthält, funktionierte ihr Index vorher nicht, aber jetzt kann der 2000-Optimierer damit umgehen. Dasselbe gilt für IS NULL, "NOT", "NOT EXISTS", "NOT IN", die optimiert werden können, aber "<>" usw. nicht, da kein Index verwendet wird. 23. Verwenden Sie den Query Analyzer, um den Abfrageplan der SQL-Anweisung anzuzeigen und zu beurteilen, ob es sich um optimiertes SQL handelt. Im Allgemeinen beanspruchen 20 % des Codes 80 % der Ressourcen, und unser Optimierungsschwerpunkt liegt auf diesen langsamen Bereichen. 24. Wenn Sie feststellen, dass die Abfrage bei Verwendung von IN oder OR den Index nicht verwendet, geben Sie den Index mithilfe einer expliziten Deklaration an: SELECT * FROM PersonMember (INDEX = IX_Title) WHERE processid IN ('männlich', 'weiblich') 25. Berechnen Sie die abzufragenden Ergebnisse vorab, tragen Sie sie in die Tabelle ein und wählen Sie sie dann bei der Abfrage aus. Dies war das wichtigste Mittel vor SQL7.0. Beispielsweise bei der Berechnung von Krankenhausgebühren. 26. MIN() und MAX() können entsprechende Indizes verwenden. 27. In der Datenbank gilt das Prinzip: Je näher der Code an den Daten ist, desto besser. Daher wird Standard bevorzugt, gefolgt von Regeln, Triggern, Einschränkungen (Einschränkungen wie Fremdschlüssel, Primärschlüssel, CheckUNIQUE usw., die maximale Länge des Datentyps usw. sind alles Einschränkungen) und Prozeduren. Dies reduziert nicht nur den Wartungsaufwand, sondern verbessert auch die Qualität des Programmschreibens und führt es schnell aus. 28. Wenn Sie einen großen Binärwert in eine Bildspalte einfügen möchten, verwenden Sie eine gespeicherte Prozedur und niemals das integrierte INsert zum Einfügen (ich weiß nicht, ob JAVA das macht). Denn die Anwendung wandelt den Binärwert zunächst in einen String (doppelt so groß) um und der Server wandelt ihn nach dem Empfang des Zeichens wieder in einen Binärwert um. Die gespeicherte Prozedur hat diese Aktionen nicht: Methode: Erstellen Sie die Prozedur p_insert als Einfügen in Tabelle(Fimage)-Werte (@image). Durch Aufrufen dieser gespeicherten Prozedur im Vordergrund und Übergeben binärer Parameter wird die Verarbeitungsgeschwindigkeit erheblich verbessert. 29.Between ist in manchen Fällen schneller als IN. Between kann den Bereich basierend auf dem Index schneller finden. Der Unterschied lässt sich mithilfe des Abfrageoptimierers erkennen.
select * from chineseresume where title in ('männlich', 'weiblich')
Wählen Sie * aus Chineseresume, wobei der Titel zwischen „男“ und „女“ steht. Es ist das Gleiche. Da es viele Male aufgerufen wird, kann es manchmal langsam sein. 30. Erstellen Sie bei Bedarf Indizes für globale oder lokale temporäre Tabellen. Dies kann manchmal die Geschwindigkeit erhöhen, dies muss jedoch nicht unbedingt der Fall sein, da Indizes auch viele Ressourcen verbrauchen. Seine Erstellung erfolgt auf die gleiche Weise wie die der tatsächlichen Tabelle. 31. Erstellen Sie keine nutzlosen Dinge, wie zum Beispiel das Generieren von Berichten, wodurch Ressourcen verschwendet werden. Benutzen Sie es nur, wenn es unbedingt nötig ist. 32. Die OR-Klausel kann in mehrere Abfragen zerlegt werden, und mehrere Abfragen können über UNION verbunden werden. Ihre Geschwindigkeit hängt nur davon ab, ob der Index verwendet wird. Wenn die Abfrage einen gemeinsamen Index verwenden muss, ist es effizienter, UNION all zu verwenden. Mehrere OR-Klauseln verwenden keine Indizes, daher werden sie in Form von UNION neu geschrieben und versuchen dann, den Index abzugleichen. Eine zentrale Frage ist, ob Indizes verwendet werden sollen. 33. Verwenden Sie Ansichten so wenig wie möglich, da sie ineffizient sind. Operationen an Ansichten sind langsamer als direkte Operationen an Tabellen, deshalb können stattdessen gespeicherte Prozeduren verwendet werden. Verschachteln Sie Ansichten insbesondere nicht, da verschachtelte Ansichten das Auffinden der Originaldaten erschweren. Schauen wir uns das Wesentliche einer Ansicht an: Es handelt sich um eine optimierte SQL-Anweisung mit einem Abfrageplan, der generiert und auf dem Server gespeichert wird. Verwenden Sie beim Abrufen von Daten aus einer einzelnen Tabelle keine Ansichten, die auf mehrere Tabellen verweisen. Rufen Sie direkt aus der Tabelle ab oder lesen Sie aus einer Ansicht, die nur diese Tabelle enthält. Andernfalls entsteht unnötiger Overhead und die Abfrage wird gestört. Um die Abfrage von Ansichten zu beschleunigen, hat MsSQL die Ansichtsindexfunktion hinzugefügt. 34. Verwenden Sie DISTINCT und ORDER BY nicht, wenn es nicht nötig ist. Diese Aktionen können stattdessen auf der Clientseite ausgeführt werden. Sie verursachen zusätzlichen Aufwand. Dies ist dasselbe Prinzip wie UNION und UNION ALL.
Wählen Sie die Top 20 aus: ad.companyname,comid,position,ad.referenceid,worklocation,
konvertieren(varchar(10),ad.postDate,120) als postDate1,Arbeitsjahr,Abschlussbeschreibung FROM
jobcn_query.dbo.COMPANYAD_query Anzeige mit Referenz-ID in ('JCNAD00329667', 'JCNAD132168', 'JCNAD00337748', 'JCNAD00338345',
'JCNAD00333138','JCNAD00303570','JCNAD00303569',
'JCNAD00303568','JCNAD00306698','JCNAD00231935','JCNAD00231933',
'JCNAD00254567','JCNAD00254585','JCNAD00254608',
'JCNAD00254607','JCNAD00258524','JCNAD00332133','JCNAD00268618',
'JCNAD00279196','JCNAD00268613') Sortiert nach Postdatum absteigend 35. Setzen Sie in der Werteliste nach IN den am häufigsten vorkommenden Wert an den Anfang und den am seltensten vorkommenden Wert ans Ende, um die Anzahl der Urteile zu verringern. 36. Wenn Sie SELECT INTO verwenden, werden die Systemtabellen (Sysobjects, Sysindexes usw.) gesperrt und der Zugriff durch andere Verbindungen blockiert. Verwenden Sie explizite Anweisungen zum Erstellen temporärer Tabellen anstelle von
Wählen Sie INTO. Drop-Tabelle t_lxh beginnen Tran wählen Sie * in t_lxh von Chineseresume
wobei Name = "XYZ" --commit In einer anderen Verbindung, SELECT * von Sysobjects, können Sie sehen, dass SELECT INTO die Systemtabelle sperrt und Create Table auch die Systemtabelle sperrt (unabhängig davon, ob es sich um eine temporäre Tabelle oder eine Systemtabelle handelt). Verwenden Sie es daher niemals in Gegenständen! ! ! Wenn es sich in diesem Fall um eine häufig verwendete temporäre Tabelle handelt, verwenden Sie bitte eine echte Tabelle oder eine temporäre Tabellenvariable. 37. Im Allgemeinen können redundante Zeilen vor den GROUP BY- und HAVING-Klauseln eliminiert werden. Versuchen Sie daher, diese nicht zum Eliminieren von Zeilen zu verwenden. Die optimale Ausführungsreihenfolge ist wie folgt: Die Where-Klausel von Select wählt alle geeigneten Zeilen aus, Group By wird zum Gruppieren und Zählen der Zeilen verwendet und die Having-Klausel wird zum Eliminieren redundanter Gruppen verwendet. Auf diese Weise ist der Mehraufwand von Group By und Having gering und die Abfrage ist schnell. Grouping und Having großer Datenzeilen verbraucht viele Ressourcen. Wenn der Zweck von Group BY keine Berechnungen, sondern nur das Gruppieren umfasst, ist Distinct schneller. 38. Das gleichzeitige Aktualisieren mehrerer Datensätze ist schneller als das Aktualisieren jeweils eines Datensatzes, d. h. die Stapelverarbeitung ist besser. 39. Verwenden Sie temporäre Tabellen seltener. Versuchen Sie stattdessen, Ergebnismengen und Tabellenvariablen zu verwenden. Tabellenvariablen sind besser als temporäre Tabellen. 40. In SQL2000 können berechnete Felder indiziert werden. Die dafür zu erfüllenden Bedingungen sind folgende: a. Der Ausdruck des berechneten Feldes ist sicher b. Kann nicht in den Datentypen TEXT, Ntext und Image verwendet werden c. Die folgenden Optionen müssen konfiguriert werden: ANSI_NULLS = ON, ANSI_PADDINGS = ON, ... 41. Versuchen Sie, die Datenverarbeitung auf dem Server zu platzieren, um den Netzwerk-Overhead zu reduzieren, beispielsweise durch die Verwendung gespeicherter Prozeduren. Eine gespeicherte Prozedur ist eine kompilierte, optimierte SQL-Anweisung, die in einem Ausführungsplan organisiert und in der Datenbank gespeichert wird. Es ist eine Sammlung von Kontrollflusssprachen und natürlich schnell. Dynamisches SQL, das wiederholt ausgeführt wird, kann eine temporär gespeicherte Prozedur verwenden, die (temporäre Tabelle) in Tempdb platziert wird. Da SQL Server in der Vergangenheit komplexe mathematische Berechnungen nicht unterstützte, musste diese Arbeit auf andere Ebenen verlagert werden, was den Netzwerk-Overhead erhöhte. SQL2000 unterstützt UDFs und jetzt auch komplexe mathematische Berechnungen. Der Rückgabewert der Funktion sollte nicht zu groß sein, da dies zu großem Mehraufwand führt. Benutzerdefinierte Funktionen verbrauchen viele Ressourcen, wenn sie wie Cursor ausgeführt werden. Wenn Sie große Ergebnisse zurückgeben möchten, verwenden Sie gespeicherte Prozeduren. 42. Verwenden Sie nicht dieselbe Funktion wiederholt in einem Satz. Das verschwendet Ressourcen. Es ist schneller, das Ergebnis in eine Variable zu setzen und diese aufzurufen. 43. Die Effizienz von SELECT COUNT(*) ist gering. Versuchen Sie daher, die Schreibmethode zu ändern. EXISTS ist schnell. Beachten Sie außerdem den Unterschied: Die Rückgabewerte von select count(Field of null) from Table und select count(Field of NOT null) from Table sind unterschiedlich! ! ! 44. Wenn der Server über genügend Speicher verfügt, stellen Sie die Anzahl der Threads so ein, dass sie der maximalen Anzahl von Verbindungen + 5 entspricht, um die maximale Effizienz zu erreichen. Andernfalls verwenden Sie die Anzahl der Threads < der maximalen Anzahl von Verbindungen, um den Threadpool von SQL SERVER zu aktivieren und das Problem zu lösen. Wenn die Anzahl immer noch der maximalen Anzahl von Verbindungen + 5 entspricht, wird die Leistung des Servers ernsthaft beeinträchtigt. 45. Greifen Sie in einer bestimmten Reihenfolge auf Ihre Tabellen zu. Wenn Sie zuerst Tabelle A und dann Tabelle B sperren, müssen Sie sie in allen gespeicherten Prozeduren in dieser Reihenfolge sperren. Wenn Sie in einer gespeicherten Prozedur (versehentlich) zuerst Tabelle B und dann Tabelle A sperren, kann dies zu einem Deadlock führen. Deadlocks können schwer zu erkennen sein, wenn die Sperrsequenz nicht im Voraus sorgfältig entworfen wurde. 46. Überwachen Sie die Auslastung der entsprechenden Hardware über den SQL Server-Leistungsmonitor. Wenn der Wert des Indikators „Speicher: Seitenfehler/Sek.“ gelegentlich hoch wird, deutet dies darauf hin, dass zu diesem Zeitpunkt Threads um Speicher konkurrieren. Wenn der Wert dauerhaft hoch ist, kann der Speicher der Engpass sein. Verfahren: 1. „% DPC-Zeit“ bezieht sich auf den Prozentsatz des Prozessors, der zum Empfangen und Verarbeiten von DPCs (Deferred Procedure Calls) während des Stichprobenintervalls verwendet wird. (Das DPC wird mit einem Intervall mit niedrigerer Priorität als dem Standardintervall ausgeführt.) Da DPCs im privilegierten Modus ausgeführt werden, ist der DPC-Prozentsatz ein Bruchteil des privilegierten Prozentsatzes. Diese Zeiten werden gesondert berechnet und gehen nicht in die Intervallberechnungssumme ein. Diese Summe zeigt die durchschnittliche Auslastungszeit als Prozentsatz der Instanzzeit. 2. %Prozessorzeitzähler: Wenn der Parameterwert weiterhin 95 % überschreitet, deutet dies darauf hin, dass der Engpass die CPU ist. Erwägen Sie das Hinzufügen eines neuen Prozessors oder den Wechsel zu einem schnelleren. 3. „% privilegierte Zeit“ bezieht sich auf den Prozentsatz der nicht im Leerlauf befindlichen Prozessorzeit, die im privilegierten Modus verwendet wird. (Der privilegierte Modus ist ein Verarbeitungsmodus, der für Betriebssystemkomponenten und die Manipulation von Hardwaretreibern entwickelt wurde. Er ermöglicht den direkten Zugriff auf die Hardware und den gesamten Speicher. Ein weiterer Modus ist der Benutzermodus, ein eingeschränkter Verarbeitungsmodus, der für Anwendungen, Umgebungssubsysteme und Integer-Subsysteme entwickelt wurde. Das Betriebssystem konvertiert Anwendungsthreads in den privilegierten Modus, um auf Betriebssystemdienste zuzugreifen.) Der Prozentsatz der privilegierten Zeit umfasst die Zeit für die Bearbeitung von Interrupts und DPCs. Ein hohes privilegiertes Zeitverhältnis kann durch eine große Anzahl von Intervallen verursacht werden, die durch ausgefallene Geräte generiert werden. Dieser Zähler zeigt die durchschnittliche Auslastungszeit als Bruchteil der Beispielzeit an. 4. % Benutzerzeit gibt CPU-intensive Datenbankvorgänge an, wie etwa Sortieren, Ausführen von Aggregatfunktionen usw. Wenn dieser Wert sehr hoch ist, sollten Sie das Hinzufügen von Indizes, die Verwendung einfacher Tabellenverknüpfungen, das horizontale Aufteilen großer Tabellen und andere Methoden zur Reduzierung dieses Werts in Erwägung ziehen. Physische Festplatte: Zähler für aktuelle Festplattenwarteschlangenlänge. Dieser Wert sollte das 1,5- bis 2-fache der Festplattenanzahl nicht überschreiten. Fügen Sie zur Leistungssteigerung weitere Festplatten hinzu. SQLServer:Cache-Trefferquote-Zähler. Je höher der Wert, desto besser. Liegt der Wert dauerhaft unter 80 %, sollten Sie eine Speichererweiterung in Betracht ziehen. Beachten Sie, dass der Parameterwert nach dem Start von SQL Server akkumuliert wird, sodass der Wert nach einer gewissen Zeit nicht mehr den aktuellen Wert des Systems widerspiegelt. 47. Analyse von „select emp_name form employee where salary > 3000“: Wenn „salary“ in dieser Anweisung vom Typ Float ist, optimiert der Optimierer es in „Convert(float,3000)“. Da 3000 eine Ganzzahl ist, sollten wir beim Programmieren 3000,0 verwenden, anstatt die Konvertierung zur Laufzeit vom DBMS durchführen zu lassen. Die gleiche Konvertierung wird für Zeichen- und Ganzzahldaten durchgeführt. 48. Die Reihenfolge der Abfragezuordnung und des Schreibens Wählen Sie a.personMemberID, * aus chineseresume a,personmember b, wobei personMemberID = b.Referenz-ID und a.PersonMemberID = ‚JCNPRH39681‘ (A = B, B = ‚Nummer‘) Wählen Sie a.personMemberID, * aus chineseresume a,personmember b, wobei a.personMemberID = b.referenceid und a.personMemberID = ,JCNPRH39681‘ und b.referenceid = ,JCNPRH39681‘ (A = B, B = ,Nummer‘, A = ,Nummer‘) Wählen Sie a.personMemberID, * aus chineseresume a,personmember b, wobei b.referenceid = 'JCNPRH39681' und a.personMemberID = 'JCNPRH39681' (B = 'Nummer', A = 'Nummer') 49. (1) WENN kein Verantwortlicher Code eingegeben wurde, DANN Code1=0 Code2=9999 SONST Code1=Code2=Verantwortlicher Code END IF Die auszuführende SQL-Anweisung lautet: SELECT Name des Verantwortlichen FROM P2000 WHERE Code des Verantwortlichen>=:Code1 AND Code des Verantwortlichen<=:Code2 (2) WENN der Code der verantwortlichen Person nicht eingegeben ist, DANN SELECT Name der verantwortlichen Person FROM P2000 ELSE Code= Code der verantwortlichen Person SELECT Code der verantwortlichen Person FROM P2000 WHERE Code der verantwortlichen Person=:Code END IF Die erste Methode benutzt nur eine SQL-Anweisung, und die zweite Methode benutzt zwei SQL-Anweisungen. Wenn der Code der verantwortlichen Person nicht eingegeben wird, ist die zweite Methode offensichtlich effizienter als die erste Methode, da sie keine Einschränkungen aufweist; wenn der Code der verantwortlichen Person eingegeben wird, ist die zweite Methode immer noch effizienter als die erste Methode, nicht nur, weil es eine Einschränkung weniger gibt, sondern auch, weil die Gleichheitsoperation die schnellste Abfrageoperation ist. Wir sollten beim Schreiben von Programmen keine Angst vor Problemen haben 50. Verwenden Sie in Bezug auf die neue Abfrage-Paging-Methode von JOBCN (wie folgt) den Leistungsoptimierer, um den Leistungsengpass zu analysieren. Wenn es an der E/A oder der Netzwerkgeschwindigkeit liegt, ist die folgende Optimierungsmethode wirksam. Wenn es an der CPU oder dem Speicher liegt, ist die aktuelle Methode besser. Bitte unterscheiden Sie die folgenden Methoden und erklären Sie, dass je kleiner der Index ist, desto besser.
beginnen
DECLARE @local_variable table (FID int Identität (1,1), Referenz-ID varchar (20))
einfügen in @local_variable (Referenz-ID)
Wählen Sie die 100.000 wichtigsten Referenz-IDs aus dem chinesischen Lebenslauf aus, sortiert nach Referenz-ID.
Wählen Sie * aus @local_variable, wobei Fid > 40 und fid <= 60
Ende Und
beginnen
DECLARE @local_variable table (FID int Identität (1,1), Referenz-ID varchar (20))
einfügen in @local_variable (Referenz-ID)
Wählen Sie die 100.000 wichtigsten Referenz-IDs aus dem chinesischen Lebenslauf aus, sortiert nach Aktualisierungsdatum.
Wählen Sie * aus @local_variable, wobei Fid > 40 und fid <= 60
Ende Der Unterschied
beginnen
Tabelle erstellen #temp (FID int identity(1,1),ReferenceID varchar(20))
einfügen in #temp (Referenz-ID)
Wählen Sie die 100.000 wichtigsten Referenz-IDs aus dem chinesischen Lebenslauf aus, sortiert nach Aktualisierungsdatum.
wähle * aus #temp, wobei Fid > 40 und fid <= 60, lösche Tabelle #temp
Ende Analyse und Lösung der langsamen MySQL-Abfragegeschwindigkeit 1. Suchen Sie nach SQL-Anweisungen mit langsamer Ausführung, z. B. solche, die nicht innerhalb von 2 Sekunden abgeschlossen werden. Motoren anzeigen; Anzeigen langsamer Abfragezeiten Variablen wie „slow%“ anzeigen; Überprüfen Sie, wie lange es dauert, bis es sich um eine langsame Abfrage handelt Variablen wie „long%“ anzeigen; Ändern Sie die langsame Abfragezeit setze long_query_time=1; Aktivieren Sie die Protokollierung langsamer Abfragen Setzen Sie global slow_query_log='ON'. Sehen Sie, welche Threads ausgeführt werden vollständige Prozessliste anzeigen Maximale Anzahl von Verbindungen anzeigen Variablen wie „%max_connections%“ anzeigen; Aktuelle Anzahl Verbindungen Status wie „Threads_connected%“ anzeigen; 
2. Lösung 1. Beginnen Sie mit Ihrem eigenen SQL, fügen Sie das SQL in Navicat ein und führen Sie es einmal aus, um zu sehen, wie lange es dauert, ob die SQL-Militärvorschriften eingehalten werden und ob *, in usw. erscheinen 2. Reicht die maximale Anzahl an Verbindungen nicht aus, um die aktuelle Anzahl an Verbindungen zu erreichen? Ist eine Erhöhung in Erwägung zu ziehen? 3. Indexoptimierung, Index häufig verwendeter Felder, Indexierung von Datentypen wie txt nicht 4. Teilen Sie die Datenbank in separate Tabellen auf, und einige Datenbanktabellen sind für Abfragen vorgesehen 5. Datenbank-Cache aktivieren 6. Server-Hardware-Upgrade Das könnte Sie auch interessieren:- Mysql-Fehler: Lösung für zu viele Verbindungen
- Methode zum Anzeigen des MySql-Status: Wie kann ich die Anzahl der Verbindungen und den Status in MySql anzeigen?
- Zusammenfassung der Tipps zum Festlegen der maximalen Anzahl von Verbindungen in MySQL
- Lösen Sie das Problem, dass die JDBC-Verbindung zu Mysql nach längerer Inaktivität ungültig wird
|