2015-10-01 5 views
1
DECLARE @userId INT = 1001 

SELECT 
    , Logins.IP 
    , COUNT(LoginsOther.UserId) AS OtherUsersOnThisIp 
    , MAX(Logins.DateHappened) AS LastUsed 
    , Logins.UserId 
FROM Security.UserLogin AS Logins 
LEFT JOIN Security.UserLogin AS LoginsOther 
    ON LoginsOther.IP = Logins.IP 
AND LoginsOther.UserId <> Logins.UserId 
WHERE Logins.UserId = @userId 
GROUP BY 
    , Logins.IP 
    , Logins.UserId 

Итак, у меня есть таблица UserLogin с колоннами: Id int, DateHappened datetime, IP nvarchar, LoginStatusId int, UserId bigint есть 17769 записей в этой таблице. Задача состоит в том, чтобы использовать используемые IP-адреса пользователем, а OtherUsersOnThisIp должен показывать другой счетчик пользователей, используемый этим IpAddress, когда я запускаю запрос. Счетчик результатов - 22 строки, но это занимает 10-19 секунд. Есть ли способы оптимизировать этот запрос быстрее?Ms SQL Процедура работает медленно

+0

У вас есть какие-либо индексы на таблицах? – lad2025

+0

нет У меня нет индексов – Arkadi

+6

Итак, ваш ответ – lad2025

ответ

0

Такова природа запросов <>, они относительно медленнее. Поскольку вы используете хранимую процедуру, вам может не потребоваться написать один запрос. Вы можете использовать временную таблицу для получения меньшего списка IP-адресов для определенного идентификатора пользователя, а запрос, не равный запросу, на более мелкой таблице может быть более эффективным, чем тот, который используется в строке, с учетом всех вещей в левое соединение.

Смежные вопросы