sqlserver not in 语句使程充崩溃

网络编程 2025-03-13 04:41www.168986.cn编程入门

之前,我总以为优化数据库查询只在百万级以上的大数据表中才有意义。这次经历彻底改变了我的看法。

我们有两张表:组织架构表(Organise)和工资发放历史记录表(WagePerMonthHis)。这两张表通过Organise表的Item_id和WagePerMonthHis表的OrgIdS进行关联。Organise表(简称O表)有大约6000条记录,包含11个字段;而WagePerMonthHis表(简称W表)则拥有惊人的125万条记录,包含多达25个字段。

最初,我们尝试使用以下查询语句来获取组织架构层级为2但不在W表中的记录:

```sql

select OrgId as 公司编码, OrgName as 公司名称

from Organise

where OrgLev=2 and item_id not in (select OrgidS from WagesPerMonthHis where WagesYear='2010' and WagesMonth='01' Group by OrgidS,OrgNameS)

order by Orgid

```

这条语句的执行时间长达33秒,尽管服务器配置相当高级,拥有16个核心、4个CPU和24G内存。我们曾误以为性能问题出在子查询上,但单独执行子查询时,其执行速度却非常快,大约不到2秒。问题的症结在于“not in”这个关键词导致的全表扫描。这种情况甚至导致页面失去响应,关键功能无法正常使用。

尝试使用“not exist”语句并未显著提高性能。我们对查询语句进行了重新优化:

```sql

select a.OrgId as 公司编码, a.OrgName as 公司名称, a.item_id

from Organise a

left outer join (select distinct b.OrgIdS from WagesPerMonthHis b where WagesYear='2010' and WagesMonth='01') as b

on a.item_id = b.OrgidS

where a.OrgLev = 2 and b.OrgIdS is Null

order by 公司编码

```

通过改用左外连接(其实左连接也可以),整个语句的执行速度惊人地缩短至毫秒。33秒与毫秒的差距,是很多人难以想象的。这种优化带来的性能提升是显著的,使我们的应用程序更加流畅、响应更快。

Copyright © 2016-2025 www.168986.cn 狼蚁网络 版权所有 Power by