By Frank Kalis
Zugegebenermassen ein etwas reisserischer Titel, nicht wahr? Aber in Zeiten, wo man stets mit Superlativen zugeschmissen wird, durchaus angebracht, um überhaupt etwas Aufmerksamkeit zu erregen. :-)
Über die Jahre hinweg haben sich Online-Communities als fester Bestandteil des Wissens-Transfer von erfahrene(re)n Entwicklern an weniger Erfahrene etabliert. Leider hat sich ein Mindestmass an Netiquette in diesem Zusammenhang (immer noch) nicht gleichermassen etabliert. Auch nach ca. 12 Jahren, in denen ich nun mehr oder weniger regelmässig in diversen SQL Server Communities unterwegs bin, vermisse ich oftmals eben diesen gewissen Mindeststandard. Seit Jahren existiert dieser Beitrag bereits in meinem Kopf, hat sich aber erst jetzt seinen Weg herausbahnen können.
Derjenige, der sich mit einem Abfrage-, oder besser gesagt, einem T-SQL orientierten Problem, an eine Community wendet, sollte sich über einige Punkte im Klaren sein:
Emoticons sind für die Teilnehmer an der Internetkommunikation eine wichtige Methode ihre Gefühlslage deutlich zu machen. Die Internetkommunikation läuft im Gegensatz zur direkten Kommunikation (englisch: Face-to-Face Communication) ohne sichtbares Gegenüber, dessen Gesten, Mimik und Stimmausdruck gedeutet werden könnte um neben dem Wortinhalt Aufschluss über die Einstellung zum Gegenüber, Aussagen über die Wahrhaftigkeit und Bedeutung der Aussage sowie den emotionalen Zustand zu erhalten. Auch die soziale Rolle des Sprechers (Geschlecht, ungefähres Alter, Hautfarbe, Kleidung, Frisur etc.) geben Anhaltspunkte über die Bedeutung des Sprachinhalts. So ist zum Beispiel eine ironische Aussage in der Schriftform oft allein am Wortinhalt nicht zu verstehen. Um den Bedeutungskontext der Aussagen zu verdeutlichen, helfen Emoticons. Anders als bei anderen Formen der textbasierten Kommunikation, wie dem Brief, treffen sich im Internet oft Unbekannte. Dies macht es noch schwieriger, den Bedeutungskontext zu entschlüsseln. Die Emoticons sollen hierbei helfen, die Zahl der Missverständnisse zu reduzieren.
Nun nachdem ich mich darüber ausgelassen habe, was ich NICHT in einer Community Frage sehen möchte, wird es Zeit, zu beschreiben, wie eine gute Problembeschreibung mit relativ geringem Aufwand erreicht werden kann. Das Ganze lässt sich auf 5 Kernpunkte reduzieren:
Eine der wichtigsten Information, die auf keinen Fall in einer Frage fehlen darf, ist die, mit welcher Version von SQL Server die Fragenstellende arbeitet. Diese Angabe hat eine unmittelbare Auswirkung auf die potentielle Lösung des Problems. Was nutzt die "beste" Lösung, wenn sich im Nachhinein herausstellt, dass die so nicht verwendbar ist, weil sie von der SQL Server Version des Fragenden nicht (mehr) unterstützt wird? Üblicherweise ist die Gegenfrage nach der SQL Server Version eine der ersten, die gestellt wird, falls diese Angabe fehlt. Liefert man diese jedoch gleich in seiner Frage mit, spart man allen Beteiligten Zeit und kommt so wahrscheinlich schneller zu einer guten Lösung.
Wie jedoch ermittelt man die Version von SQL Server, mit der man arbeitet? Dieser Beitrag zeigt diverse Möglichkeiten dazu auf.
DDL ist die Abkürzung für Data Definition Language und wird üblicherweise auch als Tabellenstruktur bezeichnet. Eines der zahlreichen coolen Features im SQL Server Management Studio, ist die Fähigkeit, sich ein fertiges Skript einer Tabelle erstellen zu lassen. Dazu geht man in den Object Explorer:
Anschliessend wählt man die gewünschte Tabelle aus dem entsprechenden Unterpunkt aus:
Öffnet mit der rechten Maustaste das Kontextmenü und klickt sich gemäss der nachfolgenden Abbildung durch:
Als Ergebnis präsentiert sich ein schickes Skript
Es sollte sich übrigens von selbst verstehen, dass man diesen Vorgang für ALLE an dem Problem beteiligten Tabellen wiederholt.
In diesem Zusammenhang erwähnenswert sind noch die diversen Optionen, die der Anwender hat, um die Skripterstellung ganz den eigenen Wünschen anpassen zu können. Leider hat Microsoft die an einem Ort versteckt, wo man sie nicht unbedingt als erstes vermuten würde:
Dies bringt den nachfolgenden Dialog zum Vorschein. Unter SQL Server Object Explorer -> Scripting findet man dann eine ganze Reihe an nützlichen Einstellungen, die man ganz nach Belieben adjustieren kann.
Etwas schwieriger ist die Bereitstellung von Beispieldaten. Bereits vor Jahren hat sich ein geschätzter Kollege diesem Problem angenommen. Unter http://vyaskn.tripod.com/code/generate_inserts.txt findet man nach wie vor den Source Code einer Prozedur, die man zum Generieren von INSERT Statements verwenden kann.
Quasi als De-Luxe Version davon kann man auch SSMS Tools Pack verwenden. Dies gibt einem die Möglichkeit aus dem Kontextmenü heraus, INSERT Statements zu generieren
Als Ergebnis erhält man ein neues Query Window, in dem die INSERT Statements angezeigt werden.
Leider hat der Entwickler des SSMS Tools Pack Bundles den Lizensierungs-Modus beginnend mit SSMS 2012 geändert. Die Tools sind nun nicht länger kostenlos einsetzbar. Die Kosten halten sich aber in einem überschaubaren Rahmen und stellen keinen ernsthaften Show-Stopper dar.
Alternativ kann auch die Skripterstellung im Management-Studio verwendet werden. Man findet diese im Kontextmenü der Datenbank unter dem Namen "Tasks->Skripts generieren".
Unter den Skripterstellungsoptionen (Button Erweitert) kann man wählen, ob man zu einer Tabelle nur die "Daten", nur das "Schema", oder "Schema und Daten" skripten möchte.
An dieser Stelle vielleicht noch ein Wort der Warnung: Man sollte niemals unbedacht, die INSERT Statements generieren und das Ergebnis verwenden! Zum einen sollte man überprüfen, ob es sich eventuell um sensitive Daten handelt, die man lieber nicht in einem öffentlichen Forum preisgibt. Zum anderen braucht es keinen Tausende von Datensätzen, um ein Problem reproduzierbar zu machen. In aller Regel reicht hier eine Handvoll an Datensätzen vollkommen aus.
Bleibt noch die "Erwartete Ergebnismenge". Also, das, was von SQL Server zurückgegeben werden soll, wenn die Beispieldaten verarbeitet worden sind. Eine tabellarische Darstellung des gewünschten Ergebnisses ist hier völlig ausreichend, meiner Meinung nach.
Bereits mit recht geringen Mitteln, kann man eine Menge an nützlichen Informationen sammeln lassen und damit die Community bei der Beantwortung von Fragen zur Performance unterstützen.
-- I/O Informationeen
SET STATISTICS IO ON;
-- CPU-Informationen
SET STATISTICS TIME ON;
-- Ausführungsplan
SET STATISTICS PROFILE ON;
-- Abfrage
SELECT ...
Sind alle diese "Voraussetzungen" erfüllt, stehen üblicherweise die Chancen nicht schlecht, dass sich jemand für das Problem interessiert und eine Lösung vorschlägt. Ist dies der Fall, sollte man als Hilfesuchender jetzt auf keinen Fall den gesunden Menschenverstand über Bord werfen. Also, auf jeden Fall erst einmal die vorgeschlagene Lösung auf einem Test-System analysieren und "ausprobieren". Was in einer Testumgebung mit den gelieferten Beispieldaten eine gute Performance zeigt, kann sich in der Zielumgebung mit den Produktionsdaten schnell zu einer Performance-Killer entwickeln und die Sache eventuell noch verschlimmern. Also, auch wenn die Zeit drängt, weil der Chef und/oder der Kunde einem im Nacken sitzt: NIE Source-Code aus einer Online Community ungetestet verwenden. Egal, von welcher Quelle dieser Code stammt!
Zu guter Letzt noch etwas, was ich persönlich immer bedauerlich finde. Ich bin mir bewusst, dass es unzählige Arten und Weisen gibt, wie Source Code formatiert wird und jeder Entwickler hat da seine ganz eigenen Vorstellungen von. Alle diese Vorstellungen sind richtig und berechtigt und gleichwertig. Allerding macht es demjenigen, der helfen möchte, die Sache nicht wirklich einfacher, wenn man erst einmal Zeit damit verbringen muss, den Code in ein übersichtliches Format zu bringen, um anschliessend zu versuchen, das Problem des Fragestellers zu begreifen und zu lösen. Diesem Problem kann man mit Hilfe eines der zahlreichen freien Online Formatierern für SQL Code erfolgreich begegnen. Stellvertretend für diese kleinen Tools sei hier http://www.sql-format.com/ erwähnt.
5 Stern: | (1) | |
---|---|---|
4 Stern: | (0) | |
3 Stern: | (0) | |
2 Stern: | (0) | |
1 Stern: | (0) | |