Pergunta

Estou me juntando a uma mesa dezenas de momentos diferentes e, todas as vezes, entro (ou filtro) com base nos resultados de uma substring de uma das colunas (é uma corda, mas cheia de zeros, e eu não T Revolu -se com os últimos quatro dígitos). Como resultado, mesmo que essa coluna seja indexada e minha consulta usaria o índice, ela faz uma digitalização de tabela porque a própria substring não é indexada, portanto, o SQL Server deve calculá -lo para cada linha antes, quando está entrando.

Estou procurando qualquer idéia sobre como acelerar esse processo. Atualmente, há uma exibição na tabela (é um "selecione * de", apenas para dar à mesa um nome amigável) e estou pensando em adicionar uma coluna à visualização que é calculada e depois indexando isso. No entanto, estou aberto a outras sugestões - algum pensamento?

MAIS DETALHES:Eu deveria ter compartilhado isso para começar. A tabela recebe replicação do nosso sistema de cobrança; portanto, editar a tabela subjacente para adicionar uma coluna calculada não é uma opção. Qualquer coluna calculada teria que ser adicionada à exibição na tabela. Além disso, os principais zeros nem sempre liderando zeros - às vezes são outros dados em que não estou interessado. Suponho que a verdadeira pergunta é "Como posso participar de dados no meio de uma coluna Varchar e também usar um índice? Pesquisa de texto completo?"

Esclarecendo meu exemploEstou simplificando, mas essencialmente, digamos que estou tentando procurar valores em uma coluna com os seguintes valores:

00000012345MoreStuff
00000012345Whatever
19834212345
Houses12345837443GGD
00000023456MoreStuff

Estou interessado em linhas onde a substring (7,5) = "12345", então eu gostaria que as linhas 1-4, mas não a linha 5. O que estou propondo é adicionar uma coluna à minha ver "selecione *" que você tem essa substring e, em seguida, indexando com base nisso. Isso faz mais sentido?

Foi útil?

Solução

Supondo que você tenha seus campos neste formato:

00Data0007
000000Data0011
0000Data0015

, você pode fazer o seguinte:

  • Crie uma coluna calculada: ndata AS RIGHT(REVERSE(data), LEN(data) - 4)

    Isso transformará suas colunas no seguinte:

    ataD00
    ataD000000
    ataD0000
    
  • Crie um índice nessa coluna

  • Emitir esta consulta para procurar a string Data:

    SELECT  *
    FROM    mytable
    WHERE   ndata LIKE N'ataD%'
            AND SUBSTRING(ndata, LEN(N'ataD') + 1, LEN(ndata)) = REPLICATE('0', LEN(ndata) - LEN('ataD'))
    

    A primeira condição usará um índice para filtragem grossa.

    O segundo garantirá que todos os personagens principais (que se tornassem os caracteres à direita na coluna computada) não passam de zeros.

Veja esta entrada no meu blog para obter detalhes de desempenho:

Atualizar

Se você só quer um índice em SUBSTRING Sem alterar seu esquema, criar uma visualização é uma opção.

CREATE VIEW v_substring75
WITH SCHEMABINDING
AS
SELECT  s.id, s.data, SUBSTRING(data, 7, 5) AS substring75
FROM    mytable

CREATE UNIQUE CLUSTERED INDEX UX_substring75_substring_id ON (substring75, id)

SELECT  id, data
FROM    v_substring75
WHERE   substring75 = '12345'

Outras dicas

Adicione a coluna calculada para sua mesa e crie um índice nesta coluna.

ALTER TABLE MyTable
Add Column CodeHead As LEFT(Code,Len(Code)-4)

Em seguida, crie um índice sobre isso.

CREATE INDEX CodeHeadIdx ON MyTable.CodeHead

Você pode reformular seus critérios de filtro em termos de uma instrução 'algo%'? (Isso é aplicável a um índice)

Altere a coluna para duas colunas - os dados que você participa e os 4 caracteres extras. Usar partes de uma coluna diminui as coisas como você viu

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top