Además del comentario de Stefan, la solución clásica para este requisito sería crear lo que Oracle llama un Índice Basado en Funciones.
Es bastante similar a las columnas generadas en SAP HANA y permitiría al optimizador aprovechar una estructura de índice existente.
En SAP HANA, el optimizador SQL es lo suficientemente inteligente como para darse cuenta de que ya hay una versión en mayúsculas precalculada de los datos en este caso:
create column table bbb (name varchar(20)
, upper_name varchar(20) generated always as UPPER(name));
insert into bbb values ('Lars');
insert into bbb values ('Mara');
insert into bbb values ('Josh');
insert into bbb values ('Caroline');
select * from bbb;
NAME
|
UPPER_NAME
|
Lars
|
LARS
|
Mara
|
MARA
|
Josh
|
JOSH
|
Caroline
|
CAROLINE
|
EXPLAIN PLAN FOR select * from bbb where upper(name) = upper('LaRs');
OPERATOR_NAME OPERATOR_DETAILS
COLUMN SEARCH BBB.NAME, BBB.UPPER_NAME (LATE MATERIALIZATION)
COLUMN TABLE FILTER CONDITION:
BBB.UPPER_NAME = 'LARS'
Como podemos ver, la columna generada se usa aquí sin necesidad de volver a codificar la instrucción SQL.
Ahora, para el uso de LIKE en lugar de igual, la función también funciona:
select * from bbb where upper(name) like '%AR%';
NAME
|
UPPER_NAME
|
Lars
|
LARS
|
Mara
|
MARA
|
Caroline
|
CAROLINE
|
EXPLAIN PLAN FOR select * from bbb where upper(name) like '%AR%';
OPERATOR_NAME OPERATOR_DETAILS
COLUMN SEARCH BBB.NAME, BBB.UPPER_NAME (LATE MATERIALIZATION)
COLUMN TABLE FILTER CONDITION:
BBB.UPPER_NAME LIKE ''%AR%''
Por lo tanto, los viejos trucos aún funcionan con SAP HANA
.
Si esto proporciona un rendimiento mucho mejor es algo que realmente se debe probar con datos reales.
La gran diferencia en SAP HANA en comparación con los DBMS orientados a filas es que la evaluación de la condición WHERE solo funciona en el diccionario (los valores únicos de cada columna) y no en cada fila individual.
Saludos, Lars