2013-03-15 3 views
-1

У меня этот запрос работает, но он очень медленный. Я новичок в SQL, поэтому любая помощь с Tuning будет оценена по достоинству.SQL-запрос работает медленно

SELECT 
    REPLACE(LoweredUserName,'@domain.com','') as Name, 
    COUNT(LoweredUserName) as Numb 
FROM 
    aspnet_Users 
JOIN 
    WarrantyRegistration ON CHARINDEX('Added by ' + aspnet_Users.LoweredUserName, 
WarrantyRegistration.Comment) > 0 
GROUP BY 
    aspnet_Users.LoweredUserName 
ORDER BY 
    LoweredUserName ASC 

Благодаря

+3

** Вам нужно показать нам определения таблиц и индексов. ** Для диагностики медленных запросов требуются полные определения таблиц и индексов, а не просто описание или парафраз. Возможно, ваши таблицы плохо определены. Возможно, индексы создаются неправильно. Возможно, у вас нет указателя на тот столбец, который, как вы думали, вы делали. Не видя определения таблиц и индексов, мы не можем сказать. Если вы знаете, как сделать «EXPLAIN» или получить план выполнения, поместите результаты в вопрос. –

+0

@AndyLester операции не являются SARGable, поэтому не имеет значения, что такое индексы. –

ответ

2

Если в таблице WarrantyRegistration есть идентификатор пользователя, который добавил эту регистрацию, вы должны присоединиться к ID, а не присоединяться к CHARINDEX(). Если вы не можете подключиться к внешнему ключу, вам следует серьезно подумать об изменении вашей схемы, чтобы вы могли, если это возможно.

0

Вы выполняете перекрестное соединение из aspnet_Users * и * WarrantyRegistration, несмотря на то, что это не может быть очевидным, так как каждая WarrantyRegistration записи должна B поиска (снова) для каждой записи aspnet_Users.

Можете ли вы создать индекс на WarrantyRegistration.Comment * для поддержки этого запроса?