Основная проблема - либеральное использование функций, особенно в соединении. В тех случаях, когда функции используются таким образом, Sybase не может использовать индексы для этих полей. Возьмите, к примеру, соединение
ON
UPPER(LTRIM(RTRIM(pa.EmployeeCorpId))) = UPPER(LTRIM(RTRIM(emp.corporateId)))
Действительно ли нужны все эти планки и верх?
Если у вас хранятся грязные данные - смешанный регистр, с небольшим начальным и последним пробелом, я советую вам попытаться ужесточить способ хранения и / или обновления данных - не позволяйте таким данным входить. Выполните однократную очистку данных, чтобы все корпоративные идентификаторы были прописными без пробелов или пробелов.
Получив чистые данные, вы можете добавить индекс по столбцу corporateId в таблице EmployeeDataExtract (или перестроить его, если он уже существует) и изменить соединение на
ON
pa.EmployeeCorpId = emp.corporateId
Если вы действительно не можете обеспечить чистоту данных в таблице PendingAuthorization, вам придется оставить перенос функций на этой стороне объединения, но по крайней мере индекс в таблице emp
будет доступен для оптимизатора. рассмотреть.
Использование LIKE с подстановочными символами переднего края делает индексы непригодными, но в вашем случае это может быть неизбежным.
Похоже, что поле PendingAuthorization.RequestorDate используется для выбора данных только для одной даты - той, которая указана в @reqDate. Вы можете преобразовать эту часть предложения WHERE в запрос диапазона, тогда можно использовать индекс в поле даты.
Чтобы сделать это, вы должны использовать только часть даты @reqDate (игнорируя время суток), а затем извлекать ее из этой «даты + 1». Это будут используемые значения. Много ли это поможет, зависит от того, сколько дней RequestorDate присутствует в таблице PendingAuthorization.