2012-04-04 17 views
5

Quiero crear una tabla grande (alrededor de 45 mil millones de filas) a la que siempre se accede mediante una clave única.Hashset equivalente en SQL Server

Fuera del DB, la mejor estructura para contener esto es un diccionario o un HashSet, pero, por supuesto, debido al tamaño de los datos, no es posible hacerlo fuera de la base de datos.

¿SQL Server proporciona una estructura optimizada para el acceso de valores clave? Entiendo que una clave en clúster es muy rápida, pero aún así es un índice y, por lo tanto, habrá algunas lecturas de disco adicionales asociadas con las páginas de índice de desplazamiento. Lo que me gustaría obtener de SQL Server es una estructura "nativa" que almacena los datos como pares clave-valor y luego permite acceder a valores basados ​​en claves.

En otras palabras, mi pregunta es cómo almacenar en SQL Server 45 mil millones de filas y acceder de manera eficiente SIN tener un índice, agrupado o no agrupado, porque leer el índice de páginas no hojas puede dar como resultado IO sustancial, y dado que se puede acceder a cada valor mediante una clave única, debería ser posible tener una estructura donde el hash de una clave se resuelva en una ubicación física del valor. Para obtener 1 valor, tendríamos que hacer 1 lectura (a menos que haya colisiones hash).

(un equivalente en Oracle es Cluster de Hash)

Gracias por su ayuda.

Respuesta

3

No existe tal cosa en el servidor SQL. Tu única opción es un índice. Si va a solicitar todas las columnas para una clave determinada, debe usar un índice agrupado. Si sólo va a estar solicitando un subconjunto, se debe utilizar un índice no agrupado incluyendo sólo las columnas que desea de esta manera:

create index IX_MyBigTable on MyBigTable(keyColumn) include (col1, col2, col3youneed); 

Esto será bastante eficiente.

+0

Atravesar un árbol b probablemente no sea mucho menos eficiente que generar un valor hash, y la razón por la cual los índices agrupados son tan importantes en SQL Server es que las filas de datos se almacenan a nivel de hoja. Entonces, la lectura que llega a la hoja del árbol b para su clave de índice también lee la fila de datos para esa clave – Rick

+0

Esta respuesta es correcta. Los niveles de índice intermedios serán pequeños y completamente en caché. Básicamente, cualquier obtención de PK en dicha tabla requerirá como máximo un IO. A diferencia del uso de una tabla hash en disco, incluso se beneficiará de la localidad clave. – usr

+0

Sugerencia aleatoria: si realmente, realmente, 100% solo realiza búsquedas de valores-clave, y nunca CUALQUIER tipo de consultas relacionales, ¿tal vez SQL no es su respuesta? Eche un vistazo a Redis: es incomprensiblemente rápido, transaccional, consistente, persistente en el disco, fácil de configurar, suena como si fuera una mejor opción. http://redis.io –

0

Según mis puntos de referencia, el mejor enfoque es crear una columna hash para la clave. Details.

Cuestiones relacionadas