Problemas de rendimiento al usar sql_variant para almacenar datos

Tengo una tabla de clave / valor que estoy usando para almacenar datos que pueden ser de texto o numéricos, pero nada más.

En las pruebas preliminares, veo horrendo rendimiento al aplicar citeria a la columna sql_variant, por ejemplo:

SELECT * FROM MY_DATA WHERE  
MY_ENTITY_TYPE = 555
AND CAST(MY_SQL_VARIANT_COLUMN AS NUMERIC) = 2254

Entonces, obviamente, habrá ALGUNOS resultados con consultas como esta, pero estoy viendo consultas de más de 10 segundos, con solo unos pocos miles de filas en la tabla.

Teniendo en cuenta que solo almacenaré datos numéricos o de texto, ¿sería más razonable usar una columna varchar (255)? De esta manera, el rendimiento de selección debería ser rápido, y solo tendría que hacer una selección posterior de CAST para obtener los datos en el tipo de datos adecuado.

preguntado el 16 de mayo de 11 a las 16:05

2 Respuestas

Perdóname, pero la tabla clave / valor suena como la base de datos súper general que muchas personas prueban en algún momento u otro (¡yo lo hice!) Y no funciona en absoluto.

¿Está seguro de que no puede predecir las claves y definir una tabla donde las claves son las columnas y las filas son los valores relacionados entre sí?

contestado el 16 de mayo de 11 a las 20:05

Esto es para almacenar datos de usuario personalizados que se desconocen en el momento del diseño, importarán hojas de cálculo arbitrarias, etc., y el esquema se definirá en metadatos. - tbone

Perdóname, pero tu "respuesta" suena como el tipo de consejo muy general que muchas personas tratan de dar en algún momento u otro. Hay muchos escenarios en los que el uso de pares nombre-valor es mucho más preferible a las tablas relacionales "correctas". - El dag

Aquí hay dos métodos para resolver este problema de rendimiento:

  1. CAST el valor del criterio en lugar de la columna: SELECT * FROM MY_DATA WHERE
    MY_ENTITY_TYPE = 555 Y MY_SQL_VARIANT_COLUMN = CAST (2254 COMO NUMÉRICO)

  2. Agregue un índice a una columna diferente en la tabla y vea si mágicamente soluciona el problema. Por ejemplo, agregue un índice a MY_ENTITY_TYPE y, a pesar de que no se aplicaron criterios a esta columna, resolvió el problema de rendimiento en mi ejemplo.

Obviamente, el # 1 es el mejor de los dos.

contestado el 17 de mayo de 11 a las 00:05

Pero el ejemplo NO usa "no criterios" (para usar un término algo confuso). Utiliza el operador igual, en cuyo caso indexar la columna realmente debería ayudar. Es de suponer que quiere decir que agregar el índice TAMBIÉN mejoró el rendimiento cuando usa una consulta ligeramente diferente de la anterior, como WHERE EntityType! = @TypeID. - El dag

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.