Приведенный ниже запрос плохо работает с производственной базой данных, но отлично работает с базой данных разработки. Все задействованные таблицы идентичны, одинаковые столбцы, типы данных, индексы и т. д. В рабочей базе данных немного больше записей (возможно, +10%). В SSMS запрос занимает 25-30 секунд, чтобы вернуть какие-либо результаты, ‹1 секунду на копии dev.
Запрос генерируется веб-приложением crm через php-код. (SuiteCrm) База данных производства и разработки находится на одном сервере. Копия dev была создана путем восстановления резервной копии рабочей базы данных. Я вижу различия между двумя планами выполнения, но не понимаю, почему они будут отличаться, если таблицы идентичны. (У меня нет опыта работы с планами выполнения)
SELECT TOP (@topcount) *
FROM (SELECT contacts.id,
LTRIM(RTRIM(ISNULL(contacts.first_name, '') + N' '
+ ISNULL(contacts.last_name, ''))) AS NAME,
contacts.first_name,
contacts.last_name,
contacts.salutation,
accounts.NAME account_name,
jtl0.account_id account_id,
contacts.title,
contacts.phone_work,
jt1.user_name assigned_user_name,
jt1.created_by assigned_user_name_owner,
N'Users' assigned_user_name_mod,
contacts.date_entered,
contacts.date_modified,
contacts.assigned_user_id,
ROW_NUMBER()
OVER (
ORDER BY contacts.date_modified ASC) AS row_number
FROM contacts
LEFT JOIN contacts_cstm
ON contacts.id = contacts_cstm.id_c
LEFT JOIN accounts_contacts jtl0
ON contacts.id = jtl0.contact_id
AND jtl0.deleted = 0
LEFT JOIN accounts accounts
ON accounts.id = jtl0.account_id
AND accounts.deleted = 0
AND accounts.deleted = 0
LEFT JOIN users jt1
ON contacts.assigned_user_id = jt1.id
AND jt1.deleted = 0
AND jt1.deleted = 0
WHERE (( ( LTRIM(RTRIM(ISNULL(contacts.first_name, ''))) LIKE N'abe krebs%'
OR LTRIM(RTRIM(ISNULL(contacts.first_name, ''))) LIKE N'abe krebs%' )
OR ( LTRIM(RTRIM(ISNULL(contacts.last_name, ''))) LIKE N'abe krebs%'
OR LTRIM(RTRIM(ISNULL(contacts.last_name, ''))) LIKE N'abe krebs%' )
OR (( contacts.phone_mobile LIKE N'abe krebs%'
OR contacts.phone_work LIKE N'abe krebs%'
OR contacts.phone_other LIKE N'abe krebs%'
OR contacts.phone_fax LIKE N'abe krebs%'
OR LTRIM(RTRIM(ISNULL(contacts.phone_mobile, '') + N' '
+ ISNULL(contacts.phone_work, '') + N' '
+ ISNULL(contacts.phone_other, '') + N' '
+ ISNULL(contacts.phone_fax, '') + N' '
+ ISNULL(contacts.assistant_phone, ''))) LIKE N'abe krebs%'
OR LTRIM(RTRIM(ISNULL(contacts.assistant_phone, '') + N' '
+ ISNULL(contacts.phone_fax, '') + N' '
+ ISNULL(contacts.phone_other, '') + N' '
+ ISNULL(contacts.phone_work, '') + N' '
+ ISNULL(contacts.phone_mobile, ''))) LIKE N'abe krebs%' ))
OR ( LTRIM(RTRIM(ISNULL(contacts.assistant, ''))) LIKE N'abe krebs%'
OR LTRIM(RTRIM(ISNULL(contacts.assistant, ''))) LIKE N'abe krebs%' )
OR ( contacts.id IN (SELECT bean_id
FROM (SELECT eabr.bean_id
FROM email_addr_bean_rel eabr
JOIN email_addresses ea
ON ( ea.id = eabr.email_address_id )
WHERE eabr.deleted = 0
AND ea.email_address LIKE N'abe krebs%') email_derived) )
OR ( LTRIM(RTRIM(ISNULL(accounts.NAME, ''))) LIKE N'abe krebs%'
OR LTRIM(RTRIM(ISNULL(accounts.NAME, ''))) LIKE N'abe krebs%' )
OR (( contacts.first_name LIKE N'abe krebs%'
OR LTRIM(RTRIM(ISNULL(contacts.first_name, '') + N' '
+ ISNULL(contacts.last_name, ''))) LIKE N'abe krebs%'
OR LTRIM(RTRIM(ISNULL(contacts.last_name, '') + N' '
+ ISNULL(contacts.first_name, ''))) LIKE N'abe krebs%' )) ))
AND contacts.deleted = 0) AS a
WHERE row_number > 0
Я заметил, что производительность запроса в порядке, если я удалю
SELECT TOP (@topcount) * FROM
или удалить
( contacts.id IN
(select bean_id
from (SELECT eabr.bean_id ...
или удалить
OR ( LTRIM(RTRIM(ISNULL(accounts.name,''))) LIKE N'abe krebs%'
OR LTRIM(RTRIM(ISNULL(accounts.name,''))) LIKE N'abe krebs%' )
Что-то еще, что меня беспокоит, это то, что если я попытаюсь запустить советник по настройке базы данных в производственной базе данных, DTA выйдет из строя каждый раз, даже если я выберу одну маленькую таблицу. Существует план обслуживания с Reorganize Index, который запускается каждую ночь. Я проверил все, что мог придумать, и не нашел различий между двумя базами данных. Что может быть причиной низкой производительности и почему только в одной базе данных?
LTRIM(RTRIM(ISNULL(contacts.first_name, ''))
, означает, что условие недопустимо, и почему оно повторяет одни и те же условия несколько раз? - person Martin Smith   schedule 23.03.2015