首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

登录过程 全表扫描解决办法

2012-02-27 
登录过程 全表扫描我写了一个存储过程登录,如下:SETNOCOUNTONGOCREATEPROCEDUREUserLogin@FLAGINTOUTPUT,-

登录过程 全表扫描
我写了一个存储过程登录,如下:
SET   NOCOUNT   ON
GO
CREATE   PROCEDURE   UserLogin
@FLAG   INT   OUTPUT,--返回用户登录的状态
@UserName   NVARCHAR(50),
@Password   NVARCHAR(50)
AS
DECLARE   @Lock   BIT,@TempPass   NVARCHAR(50),@UserID   INT
IF   EXISTS(SELECT   top   1   UserName   FROM   Users   WHERE   UserName=@UserName)
  BEGIN
    SELECT   top   1   @Lock=Lock,@UserID=UserID   FROM   Users   WHERE   UserName=@UserName
    IF   @Lock=0
    BEGIN
      SELECT   top   1   @TempPass=Password   FROM   Users   WHERE   UserID=@UserID
      IF   @Password=@TempPass
    BEGIN
      SET   @FLAG=1   --用户登录成功
    END
    ELSE
    BEGIN
      SET   @FLAG=2   --用户密码错误
    END
  END
  ELSE
  BEGIN
    SET   @FLAG=3   --用户被锁定
  END
END
ELSE
BEGIN
SET   @FLAG=4   --不存在该用户
END
GO
SET   NOCOUNT   OFF

用户表中的数据大概是170万条
其中     UserID是聚集索引,     UserName是非聚集索引
但是系统登录过程中会全表扫描,导致数据的内存占用持续升高,登录时间也比较长
我该怎么修改,能够快速登录?谢谢

[解决办法]
IF EXISTS(SELECT top 1 UserName FROM Users WHERE UserName=@UserName)
BEGIN
SELECT top 1 @Lock=Lock,@UserID=UserID FROM Users WHERE UserName=@UserName
IF @Lock=0
BEGIN
SELECT top 1 @TempPass=Password FROM Users WHERE UserID=@UserID

/*
这里等于执行了三次SELECT。
*/

热点排行