Sei que estou entrando em detalhes, mas estou implementando algo para processar um feed multilíngue.
Na tabela de ingestão bruta, que tem aproximadamente 190 milhões de linhas, eu queria capturar tudo o que o fornecedor nos enviou, mas devo repassar apenas as linhas que estão em um pequeno subconjunto de idiomas aprovados.
Originalmente, essa lista era apenas em inglês, mas agora eles querem aumentar a lista de idiomas "aprovados".
Então, tenho vários lugares onde a etapa de processamento é
WHERE lang_code = 'en'
que precisam de ajustes.
Eu criei algumas implementações
- Variável de tabela muito pequena na rotina de processamento do feed com 2-3 linhas para códigos "aprovados".
- Uma tabela permanente muito pequena contendo 2 a 3 linhas para códigos aprovados.
- PATINDEX em uma string de vírgula com códigos aprovados (por exemplo, WHERE PATINDEX('%,'+lang_code+',%', ',en,de,pl,') > 0)
A lista pode crescer para 5 ou 6, mas é improvável que passe de 10.
Para esse tipo de lista muito curta, eu queria saber onde as pessoas podem ver a linha entre implementações de tabela e implementações apenas "nesta sequência curta".
Eu traçaria a linha em mais de um e usaria uma
ApprovedLanguage
tabela permanente com alang_code
coluna como chave primária. Dessa forma, nenhuma alteração de código é necessária para adicionar ou remover idiomas; apenas adicione/delete linhas conforme os requisitos mudam.Definitivamente não siga esse
PATINDEX(...)
caminho, pois essa função não é sargável e impedirá buscas de índice, resultando em baixo desempenho.Usar string é mais fácil de manter, se a instrução SQL for construída em um aplicativo, a "Linguagem Aprovada" pode ser escrita em um arquivo de configuração, pode ser editada por usuário sem experiência em programação, e há muitas ferramentas que podem processá-la. Usando tabela de dados, apenas DBA ou desenvolvedores podem modificá-la, ou você tem que fazer um editor para o usuário normal.
Você pode usar
STRING_SPLIT
para tratar cordas.