select value
from persons p join persons2 p2
on left(p.lastname,1) = left(p2.lastname,1)
SQL Server. Czy jest jakiś sposób, aby ten SARGable / działał szybciej? Nie mogę tworzyć kolumn na tabeli osób, ale mogę tworzyć kolumny na osobach2.
sql-server
lastchancexi
źródło
źródło
Odpowiedzi:
Utwórz widok na tabele z utrwaloną wyliczoną kolumną zdefiniowaną jako
LEFT(lastname, 1)
tabela każdej tabeli, a następnie porównaj wyliczone wartości utrwalonej kolumny.Oto stanowisko testowe pokazujące, jak to zrobić:
Tutaj wstawimy przykładowe dane:
Oto
SELECT
zapytanie:A wyniki:
Plan wykonania, zawierający tylko dwa wiersze na tabelę (co prawda nie wiele wierszy!)
źródło
Jeśli
lastname
kolumna jest indeksowana w co najmniej jednej z tabel, możesz również użyćLIKE
Plan tego może mieć wyszukiwanie w tabeli określonej po lewej stronie podobnego.
tzn.
ON p.lastname LIKE LEFT(p2.lastname, 1) + '%'
nie byłby w stanie skorzystać z indeksupersons2
wykorzystanego powyżej, ale mógłby go wyszukaćpersons
.Sugestia zawarta w drugiej odpowiedzi dotyczącej indeksowania kolumny obliczeniowej po obu stronach jest jednak bardziej elastyczna. Jeśli chodzi o plan zagnieżdżonych pętli, każda tabela może znajdować się wewnątrz, a także pozwoliłaby na połączenie wielu do wielu bez konieczności sortowania.
źródło
Zdarza mi się mieć tabelę z 3423 wierszami i 195 odrębnymi wartościami
Name
. Zadzwonię do tej tabeliP
(osoba) iP2
powielę ją, aby utworzyć (osoba2). W kolumnie identyfikatora liczb całkowitych znajduje się unikalny klastrowany klucz podstawowy. Używam Microsoft SQL Server 2016 (KB3194716) Developer Edition (64-bit) na Windows 10 Pro 6.3 z 32 GB pamięci RAM.Z zapytaniem podstawowym
Dostaję 1,5 mln wierszy zwróconych w 3200-3300 ms (ze statystyk io).
Ponowne pisanie w ten sposób -
Upłynęło, zmniejsza się do 50-60 ms, a plan jest:
Zwrócono mniej wierszy (3423) z powodu algorytmu dopasowywania. Ten sam plan i liczbę wierszy uzyskuje się, zmieniając zapytanie podstawowe na
select distinct
.Tworząc indeksowaną, obliczoną kolumnę
Upływający czas spada do 45-50ms.
źródło