Digamos que tenemos una base de datos de 12 millones de nombres y direcciones que deben buscarse usando texto completo, pero cada fila también contiene un valor entero, digamos COMPANYID
. La tabla contiene alrededor de 250 COMPANYID distintos en esos 12 millones de filas.
¿Es posible, al definir los índices de texto completo, dar a cada uno COMPANY
su propia "rama" en el árbol?
company
hasta ahora, y a todos les gustó tanto que quieren que la ponga en producción para todas las empresas, y no he tenido la oportunidad de crear una maqueta con 12 millones de filas de datos ficticios significativos todavía. Los valores como "Apellido1", "Apellido2", "Ciudad1", etc. no tendrán suficiente variación y podrían sesgar los resultados de la prueba. Los datos cambian con tanta frecuencia que no estoy seguro de que SQL Server sepa de manera confiable qué índice es el más estrecho en una consulta determinada, y el número de filas por compañía varía mucho. Una compañía podría tener solo 1000 filas, otras 60,000.Respuestas:
No es la respuesta corta, y realmente no necesitas esto. Los índices de texto completo son índices invertidos, por lo que almacenan las palabras divididas por el doc_id exclusivo que debe especificar al crear el índice de texto completo. Debe ser una "columna única, de clave única, no anulable", idealmente un número entero. Lo que es esencialmente una clave foránea no figura y no hay una manera fácil de particionarlas sobre esa base.
Usted podría suplantar algo como esto con una mesa por empresa y el índice de texto completo por mesa. Necesitaría algún tipo de lógica de código sentado al frente para determinar desde qué tabla insertar / buscar. Esto sería un dolor de cabeza considerable para manejar, casi seguro que no vale la pena.
Si tuviera un volumen considerable (por ejemplo, más de 23 mil millones de registros), podría buscar una solución de fragmentación, por ejemplo, algo así como una máquina virtual de Azure por empresa con una aplicación sentada frente a ellos para determinar a qué máquina conectarse. Pero claramente tampoco necesitas eso.
También hubo una serie de mejoras en SQL 2008 al texto completo que ahora está más integrado en el motor de la base de datos. Un escenario, donde especifica una cláusula WHERE contra una columna normal y utiliza las funciones de texto completo, se conoce como 'Consulta mixta' y se discute aquí . Este sigue siendo un gran artículo a pesar de que la información es para SQL 2008.
Si generalmente está preocupado por el rendimiento y los planes, ¿por qué no mezclar algunos datos de prueba, introducir algún sesgo y probarlo? Golpeé este script con ~ 2 millones de filas en unos minutos:
fuente