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.

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.

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.

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.


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