Um ein Problem zu beheben, habe ich eine einmalige Frage, ob ein bestimmtes varchar(max)
Feld nicht druckbare ASCII-Zeichen (außer Leerzeichen) enthält. Das Folgende ist meine einfache Idee, wie ich feststellen kann, ob solche Zeichen in unserer Produktionsdatenbank gespeichert sind.
SELECT TOP 10 [CaseNoteId]
,[CaseId]
,[CaseNote]
FROM [DB].[XY].[ReferralCaseNotes]
WHERE CaseNote LIKE ('%[' + CHAR(1) + '-' + CHAR(8) + CHAR(11) + CHAR(12) + CHAR(14) + '-' + CHAR(31) + CHAR(127) + ']%')
Mein Zögern, dies tatsächlich auszuführen, rührt von der Verwendung von Platzhaltern im LIKE-Muster her, dass die betreffende Tabelle über eine Million Datensätze enthält, dass in dieser Spalte kein Volltextindex vorhanden ist und dass dies wahrscheinlich eine erschöpfende Suche sein wird, weil Wir glauben nicht, dass solche Charaktere existieren.
Ich bin ein Neuling. Wie kann ich abschätzen, ob das Ausführen dieser Abfrage eine erhebliche Belastung für unser Produktionssystem darstellt? Gibt es auch einen besseren Weg, um an die gleichen Informationen zu gelangen?
Mögliche Verbesserungen:
- Ich mache mir keine Sorgen, dass sich Daten ändern, während meine Abfrage ausgeführt wird. Kann ich diese Abfrage so ändern, dass mehrere Zeilen gleichzeitig auf vorteilhafte Weise angezeigt werden?
- Kann ich diese Abfrage so einstellen, dass sie eine Hintergrundoperation ist, die anderen Abfragen nicht im Wege steht?
- Kann ich es für eine begrenzte Zeit ausführen und bestimmen, wie viel Prozent der Tabelle durchsucht wurden, damit ich die für eine vollständige Suche erforderliche Zeit abschätzen kann?
- Würde
WITH(READPAST)
meine Leistung verbessern?
Warum?
Die fragliche Datenbank umfasst vertrauliche Daten, die Regierung und Sicherheitsleute, die Regeln festlegen. Das Wiederherstellen eines Backups auf einem anderen Server ist sehr sinnvoll, würde den Steuerzahler jedoch mehrere Größenordnungen mehr kosten als sinnvoll.
Wenn die Antwort lautet: "Mach dir keine Sorgen, du machst nur eine AUSWAHL", dann sage ich: "Großartig!"
quelle
Antworten:
READ COMMITTED
oder sogar ausführenREAD UNCOMMITTED
. Es ist ein weit verbreiteter Mythos, dass einREAD COMMITTED
Scan die Tabelle sperrt.MAXDOP 1
Hinweis. Das Steuern der Last von Massenvorgängen ist mit SQL Server sehr schwierig. Abhängig von der Situation ist es möglicherweise zu 100% in Ordnung, wenn Sie dies den ganzen Tag laufen lassen, oder Sie können Zeitüberschreitungen in anderen Teilen der Arbeitslast verursachen. Es ist nicht unangemessen, die Abfrage 10 Sekunden lang auszuführen und abzubrechen. Stellen Sie dann fest, ob die Anwendungsauslastung beeinträchtigt war oder nicht.Die Volltextsuche kann Ihnen nicht helfen, da sie wortweise funktioniert. Sie müssen einen benutzerdefinierten Stemmer anschließen, der weiß, wie Sonderzeichen aufgeteilt werden. Unrealistisch. Ihre Anfrage ist in Ordnung.
quelle
Wenn Sie sich Sorgen über die Leistung Ihrer Abfrage machen, können Sie die integrierten SQL Server- Tools für den Abfrageausführungsplan voll ausnutzen, die Ihnen Aufschluss darüber geben, wie viel Aufwand die Abfrage voraussichtlich erfordert und welche Teile davon die Leistung am stärksten beeinträchtigen so können Sie es später fein einstellen.
Sie können verschiedene Szenarien ausprobieren, in denen Sie der Meinung sind, dass die Abfrage zusammen mit dem hier veröffentlichten Code am besten funktioniert. Anschließend können Sie die Ergebnisse zeitlich festlegen und die Ausführungspläne für die einzelnen Abfragen anzeigen. Auf diese Weise kennen Sie die Vorteile und Kompromisse jeder Abfrage und können die Dinge entsprechend herausfinden.
PS: Da dies eine Produktionsdatenbank wäre, würde ich wirklich empfehlen, diese Daten in eine Testumgebung zu stellen, die der Produktion so ähnlich wie möglich ist, da ein viel weniger leistungsfähiger Server oder weniger Ressourcen für Ihre MSSQL-Instanz zu Unrecht führen können Vorstellung von der erwarteten Leistungszeit und führen zu viel Aufwand bei der Optimierung von etwas, das über die Verringerung der Rendite hinausgeht, wenn es die Produktion erreicht.
quelle