SQL editor

An editor that speaks IRIS SQL

IRIS-aware code completion, syntax highlighting built for IRIS SQL, formatting, parameterised queries, execution plans and eight export formats.

  • GO-Batches, Ausführung mit F5 / F7 / F9
  • Zwei Editoren nebeneinander oder im eigenen Fenster
  • IRIS-Ausführungsstatistiken je Statement
  • Code-Vervollständigung aus dem Datenmodell
  • Streaming-Export in acht Formaten

Eine echte SQL-Sitzung besteht selten aus einem Statement. Sie besteht aus einer Notizdatei mit dreißig Statements, von denen Sie vier jetzt gerade ausführen wollen, eines zwei Millionen Zeilen liefert, die Sie nicht holen wollten, und eines eine Prozedur aufruft, die drei Ergebnismengen zurückgibt. Ein Editor, der nur den ganzen Puffer oder nur die Auswahl ausführen kann, macht diese Sitzung langsamer als nötig. Der Editor von SQL DATA LENS ist um die Art herum gebaut, wie diese Datei tatsächlich benutzt wird.

Zwei Editoren zugleich — oder einer auf dem zweiten Monitor

Seit 4.02 läuft der Docking-Bereich auf einem modernen Docking-Framework, und zwei Dinge sind möglich, die es vorher nicht waren. Ziehen Sie einen Editor-Reiter an den linken, rechten, oberen oder unteren Rand des Editorbereichs, und zwei Editoren stehen nebeneinander — um zwei Fassungen einer Abfrage zu vergleichen oder eine Tabellenansicht neben dem Statement zu behalten, das sie erzeugt hat. Ziehen Sie einen Reiter aus dem Hauptfenster heraus, wird er zu einem eigenen Fenster; genau dafür war der zweite Monitor da. Titelleisten, Reiter und die Schaltflächen der Werkzeugfenster zeichnet jetzt das Look-and-Feel, Light und Dark sehen also einheitlich aus.

Eine Folge dieser Umstellung: Ein mit 4.00 gespeichertes Fensterlayout lässt sich nicht übernehmen. SQL DATA LENS startet einmal mit dem Standardlayout und behält die alte Datei als workspace.dat.pre-4.01; ordnen Sie die Fenster einmal an, danach wird wieder wie gewohnt gespeichert. Werkzeugfenster zurücksetzen, im Menü Fenster und auf der Seite Allgemein der Einstellungen, stellt alles wieder her, wenn ein Ziehen schiefgeht.

Mehrere Statements in einer Datei: GO

GO wird nicht an die Datenbank gesendet. Es ist ein Batch-Trenner, den der Editor erkennt: Der aktuelle Batch ist jedes Statement seit dem letzten GO, oder seit dem Anfang des Skripts, wenn es das erste ist. Diese eine Konvention macht ein langes Arbeitsskript navigierbar, und es ist dieselbe Konvention, die eine SQL-Server-Entwicklerin ohnehin in den Fingern hat.

Drei Ausführungsarten decken alles Weitere ab:

  • F5 — das Statement an der Cursorposition ausführen. Cursor irgendwo in das Statement setzen und laufen lassen; markieren ist nicht nötig.
  • F7 — das nächste Statement ausführen und weitergehen.
  • F9 — das ganze Skript ausführen, jeden Batch der Reihe nach.

Eine Auswahl wird ebenfalls berücksichtigt, zwei markierte Statements laufen zu lassen funktioniert also weiterhin. Ausgeführt werden kann jedes Statement, das Datenbank und Treiber akzeptieren, DDL und Prozeduraufrufe eingeschlossen, und der Ergebnisbereich zeigt die Meldungen und Fehlercodes der Datenbank selbst statt einer allgemeinen Hülle — den SQLCODE und den IRIS-Meldungstext, wie zurückgegeben.

Das Trennzeichen bleibt GO und wird nicht ;, aus einem Grund, der genannt gehört: Auf IRIS und Caché ist das Semikolon das Kommentarzeichen von ObjectScript, ein Trennen daran würde Prozedur- und Trigger-Rümpfe auseinanderreißen. Ein Skript, das nach mehreren semikolongetrennten Statements aussieht, bekommt einen kleinen, ausblendbaren Hinweis statt einer stillen Überraschung.

Stop hält an. Stop während eines Skriptlaufs bricht das laufende Statement ab und lässt den Rest unausgeführt — bis 4.02 liefen die folgenden Statements weiter, ein Skript konnte also im Anschluss Daten schreiben, deren Änderung Sie gerade gestoppt hatten. Das Meldungsfenster sagt, wo der Lauf stehen geblieben ist, welche Statements übersprungen wurden und ob eine Transaktion noch offen ist; bei ausgeschaltetem Auto-Commit entscheiden Sie also über die bisherigen Änderungen. Und die für ein Statement gemeldete Zeilenzahl ist jetzt seine eigene: Ein INSERT nach einer Zehn-Zeilen-Abfrage wird nicht mehr als „11 row(s) affected" gemeldet.

SQL-Editor mit einem Skript aus fünf SELECT-Statements, durch GO getrennt, daneben der geöffnete Script-Manager-Baum und darunter ein zweites Skript in der Vorschau
GO trennt Batches; F5 führt aus, worin der Cursor gerade steht.

Code-Vervollständigung, die Ihr Datenmodell liest

Der Sinn einer Vervollständigung ist, Sie davon abzuhalten, den Editor zu verlassen, um etwas nachzuschlagen. Die Liste erscheint nach einem Trennzeichen wie Punkt oder Komma oder immer dann, wenn Sie Strg+Leertaste drücken, und bietet Tabellen, Views, Funktionen, Prozeduren und — sobald eine Tabelle im Kontext ist — deren Spalten mit ihren Datentypen.

Was sie zeigt, kommt aus dem Datenmodell und nicht aus einer statischen Schlüsselwortliste. Wenn Sie Dokumentation in der Remarks-Eigenschaft einer Klasse oder einer Property pflegen, erscheint sie im Vervollständigungsfenster, und Hyperlinks in diesem Text bleiben anklickbar — ein Tabellenkommentar, der auf ein Ticket oder eine Wiki-Seite zeigt, ist also einen Klick entfernt, während Sie die Abfrage schreiben. Die Vervollständigung deckt auch IRIS-spezifische Konstrukte ab, die man leicht vertippt, darunter SET OPTION und die Optimizer-Hints, jeweils mit ihrem Hilfetext — und jeweils nur dort, wo IRIS sie tatsächlich erlaubt: SET OPTION-Namen direkt nach SET OPTION , Optimizer-Hints nur in der FROM-Klausel oder nach JOIN, statt überall. Nicht-InterSystems-Verbindungen bekommen einen generischen Anbieter, damit sich das Verhalten nicht ändert, wenn Sie für eine Stunde auf SQL Server wechseln.

Die Vervollständigung sagt außerdem, was sie weiß — der Unterschied zwischen einem Werkzeug, dem man vertraut, und einem, das man hinterfragt. Hat sie nichts anzubieten, steht in der ersten Zeile der Liste metadata: ready, metadata: loading oder metadata: unavailable samt Grund — ein Name, den sie nicht auflösen kann, wird nie als „no columns found" gemeldet, und die Liste ist nie stumm leer. Derselbe Zustand steht in der Statusleiste des Editors neben Auto:ON/OFF, Sie sehen also ohne Öffnen der Liste, ob das Modell aktuell ist. Jeder Eintrag trägt eine Beschreibung: eine Spalte ihren Typ und die Tabelle, aus der sie stammt, eine Tabelle ihr Schema.

JOIN-Vorschläge verdienen eine eigene Erwähnung. Direkt nach JOIN stehen die Tabellen zuerst, die über einen deklarierten Fremdschlüssel verbunden sind; steht der Cursor im ON-Teil, ist eine fertige Bedingung aus diesem Fremdschlüssel der erste Eintrag, oder Strg+Alt+J fügt sie direkt ein. Ohne deklarierten Fremdschlüssel wird eine aus Spaltennamen erratene Bedingung angeboten — immer als Vermutung gekennzeichnet.

Geöffnete Code-Vervollständigung in einer SELECT-Liste im SQL-Editor, die die Spalten der Tabelle im Kontext auflistet, jeder Eintrag mit Symbol, deklariertem Datentyp und Nullable-Angabe, daneben der Detailbereich
Die Vervollständigung liest das Datenmodell: jede Spalte mit deklariertem Typ und Nullable-Angabe.

Highlighting, Faltung und Formatierung für IRIS-SQL

Das Syntax-Highlighting wird gegen den IRIS-Schlüsselwortsatz gepflegt, nicht gegen einen generischen ANSI-Satz — Window-Funktionen, LOAD DATA und die neueren IRIS-Schlüsselwörter werden als Schlüsselwörter hervorgehoben und nicht als Bezeichner. Dazu kommen Klammernpaarung, Code-Faltung für lange Statements und Blöcke, Gehe-zu-Zeile und ein eingebauter SQL-Formatierer, der ein als 400 Zeichen lange Zeile eingefügtes Statement in etwas Prüfbares verwandelt.

Parametrisierte Skripte werden unterstützt, ein wöchentlich gegen andere Konten laufendes Skript muss also nicht jedes Mal bearbeitet werden:

SELECT ID, Name, LastModified
FROM   Sample.Person
WHERE  Company = ?
AND    LastModified >= ?
ORDER  BY LastModified DESC

Der Editor fragt die Parameterwerte bei der Ausführung ab und behält sie für den nächsten Lauf — schneller und sicherer, als Literale in die WHERE-Klausel zu kopieren.

Ein AI Assistant, der Ihr Schema liest, nicht Ihre Zeilen

Neu in 4.02 fügt ein Menü AI zwischen Tools und Window drei Aktionen für den aktiven Editor hinzu: Generate SQL from description…, Explain statement und Explain execution plan. Auf IRIS und Caché tragen die Erklärungen echte Tiefe — Maps, Master-Map-Scans, Bitmap- gegen Standard-Indizes, ob die TuneTable-Statistiken noch aktuell aussehen — oben auf das, was ein allgemeines Modell über SQL ohnehin schon weiß.

Er läuft mit dem eigenen API-Schlüssel — Anthropic, OpenAI, Azure OpenAI oder ein selbst gehosteter OpenAI-kompatibler Endpunkt —, eingerichtet unter Tools > Settings… > AI Assistant, und ist für jede Verbindung standardmäßig aus, bis Sie auf deren Reiter AI das Opt-in setzen. Es werden nie Zeilendaten oder Zugangsdaten gesendet, SQL-Literale werden standardmäßig maskiert, und eine Vorschau zeigt immer den genauen Text, bevor er den Rechner verlässt. Alle Details, auch was gesendet wird und was nie, auf der Seite zum AI Assistant.

Ergebnisse: Raster, Text, mehrere zugleich

Ergebnisse erscheinen als Raster oder als reiner Text, umschaltbar über die Symbolleiste — Textausgabe ist das, was Sie wollen, wenn Sie eine Antwort in ein Ticket kopieren. Prozeduren mit mehreren Ergebnismengen werden richtig behandelt, jede Menge auf ihrem eigenen Reiter, und SQL DATA LENS erzeugt das CALL-Skript für eine Prozedur aus ihren Metadaten. Zur Diagnose von Typproblemen erzeugt es außerdem SELECT-Varianten, die jede Ergebnisspalte in %ODBCIN, in %INTERNAL oder in CAST(col AS VARCHAR(255)) einpacken — drei Sichten auf dieselbe Prozedurausgabe, was meist reicht, um die Spalte zu finden, die über ihren Typ lügt.

Zum Raster selbst:

  • Ausgewählte Zellen berechnen — einen Bereich in einer numerischen Spalte markieren und Anzahl, Minimum, Maximum, Mittelwert und Summe bekommen, ohne eine Aggregatabfrage zu schreiben.
  • Formatiert kopieren — einen Ergebnisblock als ausgerichteten Text kopieren, der eine E-Mail übersteht.
  • Sortieren im Raster, und ein Refresh, der läuft, während noch Daten geholt werden.
  • Doppelklick auf eine Zelle öffnet sie im Data Inspector als Text, HTML, XML, JSON, Bild oder Rohbinärdaten.

Was das Statement gekostet hat, neben der Zeilenzahl

Auf IRIS und Caché zeigt die Leiste unter dem Ergebnis mehr als Zeilen und verstrichene Zeit: Global-Referenzen, ausgeführte Kommandos, Disk Reads mit ihrer Latenz und den Namen der generierten Cached-Query-Klasse. Global-Referenzen sind das ehrliche Maß dafür, was ein Statement gekostet hat — zwei Abfragen, die beide 1,2 Sekunden gebraucht haben, sind nicht dieselbe Abfrage, wenn eine davon vierzigmal so viele Globals angefasst hat.

Der Klassenname ist anklickbar: Er öffnet die Abfrage im Cached Query Analyzer, per Rechtsklick gibt es den generierten Klassenquelltext, den Plan, eine MONLBL-Kommandozeile oder das Löschen. Ein Skriptlauf zeigt die Summe und eine Zeile je Statement im Reiter Messages. Die Zahlen werden außerdem zur sortierbaren Spalte Global refs in der SQL History und Teil ihres CSV-Exports. Die Diagramm-Schaltfläche in der Symbolleiste schaltet die Leiste an und aus, und womit neue Editoren starten, ist eine Einstellung. Mehr zum Lesen dieser Zahlen auf der Seite SQL-Performance.

Eine verwandte Zeile beantwortet das andere häufige „warum ist das langsam?": Während ein Ergebnis noch lädt, benennt die Statuszeile die Stream-Spalten, die gelesen werden. Lange Text- und Binärwerte kosten auf IRIS und Caché einen zusätzlichen Server-Roundtrip je Zeile und sind der übliche Grund, warum eine schnelle Abfrage trotzdem Minuten braucht. Für Details darüberfahren, dann die Spalten benennen, die Sie brauchen, statt SELECT * zu schreiben — oder Max Rows senken.

Ausführungspläne und Cached Queries

Der Ausführungsplan steht direkt im Editor zur Verfügung, für IRIS auch als reiner Plan, Sie brauchen also keinen Umweg über das Management Portal, um zu erfahren, warum ein Statement den Index gewählt hat, den es gewählt hat. Weil IRIS Statements als Klassen cacht, können der Plan, den Sie lesen, und die Cached Query, die der Server tatsächlich ausführt, auseinanderdriften; die Liste der Cached Queries und die Werkzeuge zum Aufräumen stehen auf der Seite SQL-Performance.

Reiter Execution Plan unter einem SELECT im SQL-Editor, der den reinen IRIS-Plan für das Statement zeigt — die gelesene Master-Map, worüber geschleift wird und die Zeilenausgabe — darunter das wiederholte Statement
Der Plan zum Statement, das Sie gerade ausgeführt haben, in dem Fenster, aus dem Sie es ausgeführt haben.

Ergebnisse, die für ein Raster zu groß sind

Zwei Befehle behandeln Ergebnisse, die nicht zum zeilenweisen Ansehen gedacht sind.

Execute to file schreibt Zeilen aus der Datenbank direkt in die Exportdatei, ohne sie im Speicher zu puffern — ein Auszug mit 40 Millionen Zeilen läuft also mit flachem, kleinem Speicherbedarf, statt der Anwendung den Heap zu nehmen. Lesefehler brechen den Lauf nicht ab: Ein Wert, der nicht gelesen werden kann, wird gemeldet, und der Export läuft mit dem nächsten weiter — was auf Altdaten zählt, in die eine Handvoll Zeilen an der Objektschicht vorbei geschrieben wurde.

Execute to table schreibt das Ergebnis eines Statements in eine neu angelegte Tabelle auf dem Server. Zum Client wandert dabei überhaupt nichts — auf IRIS über CREATE TABLE <tabelle> AS SELECT … —, was es mit Abstand zum schnellsten Weg macht, eine Arbeitsmenge zu materialisieren, die Sie noch mehrfach abfragen wollen.

Raster-Ergebnisse exportieren nach CSV, HTML, XLS, XLSX, XML, SQL, TEXT und JSON, und Open in Excel schickt das aktuelle Raster mit einem Klick nativ nach Excel. Zwei Grenzen schützen schon den Hinweg: Max Rows begrenzt, wie viele Zeilen vom Server geholt werden, Max Chars, wie viel einer Zeichen- oder Stream-Spalte geholt wird. Beide werden über Neustarts gemerkt; das Feld leeren hebt die Grenze auf. Wo ein Treiber den JDBC-Hinweis setMaxRows ignoriert — DuckDB etwa —, wird die Grenze als TOP oder LIMIT angewandt, sie hält also unabhängig vom Backend.

Sitzungen, History und Verbindungen

Session-Snapshot macht einen Neustart billig: Beim Schließen werden alle Editor-Reiter mit Inhalt und Verbindung gespeichert und beim nächsten Start wieder geöffnet.

Die SQL History ist eine sortier- und filterbare Tabelle statt eines tageweisen Baums: Pin-Markierung, Zeit, Verbindung, Dauer, Zeilenzahl, Status, ein eigenes Kommentarfeld und auf IRIS die Global-Referenzen, die das Statement gekostet hat. Ein Schnellfilter durchsucht SQL und Kommentare, wahlweise als regulärer Ausdruck; getrennte Filter grenzen nach Verbindung, Zeitraum und Status ein. Auch fehlgeschlagene und abgebrochene Statements werden aufgezeichnet, nicht nur erfolgreiche — nehmen Sie den Statusfilter, wenn Ihnen die alte Nur-Erfolg-Sicht lieber ist. Einträge exportieren als .sql oder .csv, angepinnte überleben das Größenlimit, und was dauerhaft aufgehoben gehört, gehört in den Script Manager.

SQL-History-Panel als sortierbare Tabelle: Spalten für Zeit, Verbindung, Dauer, Zeilen, Status und Kommentar, darüber ein Schnellfilter sowie Filter für Verbindung, Zeitraum und Status, rechts das SQL des ausgewählten Eintrags in der Vorschau
Sortierbare Spalten, ein Schnellfilter über SQL und Kommentare — und fehlgeschlagene Statements neben den erfolgreichen.
Kontextmenü auf einer Zeile der SQL History mit den drei Einfüge-Modi, Pin, Kommentar hinzufügen oder bearbeiten, Copy as SQL, Copy error message und Delete
Anpinnen, was Sie am Montag wieder brauchen; kommentieren, was sonst niemand wiedererkennt.

Mehrere Verbindungen können gleichzeitig offen sein, und die Kommunikation mit der Datenbank ist asynchron, eine langsame Abfrage blockiert die Oberfläche also nicht. Eine Schaltfläche in der Symbolleiste schaltet einen Editor auf einen anderen Server oder eine andere Datenbank um, ohne ihn neu zu öffnen, und der Verbindungsname in der Statusleiste ist ein Link zurück zu dieser Verbindung im Server Navigator.

Der Editor-Reiter trägt außerdem Farbe und Kürzel der Umgebung dieser Verbindung — [DEV], [TEST], [PROD] —, der Server, auf den Sie gleich schreiben, ist also in dem sichtbar, was Sie ansehen, und nicht in einem Baum, in den Sie zuletzt vor einer Stunde geschaut haben. Auf einer als schreibgeschützt markierten Verbindung lässt der Editor nur Statements durch, die er als lesend erkennt, und das Raster bleibt unveränderlich. Siehe Umgebungen und Schreibschutz.

Die Fehlerbehandlung ist konfigurierbar, was langweilig klingt, bis Sie auf eine Tabelle treffen, in der eine von zehntausend Zeilen einen Wert hält, den ihre Metadaten für unmöglich erklären. Standardmäßig hält das Lesen einer Ergebnismenge bei der ersten schlechten Zelle an und meldet Zeile und Spalte, zusammen mit einer bestmöglichen Textdarstellung des Werts. Ein Schalter in der Symbolleiste ändert dieses Verhalten global, damit eine Erhebungsabfrage durchlaufen und Ihnen alle betroffenen Zeilen auf einmal zeigen kann.

Im Editor vergeht der größte Teil eines Arbeitstages, die Details darin summieren sich also: eine Vervollständigung, die Ihre Remarks kennt, ein Plan, den Sie ohne Fensterwechsel lesen, und ein Exportweg, dem die Ergebnisgröße egal ist. Laden Sie SQL DATA LENS herunter und lassen Sie Ihre schlimmste Abfrage hindurchlaufen.

Explore your IRIS data from SQL down to globals

Download, unzip, connect. Your first namespace is on screen in about three minutes.

Windows 10, 11 and Windows Server (64-bit) · ~130 MB · version 4.02 · full 30-day Pro trial included