执行计划问题

seb*_*eid 0 performance sql-server query-performance

我有这个查询运行了很长时间

    (@P0 nvarchar(4000))

select emaildmo0_.Id as Id7_
    ,emaildmo0_.CreatedDate as CreatedD2_7_
    ,emaildmo0_.EmailAddress as EmailAdd3_7_
    ,emaildmo0_.EmailType_Id as EmailType4_7_
    ,emaildmo0_.isPreferedEmail as isPrefer5_7_
    ,emaildmo0_.ProfileId as ProfileId7_
    ,emaildmo0_.UpdatedDate as UpdatedD6_7_
from dbo.Email emaildmo0_
where emaildmo0_.EmailAddress = @P0
Run Code Online (Sandbox Code Playgroud)

这是执行计划

在此处输入图片说明

我的第一个问题为什么是索引扫描而不是索引查找

ExecutionPlan.xml 中的这两行

        <Warnings>
          <PlanAffectingConvert ConvertIssue="Cardinality Estimate" Expression="CONVERT_IMPLICIT(nvarchar(255),[emaildmo0_].[EmailAddress],0)" />
          <PlanAffectingConvert ConvertIssue="Seek Plan" Expression="CONVERT_IMPLICIT(nvarchar(255),[emaildmo0_].[EmailAddress],0)=[@P0]" />
        </Warnings>
Run Code Online (Sandbox Code Playgroud)

你能帮我解释一下这个警告是什么意思吗?如果有任何建议来调整这个查询

Aar*_*and 7

这意味着应该定义参数以匹配基础列的数据类型 - 当前参数是 nvarchar(4000) 但它应该是 varchar (看起来像 255 但你应该检查表)。

这是否真的使您的查询变慢或导致错误的计划更难确定。但是使这两个定义匹配肯定不会使情况变得更糟。

如果您无法更改参数数据类型,要么获得更好的 ORM,要么作为最后的手段更改列。