我们有一个引用用户表的密码表。记录永远不会从密码表中删除,因此如果用户更改了密码,则会插入具有更新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
这是获取最新密码哈希及其创建日期的合理有效方式吗?有没有更好的方法呢?
答案 0 :(得分:2)
这很有效,但我会确保有一个索引:
userId and created
出于性能原因
答案 1 :(得分:1)
我认为这是最快的方法。我运行下面的代码测试你的方式和我能想到的唯一其他方式,你的方式更快一点。我还想在一个包含1,000,000行的表中提到我的响应时间足够快,以至于SSMS甚至没有给我一个运行时间,只是00:00:00。我确实看到了一件可能对你有帮助的事情。如果可以,请在“已创建”列上放置非聚集索引,并使其按降序排序。将它按降序排列会产生很大的不同,因为它会阻止您对最新创建的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)
答案 2 :(得分:0)
根据我的个人经验,您应该使用句号,例如StartDate
和EndDate
。因此,您可以使用WHERE getdate() BETWEEN StartDate and EndDate
搜索当前密码。
每当您添加一条记录时,只需创建一个日期以便随后进行大多数更新检索,小耶稣就会哭泣。