Avalados por :

Configuración de sensibilidad a mayúsculas y minúsculas en HANA: ¿Es recomendable desactivarla?

  • Creado 01/03/2024
  • Modificado 01/03/2024
  • 5 Vistas
0
Loading...

¡Hola a todos!

Tenemos una vista de HANA que los usuarios están consumiendo a través de Microstrategy. Todos los campos, como PLANT (WERKS), son sensibles a mayúsculas y minúsculas. Por ejemplo, si la planta se llama 'XYZ1', entonces la siguiente consulta SQL NO devuelve ningún resultado;

select * from TABLENAME where WERKS = 'xyz1'

Ahora mi desarrollador de Microstrategy está diciendo que otras bases de datos que consume no son sensibles a mayúsculas y minúsculas y que esta configuración se realiza típicamente a nivel de la base de datos. Así que mi pregunta es doble;

1) ¿Existe una configuración a nivel de base de datos en HANA para la sensibilidad a mayúsculas y minúsculas?

2) Si esta opción está disponible, ¿realmente tiene sentido desactivar esta sensibilidad?

Gracias,

-Patrick

Pedro Pascal
Se unió el 07/03/2018
Pinterest
Telegram
Linkedin
Whatsapp

4 Respuestas

0
Loading...

Hola Lars,

Gracias por la información.

Esto es muy útil para alguien sin mucha experiencia en modelado de bases de datos como yo, para aprender los consejos y trucos que los manuales oficiales generalmente no incluyen.

Entonces, volviendo al problema original: en un caso de la vida real, donde por defecto no existe una columna upper_name en nuestra tabla de hechos, ¿cómo debería crearse ese "índice basado en funciones" en HANA? ¿Podrías crear dicho índice personalizado con el comando CREATE INDEX u otro comando? ¿O sería necesario alterar la tabla original para incluirlo?

Respondido el 15/04/2024
LUCIANO RIOJA GHIOTTO
Se unió el 13/07/2019
0
Loading...

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

Respondido el 15/04/2024
LUCIANO RIOJA GHIOTTO
Se unió el 13/07/2019
0
Loading...

Hola Henrique,

Básicamente, se trata de la forma en que se comparan los caracteres. Puedes utilizar comparaciones binarias de caracteres (= configuración predeterminada) o comparaciones lingüísticas en Oracle (no sé cómo se maneja internamente en otros sistemas de gestión de bases de datos relacionales). Los caracteres se comparan según su valor binario en caso de comparación binaria, de lo contrario, el código numérico de cada carácter no tiene que ser idéntico para coincidir.

Incluso tendrías un mal rendimiento (búsquedas únicas de índices o exploraciones de rangos no posibles) con el uso lingüístico, si no creas un índice con la función nlssort (que se utiliza implícitamente). También existen otras limitaciones (como cosas de mapas de bits y demás), pero eso sería demasiado lejos por ahora.

Saludos

Stefan

Respondido el 15/04/2024
LUCIANO RIOJA GHIOTTO
Se unió el 13/07/2019
0
Loading...

Tema interesante.

Después de buscar rápidamente en Google, al parecer el comportamiento predeterminado varía de DB a DB.

SQL Server aparentemente es insensible a mayúsculas y minúsculas por defecto, mientras que Oracle aparentemente no lo es.

Una cosa que la capa de BI podría hacer es usar algo como

WHERE UPPER("COLUMN") = UPPER(:criterio)

En un RDBMS clásico, esto tendría un rendimiento terrible ya que no consideraría los índices existentes como en la cláusula WHERE directa. Sin embargo, en una DB en memoria, no estoy seguro de cuál sería la degradación del rendimiento (si la hay). Por favor, pruébalo y háznoslo saber.

Respondido el 15/04/2024
LUCIANO RIOJA GHIOTTO
Se unió el 13/07/2019

contacto@primeinstitute.com

(+51) 1641 9379
(+57) 1489 6964

© 2024 Copyright. Todos los derechos reservados.

Desarrollado por Prime Institute

¡Hola! Soy Diana, asesora académica de Prime Institute, indícame en que curso estas interesado, saludos!
Hola ¿Puedo ayudarte?