sqlserver not in 语句使程充崩溃
之前,我总以为优化数据库查询只在百万级以上的大数据表中才有意义。这次经历彻底改变了我的看法。
我们有两张表:组织架构表(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秒与毫秒的差距,是很多人难以想象的。这种优化带来的性能提升是显著的,使我们的应用程序更加流畅、响应更快。
编程语言
- sqlserver not in 语句使程充崩溃
- 在html中引入外部js文件,并调用带参函数的方法
- 如何最准确地统计在线用户数?
- 如何使用php输出时间格式
- 异步安全加载javascript文件的方法
- 在Asp.net网页上写读Cookie的两种不同语法介绍
- 解析如何在PHP下载文件名中解决乱码的问题
- php显示指定目录下子目录的方法
- 什么是eclipse,eclipse的意思解析
- vue滚动tab跟随切换效果
- VS2013的Browser Link引起的问题
- php使用函数pathinfo()、parse_url()和basename()解析URL
- vue 之 .sync 修饰符示例详解
- JS 数字转换为大写金额的简单实例
- 安装vue-cli的简易过程
- 详解idea切换git账号的两个方法