为什么以下查询在性能方面如此糟糕

Mit*_*hir 2 performance sql-server query-performance

问完这个问题后,我开始思考为什么某个查询会出现所有问题。

简而言之,有一个查询需要 500 毫秒,我运行了一些执行计划并应用了推荐的索引,但它只截断了大约 50-60 毫秒。

再次运行后,我发现以下查询(发生在多个位置)真的很慢:

SELECT @TempCardNumber = CardNumber 
FROM Cards 
WHERE (CardNumber=@CardNumber or FullCardNumber=@CardNumber)
Run Code Online (Sandbox Code Playgroud)

当我把它改成

SELECT @TempCardNumber = CardNumber 
FROM Cards 
WHERE (CardNumber=@CardNumber)
Run Code Online (Sandbox Code Playgroud)

它跑得超级快,甚至删除索引也没有太大关系,让我相信这是主要的瓶颈,但我不明白..这有什么问题?

gbn*_*gbn 9

OR 当您使用不同的列时,通常不是“SARGable”

也就是说,您可以针对 CardNumber 或 FullCardNumber 搜索进行优化,每列上都有一个索引,但不能同时对两列进行优化。这是一种“寻求”。

列上的索引不起作用,因为它是OR:必须检查每一行的值。这是扫描。

如果条件为AND,则 SQL Server 可以在 findng CardNumber 之后对 FullCardNumber 进行残留查找。Seek 之后基本上是第二次查找。

无论如何,试试这个来删除OR扫描并有 2 个单独的有效搜索

SELECT
  @TempCardNumber = CardNumber 
FROM
    (
    SELECT CardNumber 
    FROM Cards 
    WHERE CardNumber = @CardNumber
    UNION -- removed dupes
    SELECT CardNumber 
    FROM Cards 
    WHERE FullCardNumber = @CardNumber
    ) X
Run Code Online (Sandbox Code Playgroud)

请注意,查询假设您只得到一行:这是打算吗?