我有两个表:SQL连接查询性能问题
1. [User].[Users]
--------------------------------------------------
|[UserID] | INT (primary key) |
|[Username] | NVARCHAR(50) |
|[IsVerified] | BIT |
|[ModifiedDate] | DATETIME |
--------------------------------------------------
2. [User].[EmailAddresses]
--------------------------------------------------
|[UserID] | INT (foreign key) |
|[EmailAddressID] | INT |
|[EmailAddress] | NVARCHAR(50) |
|[IsPrimary] | BIT |
|[IsVerified] | BIT |
|[ModifiedDate] | DATETIME |
--------------------------------------------------
现在,当我运行此查询,它执行很大:
SELECT
u.[UserID],
u.[Username],
u.[IsVerified],
e.[EmailAddressID],
e.[EmailAddress]
FROM [User].[Users] u
INNER JOIN [User].[EmailAddresses] e
ON e.[UserID] = u.[UserID]
WHERE (@pEmailAddress = e.[EmailAddress])
AND (@pPassword = u.[Password])
但,当我运行此查询,它表现可怕:
SELECT
u.[UserID],
u.[Username],
u.[IsVerified],
e.[EmailAddressID],
e.[EmailAddress],
e.[IsPrimary],
e.[IsVerified],
e.[ModifiedDate]
FROM [User].[Users] u
INNER JOIN [User].[EmailAddresses] e
ON e.[UserID] = u.[UserID]
WHERE (@pEmailAddress = e.[EmailAddress])
AND (@pPassword = u.[Password])
请注意,我只是从这3列中加1(e.[IsPrimary]
,e.[IsVerified]
,e.[ModifiedDate]
),并且它演变成可怕(延迟5-6秒)...
它可能是什么?我没有加入表格吗?是因为我在两个表中都有一些同名的列?
另外,我没有太多的记录...(约20条)...
UPDATE: 我发现 “(。@pPassword = U [密码])” 还删除这个问题,没有它就表现出色,它与索引有什么关系?
这里是执行计划:
我的索引:
- [用户] [用户]:
[用户名](ASC) - 主键
- [用户] [EmailAddresses]
[用户名](ASC),[EmailAddressID](ASC) - 主键
[EmailAddress的] (ASC) - 唯一键
你检查过查询计划?在SQL Server Management Studio中,查询上方有一个按钮,可在执行后运行估计的计划。这将为您提供查询的可视化步骤,并按百分比向您显示查询中最昂贵的部分。它也会建议你应该创建的任何索引。请运行它,让我们知道它回来了。 – Dom
@DomDaFonte谢谢,我添加了一个执行计划... –
没问题。在您的查询计划中,我看到电话字段上有一个聚集索引扫描,尽管我看不到其中的电话号码。 1.为每个表运行sp_spaceused并发送结果。 2.你可以右键单击Ssms中的表,创建一个类似的并为每个表发布ddl? 3.最后是密码字段散列?我可能会在ddl中看到这个,但让我知道。 – Dom