这是一个有效且高效的SQL查询还是有更好的方法?

时间:2010-01-15 01:53:09

标签: sql-server performance stored-procedures

我们有一个引用用户表的密码表。记录永远不会从密码表中删除,因此如果用户更改了密码,则会插入具有更新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 个答案:

答案 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)

根据我的个人经验,您应该使用句号,例如StartDateEndDate。因此,您可以使用WHERE getdate() BETWEEN StartDate and EndDate搜索当前密码。

每当您添加一条记录时,只需创建一个日期以便随后进行大多数更新检索,小耶稣就会哭泣。