select value
from persons p join persons2 p2
on left(p.lastname,1) = left(p2.lastname,1)
Servidor SQL. Existe alguma maneira de tornar este SARGable / executado mais rápido? Não consigo criar colunas na tabela de pessoas, mas posso criar colunas na pessoa2.
sql-server
lastchancexi
fonte
fonte
Respostas:
Crie uma visualização nas tabelas com uma coluna computada persistente definida como a
LEFT(lastname, 1)
de cada tabela e compare os valores da coluna persistida calculada.Aqui está uma bancada de testes mostrando como fazer isso:
Aqui, inseriremos alguns dados de amostra:
Aqui está a
SELECT
consulta:E os resultados:
O plano de execução, com apenas duas linhas por tabela (reconhecidamente não muitas linhas!)
fonte
Se a
lastname
coluna estiver indexada em pelo menos uma das tabelas, você também poderá usarLIKE
O plano para isso pode ter uma busca na tabela especificada à esquerda do gosto.
ou seja
ON p.lastname LIKE LEFT(p2.lastname, 1) + '%'
, não seria capaz de usar o índicepersons2
usado anteriormente, mas poderia buscá-lopersons
.A sugestão na outra resposta de indexar uma coluna calculada de ambos os lados é mais flexível, no entanto. Quanto a um plano de loops aninhados, qualquer tabela pode estar no interior e também permitiria a junção de muitos a muitos sem precisar de uma classificação.
fonte
Por acaso, tenho uma tabela com 3.423 linhas e 195 valores distintos
Name
. Vou chamar essa tabelaP
(pessoa) e duplicá-la para criarP2
(pessoa2). Há uma chave primária em cluster exclusiva em uma coluna de ID inteiro. Estou usando o Microsoft SQL Server 2016 (KB3194716) Developer Edition (64 bits) no Windows 10 Pro 6.3 com 32 GB de RAM.Com a consulta base
Recebo 1.5M linhas retornadas em 3200-3300ms (das estatísticas io).
Reescrevendo assim -
decorrido reduz para 50-60ms e o plano é:
Menos linhas são retornadas (3.423) devido ao algoritmo de correspondência. O mesmo plano e contagem de linhas são alcançados alterando a consulta base para
select distinct
.Criando coluna computada indexada
O tempo decorrido cai para 45-50ms.
fonte