Einführung
In relationalen Datenbankmanagementsystemen wie SQL Server gibt es zwei Hauptmethoden, um Metadaten über die Datenbank abzurufen: INFORMATION_SCHEMA-Tabellen und sys-Tabellen. Beide Methoden dienen dem gleichen Zweck, bieten jedoch unterschiedliche Vor- und Nachteile. In diesem Artikel werden wir die Unterschiede zwischen diesen beiden Arten von Tabellen detailliert untersuchen und erklären, warum es beide Arten gibt.
INFORMATION_SCHEMA Tabellen
Die INFORMATION_SCHEMA-Tabellen sind Teil des SQL-92 Standards und bieten eine systemunabhängige Methode, um Metadaten abzurufen. Diese Tabellen sind in vielen verschiedenen Datenbanksystemen verfügbar, darunter SQL Server, MySQL und PostgreSQL. Sie bieten eine standardisierte Schnittstelle, um Informationen über Datenbankobjekte wie Tabellen, Spalten, Schemata und Berechtigungen zu erhalten.
Beispiele für INFORMATION_SCHEMA Tabellen:
INFORMATION_SCHEMA.TABLES
INFORMATION_SCHEMA.COLUMNS
INFORMATION_SCHEMA.SCHEMATA
INFORMATION_SCHEMA.TABLE_CONSTRAINTS
sys Tabellen
Die sys-Tabellen sind spezifisch für SQL Server und bieten eine umfassendere und detailliertere Ansicht der Datenbankmetadaten. Diese Tabellen sind tief in das SQL Server-System integriert und bieten Zugriff auf viele interne Details, die über INFORMATION_SCHEMA nicht zugänglich sind. Sie sind oft schneller und leistungsfähiger als ihre INFORMATION_SCHEMA-Gegenstücke.
Beispiele für sys Tabellen:
sys.tables
sys.columns
sys.schemas
sys.objects
Warum gibt es beide Arten?
Es gibt mehrere Gründe, warum sowohl INFORMATION_SCHEMA- als auch sys-Tabellen existieren:
- Standardisierung: INFORMATION_SCHEMA-Tabellen bieten eine standardisierte Methode zur Abfrage von Metadaten, die in verschiedenen Datenbankmanagementsystemen konsistent ist. Dies erleichtert die Portabilität von Anwendungen zwischen verschiedenen Systemen.
- Leistung und Detailtiefe: sys-Tabellen bieten detailliertere und leistungsfähigere Abfragen, die speziell auf SQL Server zugeschnitten sind. Sie ermöglichen den Zugriff auf interne Systeminformationen, die über INFORMATION_SCHEMA nicht verfügbar sind.
- Kompatibilität: Die Unterstützung beider Methoden ermöglicht es Entwicklern und Administratoren, je nach ihren spezifischen Anforderungen und Präferenzen zu wählen.
Verfügbarkeit und Nutzung der object_id
Die object_id
ist ein eindeutiger Bezeichner für Datenbankobjekte in SQL Server und ist spezifisch für die sys-Tabellen. Sie ist nicht in den INFORMATION_SCHEMA-Tabellen verfügbar. Die object_id
wird in SQL Server verwendet, um jedes Objekt wie Tabellen, Sichten, Prozeduren und vieles mehr eindeutig zu identifizieren. Diese ID ist besonders nützlich, um Beziehungen zwischen verschiedenen Metadatenansichten herzustellen und um detaillierte Abfragen über die Struktur und den Zustand der Datenbank durchzuführen.
Beispiel zur Verwendung der object_id
in sys-Tabellen:
n dieser Abfrage wird die object_id
verwendet, um Tabellen mit ihren Spalten zu verknüpfen. Durch die Verwendung der object_id
können Administratoren und Entwickler präzise und effiziente Abfragen erstellen, die auf spezifische Objekte abzielen, und so detaillierte Einblicke in die Struktur und Beziehungen innerhalb der Datenbank erhalten. Dies macht die object_id
zu einem unverzichtbaren Werkzeug in der Verwaltung und Optimierung von SQL Server-Datenbanken.
Verwendung von object_id
mit INFORMATION_SCHEMA
Obwohl object_id
direkt in INFORMATION_SCHEMA-Tabellen nicht verfügbar ist, gibt es Möglichkeiten, diese Information indirekt zu nutzen, indem man die Ergebnisse von INFORMATION_SCHEMA-Abfragen mit sys-Tabellen kombiniert.
Beispielansatz:
- Abfrage der gewünschten Informationen aus INFORMATION_SCHEMA.
- Verwendung der Ergebnistabelle als Zwischenergebnis und Verknüpfung mit den sys-Tabellen, um die
object_id
zu erhalten.
Durch diese Methode kann man die Vorteile von INFORMATION_SCHEMA nutzen und gleichzeitig auf die object_id
zugreifen, um detailliertere Informationen zu erhalten.
Vergleich von INFORMATION_SCHEMA und sys Tabellen
INFORMATION_SCHEMA Tabelle | sys Tabelle | Beschreibung |
---|---|---|
INFORMATION_SCHEMA.TABLES | sys.tables | Informationen über Tabellen in der Datenbank. |
INFORMATION_SCHEMA.COLUMNS | sys.columns | Informationen über Spalten in den Tabellen. |
INFORMATION_SCHEMA.SCHEMATA | sys.schemas | Informationen über Schemata in der Datenbank. |
INFORMATION_SCHEMA.TABLE_CONSTRAINTS | sys.objects | Informationen über Objekte und deren Einschränkungen. |
INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE | sys.foreign_keys | Informationen über Spalten, die Einschränkungen verwenden. |
INFORMATION_SCHEMA.KEY_COLUMN_USAGE | sys.key_constraints | Informationen über Schlüsselspalten. |
INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS | sys.foreign_keys | Informationen über referentielle Integritätseinschränkungen. |
INFORMATION_SCHEMA.CHECK_CONSTRAINTS | sys.check_constraints | Informationen über CHECK-Einschränkungen. |
INFORMATION_SCHEMA.ROUTINES | sys.procedures | Informationen über gespeicherte Prozeduren und Funktionen. |
INFORMATION_SCHEMA.PARAMETERS | sys.parameters | Informationen über Parameter von Prozeduren und Funktionen. |
INFORMATION_SCHEMA.VIEWS | sys.views | Informationen über Sichten in der Datenbank. |
INFORMATION_SCHEMA.TRIGGERS | sys.triggers | Informationen über Trigger in der Datenbank. |
INFORMATION_SCHEMA.USER_DEFINED_TYPES | sys.types | Informationen über benutzerdefinierte Datentypen. |
INFORMATION_SCHEMA.COLUMN_DOMAIN_USAGE | Keine direkte Entsprechung | Informationen über Domänen, die von Spalten verwendet werden. |
INFORMATION_SCHEMA.DOMAINS | Keine direkte Entsprechung | Informationen über Domänen. |
INFORMATION_SCHEMA.USAGE_PRIVILEGES | sys.database_permissions | Informationen über Berechtigungen auf Datenbankobjekte. |
INFORMATION_SCHEMA.APPLICABLE_ROLES | sys.database_principals | Informationen über Datenbankrollen. |
INFORMATION_SCHEMA.ROLE_TABLE_GRANTS | sys.database_permissions | Informationen über Tabellenberechtigungen, die Rollen gewährt wurden. |
INFORMATION_SCHEMA.CHARACTER_SETS | sys.fulltext_catalogs | Informationen über Zeichensätze. |
INFORMATION_SCHEMA.COLLATIONS | sys.column_store_segments | Informationen über Kollationen. |
INFORMATION_SCHEMA.TRANSLATIONS | Keine direkte Entsprechung | Informationen über Sprachübersetzungen. |
Keine direkte Entsprechung | sys.objects | Allgemeine Informationen über alle Datenbankobjekte. |
Keine direkte Entsprechung | sys.partitions | Informationen über Partitionen von Tabellen und Indizes. |
Keine direkte Entsprechung | sys.allocation_units | Informationen über Zuordnungseinheiten (Speicher). |
Keine direkte Entsprechung | sys.stats | Statistiken über Indizes und Spalten. |
Keine direkte Entsprechung | sys.dm_db_index_physical_stats | Physische Statistiken über Datenbankindizes. |
Keine direkte Entsprechung | sys.dm_exec_requests | Informationen über aktuelle Datenbankabfragen und deren Status. |
Keine direkte Entsprechung | sys.dm_exec_sessions | Informationen über aktuelle Datenbanksitzungen. |
Verfügbarkeit von INFORMATION_SCHEMA Tabellen in verschiedenen Datenbanksystemen
Die INFORMATION_SCHEMA-Tabellen sind in vielen relationalen Datenbankmanagementsystemen (RDBMS) vorhanden. Hier ist eine detaillierte Analyse der Verfügbarkeit von INFORMATION_SCHEMA-Tabellen in verschiedenen Datenbanksystemen:
INFORMATION_SCHEMA Tabelle | MySQL/MariaDB | Oracle | PostgreSQL | HANA | DB2 | Ingres | SQL Anywhere | SAP MaxDB | SQLite |
---|---|---|---|---|---|---|---|---|---|
INFORMATION_SCHEMA.TABLES | Ja | Nein | Ja | Ja | Ja | Nein | Ja | Ja | Nein |
INFORMATION_SCHEMA.COLUMNS | Ja | Nein | Ja | Ja | Ja | Nein | Ja | Ja | Nein |
INFORMATION_SCHEMA.SCHEMATA | Ja | Nein | Ja | Ja | Ja | Nein | Ja | Ja | Nein |
INFORMATION_SCHEMA.TABLE_CONSTRAINTS | Ja | Nein | Ja | Ja | Ja | Nein | Ja | Ja | Nein |
INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE | Ja | Nein | Ja | Ja | Ja | Nein | Ja | Ja | Nein |
INFORMATION_SCHEMA.KEY_COLUMN_USAGE | Ja | Nein | Ja | Ja | Ja | Nein | Ja | Ja | Nein |
INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS | Ja | Nein | Ja | Ja | Ja | Nein | Ja | Ja | Nein |
INFORMATION_SCHEMA.CHECK_CONSTRAINTS | Ja | Nein | Ja | Ja | Ja | Nein | Ja | Ja | Nein |
INFORMATION_SCHEMA.ROUTINES | Ja | Nein | Ja | Ja | Ja | Nein | Ja | Ja | Nein |
INFORMATION_SCHEMA.PARAMETERS | Ja | Nein | Ja | Ja | Ja | Nein | Ja | Ja | Nein |
INFORMATION_SCHEMA.VIEWS | Ja | Nein | Ja | Ja | Ja | Nein | Ja | Ja | Nein |
INFORMATION_SCHEMA.TRIGGERS | Ja | Nein | Ja | Ja | Ja | Nein | Ja | Ja | Nein |
INFORMATION_SCHEMA.USER_DEFINED_TYPES | Nein | Nein | Ja | Ja | Ja | Nein | Ja | Ja | Nein |
INFORMATION_SCHEMA.COLUMN_DOMAIN_USAGE | Nein | Nein | Ja | Nein | Ja | Nein | Nein | Nein | Nein |
INFORMATION_SCHEMA.DOMAINS | Nein | Nein | Ja | Nein | Ja | Nein | Nein | Nein | Nein |
INFORMATION_SCHEMA.USAGE_PRIVILEGES | Ja | Nein | Ja | Ja | Ja | Nein | Ja | Ja | Nein |
INFORMATION_SCHEMA.APPLICABLE_ROLES | Ja | Nein | Ja | Nein | Ja | Nein | Nein | Nein | Nein |
INFORMATION_SCHEMA.ROLE_TABLE_GRANTS | Ja | Nein | Ja | Nein | Ja | Nein | Nein | Nein | Nein |
INFORMATION_SCHEMA.CHARACTER_SETS | Ja | Nein | Ja | Nein | Ja | Nein | Nein | Nein | Nein |
INFORMATION_SCHEMA.COLLATIONS | Ja | Nein | Ja | Ja | Ja | Nein | Nein | Nein | Nein |
INFORMATION_SCHEMA.TRANSLATIONS | Nein | Nein | Nein | Nein | Nein | Nein | Nein | Nein | Nein |
Analyse der Verfügbarkeit
- MySQL/MariaDB: Diese Systeme unterstützen umfassend INFORMATION_SCHEMA-Tabellen, was sie sehr nützlich für plattformübergreifende Anwendungen macht.
- Oracle: Oracle bietet keine INFORMATION_SCHEMA-Tabellen an. Stattdessen verwendet Oracle eigene Data Dictionary Views, wie
ALL_TABLES
,ALL_TAB_COLUMNS
, etc. - PostgreSQL: PostgreSQL unterstützt die meisten INFORMATION_SCHEMA-Tabellen und bietet somit eine standardisierte Methode zur Metadatenabfrage.
- SAP HANA: HANA unterstützt eine breite Palette von INFORMATION_SCHEMA-Tabellen, obwohl einige spezielle Funktionen fehlen.
- IBM DB2: DB2 bietet Unterstützung für viele INFORMATION_SCHEMA-Tabellen und ergänzt diese durch eigene spezifische Systemtabellen.
- Ingres: Ingres unterstützt keine INFORMATION_SCHEMA-Tabellen und verwendet stattdessen proprietäre Systemtabellen.
- SQL Anywhere: SQL Anywhere unterstützt die meisten INFORMATION_SCHEMA-Tabellen, was die Metadatenabfrage erleichtert.
- SAP MaxDB: SAP MaxDB bietet Unterstützung für die meisten INFORMATION_SCHEMA-Tabellen und ermöglicht so eine standardisierte Metadatenabfrage.
- SQLite: SQLite unterstützt keine INFORMATION_SCHEMA-Tabellen, da es ein leichtgewichtiges und eingebettetes Datenbanksystem ist, das eine einfachere interne Struktur hat.
Die Unterstützung von INFORMATION_SCHEMA-Tabellen variiert je nach Datenbanksystem. Während Systeme wie MySQL, PostgreSQL und SQL Anywhere umfassende Unterstützung bieten, haben andere Systeme wie Oracle und Ingres keine native Unterstützung und verwenden stattdessen proprietäre Mechanismen zur Metadatenabfrage. Das Verständnis dieser Unterschiede ist wichtig für die Portabilität von Anwendungen und die Entwicklung plattformübergreifender Datenbanklösungen.
Fazit
INFORMATION_SCHEMA- und sys-Tabellen bieten unterschiedliche Ansätze zur Abfrage von Metadaten in SQL Server. Während INFORMATION_SCHEMA-Tabellen eine standardisierte und systemunabhängige Methode bieten, ermöglichen sys-Tabellen tiefere Einblicke und bessere Leistung für SQL Server-spezifische Anforderungen. Beide Methoden haben ihre eigenen Vor- und Nachteile, und die Wahl zwischen ihnen hängt von den spezifischen Anforderungen und Präferenzen des Entwicklers oder Administrators ab.
Zusammengefasst:
- INFORMATION_SCHEMA Tabellen: Einfachere Abfragen, weniger Joins, standardisierte und plattformunabhängige Metadaten.
- sys Tabellen: Umfangreichere und detailliertere Informationen, komplexere Abfragen mit mehreren Joins, SQL Server-spezifische Metadaten.
Die object_id
ist ein Merkmal der sys-Tabellen und nicht in den INFORMATION_SCHEMA-Tabellen verfügbar. Dies ermöglicht in sys-Tabellen tiefere und detailliertere Abfragen, die für fortgeschrittene Datenbankverwaltungsaufgaben erforderlich sind. Durch die Kombination von INFORMATION_SCHEMA- und sys-Tabellen können Administratoren und Entwickler das Beste aus beiden Welten nutzen, um umfassende und präzise Metadatenabfragen durchzuführen.