select value
from persons p join persons2 p2
on left(p.lastname,1) = left(p2.lastname,1)
SQL Server. Есть ли способ сделать этот SARGable / работать быстрее? Я не могу создать столбцы на персонале таблицы, но я могу создать столбцы на персоны2.
sql-server
lastchancexi
источник
источник
Ответы:
Создайте представление для таблиц с сохраненным вычисляемым столбцом, определенным как
LEFT(lastname, 1)
для каждой таблицы, затем сравните вычисленные постоянные значения столбца.Вот тестовый стенд, показывающий, как это сделать:
Здесь мы вставим пример данных:
Вот
SELECT
запрос:И результаты:
План выполнения, только две строки в таблице (правда, не много строк!)
источник
Если
lastname
столбец проиндексирован хотя бы в одной из таблиц, вы также можете использоватьLIKE
План для этого может иметь поиск на столе, указанном слева от подобного.
т. е.
ON p.lastname LIKE LEFT(p2.lastname, 1) + '%'
не сможет использовать индекс,persons2
который использовался выше, но может искать егоpersons
.Однако предложение в другом ответе об индексировании вычисляемого столбца с обеих сторон является более гибким. Что касается плана вложенных циклов, то любая таблица может быть внутри, и это также позволило бы объединить слияние многих-многих без необходимости сортировки.
источник
У меня есть таблица с 3423 строками и 195 различными значениями в
Name
. Я назову эту таблицуP
(person) и продублирую ееP2
(person2). В столбце с целочисленным идентификатором имеется уникальный кластерный первичный ключ. Я использую Microsoft SQL Server 2016 (KB3194716) Developer Edition (64-разрядная версия) в Windows 10 Pro 6.3 с 32 ГБ ОЗУ.С базовым запросом
Я получаю 1,5 млн строк, возвращаемых за 3200-3300 мс (из статистики io).
Переписав таким образом -
истекло, сокращается до 50-60мс, и план:
Из-за алгоритма сопоставления возвращается меньше строк (3423). Тот же план и количество строк достигается путем изменения базового запроса на
select distinct
.Создав индексированный, вычисляемый столбец
Прошедшее время падает до 45-50 мс.
источник