Publicado el :
Gestión de Datos CREATION_INTERNE

Indexar columnas en una tabla CAS

Este código también está disponible en: Deutsch English
En espera de validación
La indexación de columnas en una tabla CAS crea una estructura de datos optimizada que permite una búsqueda y un acceso más rápidos a las filas basándose en los valores de esas columnas. Esto es particularmente útil para consultas que utilizan cláusulas WHERE o uniones en las columnas indexadas. Este proceso crea una nueva tabla en memoria con el índice aplicado. Los ejemplos a continuación muestran cómo crear tablas indexadas y cómo utilizarlas de manera eficiente.
Análisis de datos

Type : CREATION_INTERNE


Los ejemplos utilizan datos Iris simulados (generados a través de datalines) o datos generados internamente (paso DATA) para crear tablas CAS en memoria. Estos datos se utilizan posteriormente para demostrar las funcionalidades de indexación.

1 Bloque de código
DATA STEP / table.index Data
Explicación :
Este ejemplo crea una tabla en memoria 'iris_data' a partir de datos Iris simulados. Luego, la acción 'table.index' se utiliza para crear una nueva tabla 'iris_indexed_basic' con un índice en la columna 'SepalLength'. 'table.columnInfo' confirma la creación del índice y 'table.fetch' demuestra el uso del filtro en la columna indexada para un acceso rápido a los datos.
¡Copiado!
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 Bloque de código
table.index
Explicación :
Este caso extiende el ejemplo básico indexando dos columnas, 'SepalLength' y 'Species', y especificando explícitamente el 'indexType' como 'Btree' (que a menudo es el predeterminado pero se explicita aquí para la demostración de opciones). La consulta 'table.fetch' utiliza estas dos columnas en su cláusula WHERE para aprovechar los índices compuestos.
¡Copiado!
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 Bloque de código
table.index / table.tableDetails
Explicación :
Este ejemplo demuestra cómo crear un índice inicial en una columna ('PetalLength'), y luego cómo 'reconstruir' (recrear) un índice en una nueva tabla con columnas adicionales ('PetalLength' y 'Species') usando la opción `rebuild=TRUE`. También utiliza la acción `table.tableDetails` para inspeccionar el tamaño del índice y los datos, lo cual es crucial para las consideraciones de rendimiento y gestión de memoria de CAS.
¡Copiado!
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 Bloque de código
table.index / table.dropTable
Explicación :
Este ejemplo aborda la gestión de errores y la eliminación de índices en el entorno CAS. Muestra (comentando el código erróneo) cómo el intento de indexar una columna inexistente produciría un error. Luego, crea un índice temporal en 'PetalWidth' y demuestra el uso de 'table.dropTable' para eliminar la tabla indexada. La eliminación de la tabla indexada también implica la eliminación del índice asociado, lo cual es una buena práctica para liberar recursos.
¡Copiado!
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;
Este material se proporciona "tal cual" por We Are Cas. No hay garantías, expresas o implícitas, en cuanto a la comerciabilidad o idoneidad para un propósito particular con respecto a los materiales o el código contenidos en este documento. We Are Cas no es responsable de los errores en este material tal como existe ahora o existirá, ni We Are Cas proporciona soporte técnico para el mismo.