Veröffentlicht am :
Datenmanagement CREATION_INTERNE

Spalten in einer CAS-Tabelle indizieren

Dieser Code ist auch verfügbar auf: English Español
Wartet auf Validierung
Die Indizierung von Spalten in einer CAS-Tabelle erstellt eine optimierte Datenstruktur, die eine schnellere Suche und einen schnelleren Zugriff auf Zeilen ermöglicht, basierend auf den Werten dieser Spalten. Dies ist besonders nützlich für Abfragen, die WHERE-Klauseln oder Joins auf den indizierten Spalten verwenden. Dieser Prozess erstellt eine neue In-Memory-Tabelle mit dem angewendeten Index. Die folgenden Beispiele zeigen, wie indizierte Tabellen erstellt und effizient genutzt werden können.
Datenanalyse

Type : CREATION_INTERNE


Die Beispiele verwenden simulierte Iris-Daten (generiert über Datalines) oder intern generierte Daten (DATA Step), um In-Memory-CAS-Tabellen zu erstellen. Diese Daten werden dann verwendet, um die Indizierungsfunktionen zu demonstrieren.

1 Codeblock
DATA STEP / table.index Data
Erklärung :
Dieses Beispiel erstellt eine In-Memory-Tabelle 'iris_data' aus simulierten Iris-Daten. Anschließend wird die Aktion 'table.index' verwendet, um eine neue Tabelle 'iris_indexed_basic' mit einem Index auf der Spalte 'SepalLength' zu erstellen. 'table.columnInfo' bestätigt die Indexerstellung und 'table.fetch' demonstriert die Verwendung des Filters auf der indizierten Spalte für einen schnellen Datenzugriff.
Kopiert!
1/* Préparation des données dans une session CAS */
2PROC CAS;
3 SESSION casauto;
4 /* Création d'une table Iris simulée */
5 DATA casuser.iris_data;
6 INFILE DATALINES dsd;
7 INPUT SepalLength SepalWidth PetalLength PetalWidth Species $;
8 DATALINES;
9 5.1,3.5,1.4,0.2,setosa
10 4.9,3.0,1.4,0.2,setosa
11 4.7,3.2,1.3,0.2,setosa
12 4.6,3.1,1.5,0.2,setosa
13 5.0,3.6,1.4,0.2,setosa
14 5.4,3.9,1.7,0.4,setosa
15 4.6,3.4,1.4,0.3,setosa
16 5.0,3.4,1.5,0.2,setosa
17 4.4,2.9,1.4,0.2,setosa
18 4.9,3.1,1.5,0.1,setosa
19 7.0,3.2,4.7,1.4,versicolor
20 6.4,3.2,4.5,1.5,versicolor
21 6.9,3.1,4.9,1.5,versicolor
22 5.5,2.3,4.0,1.3,versicolor
23 6.5,2.8,4.6,1.5,versicolor
24 5.7,2.8,4.5,1.3,versicolor
25 6.3,3.3,6.0,2.5,virginica
26 5.8,2.7,5.1,1.9,virginica
27 7.1,3.0,5.9,2.1,virginica
28 6.3,2.9,5.6,1.8,virginica
29 7.6,3.0,6.6,2.1,virginica
30 6.1,2.8,5.0,2.4,virginica
31 ;
32 RUN;
33 
34 /* Indexer la colonne 'SepalLength' */
35 TABLE.index /
36 TABLE='iris_data',
37 casOut={
38 name='iris_indexed_basic',
39 indexVars={'SepalLength'},
40 replace=TRUE
41 };
42 
43 /* Afficher les informations de la table pour confirmer l'index */
44 TABLE.columnInfo /
45 TABLE='iris_indexed_basic';
46 
47 /* Récupérer des données en filtrant sur la colonne indexée */
48 TABLE.fetch /
49 TABLE={
50 name='iris_indexed_basic',
51 where='SepalLength = 5.0'
52 };
53QUIT;
2 Codeblock
table.index
Erklärung :
Dieser Fall erweitert das Basisbeispiel, indem er zwei Spalten, 'SepalLength' und 'Species', indiziert und den 'indexType' explizit als 'Btree' angibt (was oft der Standard ist, hier aber zur Demonstration der Optionen explizit angegeben wird). Die 'table.fetch'-Anfrage verwendet diese beiden Spalten in ihrer WHERE-Klausel, um zusammengesetzte Indizes zu nutzen.
Kopiert!
1PROC CAS;
2 SESSION casauto;
3 /* La table 'iris_data' est supposée exister de l'exemple précédent */
4 
5 /* Indexer plusieurs colonnes et spécifier un type d'index Btree */
6 TABLE.index /
7 TABLE='iris_data',
8 casOut={
9 name='iris_indexed_multi',
10 indexVars={'SepalLength', 'Species'},
11 indexType='Btree',
12 replace=TRUE
13 };
14 
15 /* Afficher les informations de la table pour confirmer les index */
16 TABLE.columnInfo /
17 TABLE='iris_indexed_multi';
18 
19 /* Récupérer des données en filtrant sur les colonnes indexées */
20 TABLE.fetch /
21 TABLE={
22 name='iris_indexed_multi',
23 where='SepalLength > 5.0 and Species = "virginica"'
24 };
25QUIT;
3 Codeblock
table.index / table.tableDetails
Erklärung :
Dieses Beispiel demonstriert, wie ein anfänglicher Index für eine Spalte ('PetalLength') erstellt wird und wie anschließend ein Index für eine neue Tabelle mit zusätzlichen Spalten ('PetalLength' und 'Species') mithilfe der Option `rebuild=TRUE` 'neu aufgebaut' (neu erstellt) wird. Es verwendet auch die Aktion `table.tableDetails`, um die Größe des Index und der Daten zu überprüfen, was für Leistungs- und CAS-Speicherüberlegungen entscheidend ist.
Kopiert!
1PROC CAS;
2 SESSION casauto;
3 /* La table 'iris_data' est supposée exister de l'exemple précédent */
4 
5 /* Créer un index sur la colonne 'PetalLength' */
6 TABLE.index /
7 TABLE='iris_data',
8 casOut={
9 name='iris_petal_indexed',
10 indexVars={'PetalLength'},
11 replace=TRUE
12 };
13 
14 /* Analyser les détails de la table pour voir la taille de l'index */
15 TABLE.tableDetails RESULT=r_details / TABLE='iris_petal_indexed';
16 PRINT r_details.TableDetails[,{'Active', 'Rows', 'IndexSize', 'DataSize'}];
17 
18 /* Reconstruire l'index avec une colonne supplémentaire */
19 TABLE.index /
20 TABLE='iris_data',
21 casOut={
22 name='iris_petal_species_indexed',
23 indexVars={'PetalLength', 'Species'},
24 rebuild=TRUE,
25 replace=TRUE
26 };
27 
28 /* Analyser la nouvelle table indexée */
29 TABLE.tableDetails RESULT=r_rebuild_details / TABLE='iris_petal_species_indexed';
30 PRINT r_rebuild_details.TableDetails[,{'Active', 'Rows', 'IndexSize', 'DataSize'}];
31 
32 /* Afficher les informations de colonne */
33 TABLE.columnInfo / TABLE='iris_petal_species_indexed';
34QUIT;
4 Codeblock
table.index / table.dropTable
Erklärung :
Dieses Beispiel behandelt die Fehlerbehandlung und Indexlöschung in der CAS-Umgebung. Es zeigt (durch Kommentieren des fehlerhaften Codes), wie der Versuch, eine nicht existierende Spalte zu indizieren, einen Fehler verursachen würde. Anschließend wird ein temporärer Index auf 'PetalWidth' erstellt und die Verwendung von 'table.dropTable' zum Löschen der indizierten Tabelle demonstriert. Das Löschen der indizierten Tabelle führt auch zur Löschung des zugehörigen Indexes, was eine gute Praxis ist, um Ressourcen freizugeben.
Kopiert!
1PROC CAS;
2 SESSION casauto;
3 /* La table 'iris_data' est supposée exister de l'exemple précédent */
4 
5 /* Tentative de créer un index sur une colonne inexistante (gestion d'erreur) */
6 /* Note: CASL générera un avertissement ou une erreur, le script continuera si possible. */
7 /* La ligne suivante est commentée car elle provoquerait une erreur dans un environnement réel */
8 /*
9 table.index /
10 table='iris_data',
11 casOut={
12 name='iris_error_index',
13 indexVars={'NonExistentColumn'},
14 replace=TRUE
15 };
16 */
17 
18 /* Créer un index temporaire pour la démonstration de suppression */
19 TABLE.index /
20 TABLE='iris_data',
21 casOut={
22 name='iris_temp_indexed',
23 indexVars={'PetalWidth'},
24 replace=TRUE
25 };
26 
27 /* Vérifier que l'index temporaire a été créé */
28 TABLE.columnInfo / TABLE='iris_temp_indexed';
29 
30 /* Supprimer la table indexée (ce qui supprime l'index implicitement) */
31 TABLE.dropTable /
32 caslib='casuser',
33 tableName='iris_temp_indexed',
34 quiet=TRUE;
35 
36 /* Tenter de récupérer des informations sur la table supprimée (devrait échouer) */
37 /* La ligne suivante est commentée car elle provoquerait une erreur dans un environnement réel */
38 /*
39 table.columnInfo / table='iris_temp_indexed';
40 */
41QUIT;
Dieses Material wird von We Are Cas "wie besehen" zur Verfügung gestellt. Es gibt keine ausdrücklichen oder stillschweigenden Garantien hinsichtlich der Marktgängigkeit oder Eignung für einen bestimmten Zweck in Bezug auf die hierin enthaltenen Materialien oder Codes. We Are Cas ist nicht verantwortlich für Fehler in diesem Material, wie es jetzt existiert oder existieren wird, noch bietet We Are Cas technischen Support dafür an.
Banner
Expertenrat
Expert
Michael
Responsable de l'infrastructure Viya.
« Indizes in CAS sind primär für Read-Heavy-Workloads (leseintensive Aufgaben) gedacht. Bei Tabellen, die permanent aktualisiert oder erweitert werden, kann der Overhead für die Index-Wartung die Performance-Vorteile zunichtemachen. Setzen Sie Indizes gezielt für „Gold“-Tabellen oder Data Marts ein, die Dashboards und Endanwendern als Quelle dienen. »