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)
它跑得超级快,甚至删除索引也没有太大关系,让我相信这是主要的瓶颈,但我不明白..这有什么问题?
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)
请注意,查询假设您只得到一行:这是打算吗?
| 归档时间: |
|
| 查看次数: |
256 次 |
| 最近记录: |