相关疑难解决方法(0)

优化器未选择索引联合计划

为什么下面的查询很慢?

select count(*) 

from [dbo].[mt_dispatch_link] 
   , [dbo].[_mt_dispatch] [_mt_dispatch]

where   (mt_dispatch_link.contract_id_1 = _mt_dispatch.contract_id 
     and mt_dispatch_link.dispatch_id_1 = _mt_dispatch.dispatch_id)

   or   (mt_dispatch_link.contract_id_2 = _mt_dispatch.contract_id 
     and mt_dispatch_link.dispatch_id_2 = _mt_dispatch.dispatch_id)
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

这需要 10 多分钟,然后我倾向于在那个时候停止它。我的问题更多是关于如何理解查询计划。

查看查询计划,我可以看到底部聚集索引扫描返回大约 250000 条记录,但成本为 0% 并且它正在放入临时表中。

顶部索引扫描大约是 25000 条记录。

但是 95% 的成本来自嵌套连接。我应该从中得出什么结论?

上面的查询计划显示了两次索引扫描,是说它在做 25000 + 250000 次索引扫描,还是说它在做 25000 * 250000 次索引扫描?

如果我将查询更改为此(添加FORCESEEK):

select count(*) 

from [dbo].[mt_dispatch_link] 
   , [dbo].[_mt_dispatch] [_mt_dispatch] 

    WITH (FORCESEEK)

where   (mt_dispatch_link.contract_id_1 = _mt_dispatch.contract_id 
     and mt_dispatch_link.dispatch_id_1 = _mt_dispatch.dispatch_id)

   or   (mt_dispatch_link.contract_id_2 = _mt_dispatch.contract_id 
     and mt_dispatch_link.dispatch_id_2 = _mt_dispatch.dispatch_id)
Run Code Online (Sandbox Code Playgroud)

我最终得到了一个更好的计划,查询立即运行:

在此处输入图片说明

我在两个表上运行了更新统计信息。可惜没修好。表设计不是很好,所以我认为 SQL Server 并不真正理解,因此提出了一个糟糕的查询计划。有关 …

sql-server optimization execution-plan

7
推荐指数
1
解决办法
366
查看次数

在 INNER JOIN 内改进 OR

我有这个查询。这是第二个查询。第一个是在子查询之外使用左侧/或外部,查询计划很糟糕。(用完整的语法编辑了问题):

https://www.brentozar.com/pastetheplan/?id=HJEioh56N

nested loop (inner join)在查询计划中有 97%。

我确定问题出OR在第二个连接内部,因为我在这里和那里更改了一些东西,我可以摆脱它们,但我想确定处理此类数据的最佳方法是什么。所有这些表也有数百万行。

表定义:

CREATE TABLE [DBO].[TABLE1](
    [F1] [int] NOT NULL,
    [F1] [varchar](16) NOT NULL,
    [F3] [money] NOT NULL,
    [F4] [money] NOT NULL,
Run Code Online (Sandbox Code Playgroud)

我知道创建了这个索引:

在 DBO.TABLE1 ( F1, F2 ) 上创建非聚集索引 IX_TB1

该索引搜索现在是 14%,但HASH MATCH成本为 82%。

performance sql-server sql-server-2008-r2

2
推荐指数
1
解决办法
172
查看次数