Verwenden von Platzhaltern in einer ähnlichen Anweisung in einer nicht indizierten VARCHAR (MAX) -Spalte mit mehr als 1 Million Datensätzen

7

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:

  1. 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?
  2. Kann ich diese Abfrage so einstellen, dass sie eine Hintergrundoperation ist, die anderen Abfragen nicht im Wege steht?
  3. 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?
  4. 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!"

Däne
quelle
3
Führen Sie es als erstes nicht auf Ihrem Produktionssystem aus! Nehmen Sie die letzten Nächte wieder auf, stellen Sie sie in Ihrer Entwicklungsumgebung wieder her und führen Sie sie dort aus. Wenn Sie diese Dinge nicht haben, verdienen Sie wahrscheinlich die Mühe.
Paqogomez
Es ist unwahrscheinlich, dass die Abfrage Probleme verursacht, da es sich nur um eine select-Anweisung handelt. Wenn Sie wirklich besorgt sind, können Sie eine Sicherung der Datenbank auf einem Testserver wiederherstellen und die Abfrage einfach dagegen ausführen?
Die Verwendung von 'top' beschränkt Sie nicht darauf, nur 10 Zeilen zu durchsuchen. Sie führen immer noch eine ganze Tabellensuche durch. Ich schlage vor, dass Sie diese Art der Suche auf dem Backup-Server durchführen. (Sie haben offensichtlich einen Backup-Server, oder?).
Vasin1987
1
Zu wissen, dass es über 1 Million Zeilen gibt, hilft nicht wirklich. Jeder varchar (max) -Wert kann bis zu 2 GB betragen, sodass die Auswirkungen von trivial bis zum Scannen von 2 Petabyte Daten reichen können.
Martin Smith
1
Es besteht keine Möglichkeit, dass sich so viele Daten im Speicher befinden, sodass alle Lesevorgänge auf die Festplatte übertragen werden. Wenn es nur 1 Million Zeilen mit 2-3 Zeichen sind, ist das ein kurzer Scan. Wenn es 2 Petabyte sind, wie @MartinSmith sagte, wird das ein langer Tag :-). Aus diesem Grund kann eine Antwort nur gegeben werden, wenn Sie die tatsächliche Größe dieser Tabelle kennen (da Sie einen vollständigen Tabellenscan erhalten). Sp_spaceused gibt Ihnen die Antwort.
Marian

Antworten:

4
  1. Wenn die Snapshot-Isolation aktiviert ist, treten keine Blockierungsprobleme auf. Wenn nicht, sollten Sie die Abfrage wahrscheinlich unter READ COMMITTEDoder sogar ausführen READ UNCOMMITTED. Es ist ein weit verbreiteter Mythos, dass ein READ COMMITTEDScan die Tabelle sperrt.
  2. Sie können hierfür Resource Governor verwenden. Oder verwenden Sie einen MAXDOP 1Hinweis. 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.
  3. Ich mache gerne eine Fortschrittsschätzung, indem ich die Tabellengröße (in MB) durch die beobachtete Plattenleserate (in MB / s) dividiere. Dies gibt eine Schätzung für die gesamte Abtastzeit.

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.

usr
quelle
0

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.

Gemeinschaft
quelle