代码之家  ›  专栏  ›  技术社区  ›  Damovisa

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

  •  1
  • Damovisa  · 技术社区  · 16 年前

    我们有一个引用用户表的密码表。记录永远不会从密码表中删除,因此如果用户更改了密码,则会使用更新的新条目 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 回复  |  直到 16 年前
        1
  •  2
  •   Sparky    16 年前

    这是有效的,但我会确保在以下方面有索引:

    userId and created 
    

    出于性能原因

        2
  •  1
  •   Ben Hoffman    16 年前

    我认为这是最快的方法。我运行下面的代码来测试您的方法,我唯一能想到的其他方法是,您的方法有点快。我还想在一个有1000000行的表中提到,我得到的响应时间足够快,以至于SSMS甚至没有给我一个运行时间,只有00:00:00。我确实看到了一件可以帮助你的事情。如果可以,请在已创建的列上放置非聚集索引,并使其按降序排序。按降序排列会有很大的不同,因为它会阻止您对最新创建的日期时间进行表扫描。这真的会有很大的不同。

    --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)
    
        3
  •  0
  •   Rubens Farias    16 年前

    根据我的个人经验,你应该在一段时间内工作,比如 StartDate EndDate .因此,您可以使用 WHERE getdate() BETWEEN StartDate and EndDate 搜索当前密码。

    每次你添加一个记录,只是为随后的大多数更新检索创建一个日期,婴儿耶稣哭。