首页 > 数据库 >【Oracle】使用case when语句导致SQL查询速度很慢的情况

【Oracle】使用case when语句导致SQL查询速度很慢的情况

时间:2023-07-04 22:55:59浏览次数:36  
标签:case 语句 view123 tt when SQL select

【Oracle】使用case when语句导致SQL查询速度很慢的情况

很多时候会使用到case when语句去对SQL的多种情况进行处理,decode也用的多,但是通常decode会用在固定值的数据处理上,而case when因为可以在其中增加语句,所以比较复杂的时候会用到

同时因为case when的结果集是从上到下的顺序进行,及优先级是自上而下的减少,例如下面的语句输出结果就是1

select 
case when 1=1 then 1
when 2=2 then 2
end as flag
from dual 

那么如果是复杂一点的情况呢,比如这种比较时间的情况,速度还是挺快的

select 
case when ((select count(1) from dual where sysdate between to_date('2023-10-01','yyyy-mm-dd')and to_date('2023-10-03','yyyy-mm-dd')) > 0) then 1
when ((select count(1) from dual where sysdate between to_date('2023-07-01','yyyy-mm-dd')and to_date('2023-10-01','yyyy-mm-dd')) > 0) then 2
end as flag
from dual 

那么再复杂一点的情况呢,比如当table1中的tt字段查询view123中的tt字段符合情况

select 
case when ((select count(1) from view123 where table1.tt = view123.tt) > 0) then 1
when ((select count(1) from view123 where table1.tt = view123.tt) = 0) then 2
end as flag
from table1 

会发现突然速度就下来了,但是如果找到数据单独执行这个语句,可能0.01秒内就可以执行出来,但是放在整个SQL中,可能会导致几十秒

select count(1) from view123 where table1.tt = view123.tt

这种很有可能因为case when的语句过于复杂,导致本来应该走索引的时候没走,可能还创建了临时表导致更加的慢

下午遇到的情况是一个视图,是第三层视图中的上层,在其中对某些日期进行条件分析,不同条件数据不同,同时还要对一个关联性不强的表进行一个数据集查询,在增加了case when以后,发现本来是十多秒的查询变成了五分钟才能出现结果,且在检查测试后发现是case when中的连表关系查询导致的

但是不能不用,因此,将这部分数据单独取出,放在第二层视图中作为一个变量,这样只使用一次的情况下,就增加了十秒的速度,还能接受,如果要彻底优化,最好直接将这个数据作为一个标识放在需要的表中,直接查表会快很多

标签:case,语句,view123,tt,when,SQL,select
From: https://www.cnblogs.com/jokingremarks/p/17527292.html

相关文章

  • postgresql大表分批次删除
    [root@localhost~]#cat/root/delete_big_table.sh#!/bin/bash#$1对应表名,$2对应主键列,$3对应一次删除多少行i=`psql-h127.0.0.1-Upostgres-dtenant_1011046-c"selectceil(count(1)/${3}::float)from${1}whereplatcreatetime<'2023-04-3023:59:59'......
  • navicat添加触发器实现禁止删除指定表的记录(mysql)
     选中指定表,右键选择设计表 在定义那儿填写语句 BEGINdeclaremsgvarchar(255);setmsg="禁止删除操作";SIGNALSQLSTATE'HY000'SETMESSAGE_TEXT=msg;END......
  • MySQL中创建触发器需要执行哪些操作?
    什么是触发器触发器,就是一种特殊的存储过程。触发器和存储过程一样是一个能够完成特定功能、存储在数据库服务器上的SQL片段,但是触发器无需调用,当对数据库表中的数据执行DML操作时自动触发这个SQL片段的执行,无需手动调用。触发器的这种特性可以协助应用在数据库端确保数据的完整......
  • 搞定MySQL,都是干货
    MySQL数据库简介MySQL近两年一直稳居第二,随时有可能超过Oracle计晋升为第一名,因为MySQL的性能一直在被优化,同时安全机制也是逐渐成熟,更重要的是开源免费的。MySQL是一种关系数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高......
  • 关于mysql存储引擎、管理和维护概述
    数据库的存储引擎是数据库的底层软件组件,数据库管理系统使用数据库引擎进行增删查改的操作。mysql的核心就是数据库引擎。mysql5.7支持的存储引擎有innoDBMyISAMMemory可以通过showengines。InnoDB存储引擎:1.InnoDB给mysql提供了具有提交,回滚,崩溃恢复的功能的事务能力的安......
  • SQL优化还凭经验?这个工具能帮你智能优化SQL
    前言SQL优化是程序开发中经常遇到的问题,尤其是在程序规模不断扩大的时候。SQL的好坏不仅制约着程序的规模,影响着用户的体验,甚至威胁着信息的安全。我们经常听到说哪家平台挂了,哪家网站被黑了,但我们不知道,其实这些平台挂了、被黑了的原因很多时候在于SQL不够健壮。SQL不够健壮......
  • 数据库问题之“字符编码问题 Cause: java.sql.SQLException: Incorrect string value:
     1)表1和表2的产品名称[数据库字段]字符编译方式不一致①问题 org.springframework.jdbc.UncategorizedSQLException:Errorupdatingdatabase.Cause:java.sql.SQLException:Incorrectstringvalue:'\xF0\x9F\x8E\x81\xE7\x88...'forcolumn'product_name'atr......
  • Mysql索引为什么选择B+树
    前言谈到索引,大家并不陌生。索引本身是一种数据结构,存在的目的主要是为了提高数据查询效率,最大程度减少磁盘IO。那么MysqlInnoDB存储引擎为什么选择B+树,而不是二叉树、B树,Hash等数据结构呢?使用二叉树会有哪些问题?了解过二叉树的都知道,一个节点只能有两个子节点,一个子节点只能......
  • 图解 MySQL 索引:B-树、B+树,终于搞清楚了
    看了很多关于索引的博客,讲的大同小异。但是始终没有让我明白关于索引的一些概念,如B-Tree索引,Hash索引,唯一索引….或许有很多人和我一样,没搞清楚概念就开始研究B-Tree,B+Tree等结构,导致在面试的时候答非所问!索引是什么?索引是帮助MySQL高效获取数据的数据结构。索引能干什......
  • SQL SERVER中的行传列
    --建表语句IFEXISTS (SELECTTABLE_NAMEFROMINFORMATION_SCHEMA.TABLESWHERETABLE_NAME='SCORE_INFO')DROPTABLESCORE_INFO;CREATETABLESCORE_INFO( SCORE_ID INT IDENTITY(1,1)NOTNULL, USER_NAME VARCHAR(20) NOTNULL, SCORE_NAME VAR......