Это эффективный и действенный SQL-запрос или есть лучший способ? - PullRequest
1 голос
/ 15 января 2010

У нас есть таблица паролей, которая ссылается на таблицу пользователей. Записи никогда не удаляются из таблицы паролей, поэтому, если пользователь меняет свой пароль, вставляется новая запись с более поздней датой Created.

В хэш-пароль добавляются различные элементы, наиболее важна дата создания фактической записи.

В хранимой процедуре я извлекаю переменные, чтобы я мог сделать хеш для сравнения. Я действительно хочу сохранить самый последний хэш пароля для пользователя вместе с датой создания записи:

DECLARE @ExistingPassword as varchar(200)
DECLARE @LastChanged as DateTime

SELECT Top 1
    @ExistingPassword = p.PasswordHash,
    @LastChanged = p.Created, 
FROM Password as p
WHERE p.UserId = @UserId
ORDER BY p.Created DESC

Является ли это достаточно эффективным способом получения самого последнего хэша пароля и даты его создания? Есть ли лучший способ сделать это?

Ответы [ 3 ]

2 голосов
/ 15 января 2010

Это эффективно, но я бы удостоверился, что есть индекс:

userId and created 

по соображениям производительности

1 голос
/ 15 января 2010

Я думаю, что это самый быстрый способ сделать это. Я запустил приведенный ниже код, чтобы проверить ваш путь, и единственный другой способ, которым я мог придумать, и ваш путь был немного быстрее. Я также хотел бы упомянуть в таблице с 1 000 000 строк, что время отклика было достаточно быстрым, чтобы SSMS даже не давала мне время выполнения, только 00:00:00. Я видел одну вещь, которая может вам помочь. Если вы можете, поместите некластеризованный индекс в столбец «Создано» и сделайте его сортировку в порядке убывания. Поместите его в порядке убывания будет иметь большое значение, потому что он остановит вас от сканирования таблицы для новейшего Created DateTime. Это действительно может иметь огромное значение.

--Put Rows in TestTable, 3 Rows ID, User_ID, CreatedTime
DECLARE @Count INT
SET @Count = 1

WHILE @Count <= 1000000
BEGIN

INSERT INTO TestTable
VALUES (@Count%3+1,DATEADD(HH,@Count,getdate()))

SET @Count = @Count + 1

END

--Select Your way
SELECT TOP 1
 User_ID
FROM TestTable
WHERE User_ID = 3
ORDER BY CreatedTime DESC

--Select my way
SELECT
 User_ID
FROM TestTable
WHERE User_ID = 3
 and CreatedTime = (SELECT MAX(CreatedTime) FROM TestTable WHERE User_ID = 3)
0 голосов
/ 15 января 2010

По моему личному опыту, вы должны работать с периодом, например StartDate и EndDate. Таким образом, вы можете использовать WHERE getdate() BETWEEN StartDate and EndDate для поиска вашего текущего пароля.

Каждый раз, когда вы добавляете запись только с созданной датой для последующего получения наибольшего количества обновлений, детка, Иисус, плачет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...