Digamos que tenhamos um banco de dados de 12 milhões de nomes e endereços que precisam ser pesquisáveis usando texto completo, mas cada linha também contém um valor inteiro, digamos COMPANYID
. A tabela contém cerca de 250 COMPANYIDs diferentes nesses 12 milhões de linhas.
É possível, ao definir os índices de texto completo, atribuir a cada um o COMPANY
seu "ramo" na árvore?
company
até agora e todo mundo gostou tanto que quer que eu o coloque em produção para todas as empresas, e não tive a chance de criar uma maquete com 12 milhões de linhas de dados fictícios significativas ainda. Valores como "Sobrenome1", "Sobrenome2", "Cidade1" etc. não terão variação suficiente e podem distorcer os resultados do teste. Os dados são alterados com tanta frequência que não tenho certeza se o SQL Server saberá com segurança qual índice é o mais estreito em qualquer consulta e o número de linhas por empresa varia bastante. Uma empresa pode ter apenas 1000 linhas, outras 60.000.Respostas:
Não, é a resposta curta e você realmente não precisa disso. Os índices de texto completo são invertidos e, portanto, armazenam as palavras divididas pelo único doc_id que você precisa especificar ao criar o índice de texto completo. Essa deve ser uma "coluna única, de chave única e não anulável", idealmente um número inteiro. O que é essencialmente uma chave estrangeira não aparece e não há uma maneira fácil de particioná-las nessa base.
Você pode falsificar algo assim com uma tabela por empresa e um índice de texto completo por tabela. Você precisaria de algum tipo de lógica de código à frente para determinar em qual tabela inserir / buscar. Isso seria uma dor de cabeça considerável para gerenciar quase certamente não vale a pena.
Se você tivesse um volume sério (por exemplo, mais de 23 bilhões de registros), poderia procurar uma solução de fragmentação, por exemplo, algo como uma VM do Azure por empresa com um aplicativo sentado à sua frente para determinar a qual máquina se conectar. Mas claramente você também não precisa disso.
Também houve várias melhorias no SQL 2008 para texto completo, que agora está mais integrado ao mecanismo de banco de dados. Um cenário, em que você especifica uma cláusula WHERE em uma coluna normal e usa as funções de texto completo, é referido como 'Consulta Mista' e discutido aqui . Este ainda é um ótimo artigo, embora as informações sejam do SQL 2008.
Se você geralmente está preocupado com o desempenho e os planos, por que não exibir alguns dados de teste, apresentar alguns desvios e testá-los. Eu bati esse script com ~ 2 milhões de linhas em alguns minutos:
fonte