SQL疑难杂症【5 】大量数据查询的时候要考虑结果为空的情况
2023-09-14 08:58:39 时间
最近几天怪事儿出奇的多,同一个工单、同一个产品,在A线可以正常生产,但是在H线死活都无法生产,系统直接提示TimeOut,监控发现有一条SQL语句执行缓慢,Copy出来仔细查看,很简单的一条语句,如下:
SELECT TOP 1 LOT_ID FROM QS_WIP(NOLOCK) WHERE STATION_ID='FB808A1E-5758-43B3-B243-8C728ACC5264' AND ROUTE_STEP_ID='29F813DC-2204-4413-9FB6-0DBF1982F33F' order by END_TIME desc
看似简单的SQL语句,却执行了10多S还没结果出来,表中STATION_ID与ROUTE_STEP_ID都是有索引的,理论上不应该啊,于是还是等着SQL执行完毕(当时没截图,要1分钟,不敢再次执行了),发现结果是空,如下图所示:
我们再看另一条SQL语句,跟上面的语句唯一不同的就是不同的STATION_ID,如下:
SELECT TOP 1 LOT_ID FROM QS_WIP(NOLOCK) WHERE STATION_ID='40D83B4A-9BC3-4FE0-BE53-65685402AB2E' AND ROUTE_STEP_ID='29F813DC-2204-4413-9FB6-0DBF1982F33F' order by END_TIME desc
这条语句执行速度很快,如下:
结果返回了实际的数据,难道是数据为空的原因吗?那好,我手动增加一条符合条件的H线数据,增加数据之后,再次执行第一条SQL,如下:
结果显示,1s的时间就出来,看来真是这个问题导致。
分析一下结果:
有一个比较重要的因素,那就是目标表中的数据量比较大,有100000000+的记录,虽然在查询的时候加上了TOP 1,但是在没有符合条件的数据的情况下,将对整个表进行全表扫描,也就是对100000000+的记录进行扫描,那一定会很慢,即便加了索引也一样,因为找不到符合条件的数据,那就一直找,直到找到数据为止;
相反,只要有一条符合条件的数据,那么TOP 1的时候找到了这一条符合条件的记录,将不再继续扫描表中其它的数据,所以速度快。
相关文章
- 大数据必学Java基础(九十四):SQL注入攻击
- SQL数据分页查询的方法
- 必须会的SQL语句(六) 数据查询
- Oracle中简单查询、限定查询、数据排序SQL语句范例和详细注解
- SQLSever查询第11行到第25行的数据,sql分页查询 ( offset 10 rows fetch next 15 rows only)详解数据库
- 如何使用SQL Server导出数据(sqlserver导出数据sql)
- 掌握Oracle动态SQL拼接技巧,实现查询性能优化(oracle动态sql拼接)
- 日志探索Linux查看SQL数据库日志(linux查看sql)
- 快速掌握Oracle的创建表SQL语句(oracle创建表sql)
- 轻松使用Oracle实现SQL数据导入(oracle导入sql)
- 查询驾驭SQL Server外联查询:实现数据连接自如(sqlserver外联)
- 连接Oracle数据库,使用SQL进行查询(sql连oracle)
- MySQL实现SQL数据同步的方法探究(mysql同步sql)
- SQL”SQLserver加入NoSQL时代:实现数据存储的新契机“(SQLserver的No)
- MySQL SQL优化,提高查询效率。(mysql中的sql优化)
- 接SQL Server左外连接技术:实现多表数据查询功能(sqlserver左外连)
- 的数据查看SQL Server中过去7天数据的报表(sqlserver前7天)
- SQL数据库高效读写:mssql实践分享(频繁读写数据 mssql)
- 学习MySQL如何使用SQL语句在MySQL中创建表(mysql中创建表sql)
- MySQL 上下级 SQL 查询技巧(mysql 上下级sql)
- 利用Oracle SQL实现双表全关联查询(oracle两表全关联)
- Oracle与SQL连接之路追求数据的完美结合(oracle与sql链接)
- 极速提升Oracle SQL进程效率(oracle sql进程)
- Oracle SQL让你的数据不再缺位(oracle sql补位)
- Oracle SQL 实现数据传值(oracle sql传值)
- 跨服务器查询导入数据的sql语句