我写了一个存储过程登录,如下:
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 [email protected])
BEGIN
SELECT top 1 @Lock=Lock,@UserID=UserID FROM Users WHERE [email protected]
IF @Lock=0
BEGIN
SELECT top 1 @TempPass=Password FROM Users WHERE [email protected]
IF @[email protected]
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 [email protected])
BEGIN
SELECT top 1 @Lock=Lock,@UserID=UserID FROM Users WHERE [email protected]
IF @Lock=0
BEGIN
SELECT top 1 @TempPass=Password FROM Users WHERE [email protected]
/*
这里等于执行了三次SELECT。
*/