超级慢,只要加上这个条件查询时。为什么,该如何解决?

问题描述

SELECT ID,CODE FROM V_PORT_CS WHERE CODE = '//1'    -- 40.11 SECONDSSELECT ID,NAME FROM V_PORT_CS WHERE NAME = '1'     --0.078 SECONDS如上:只要加上CODE 这个字段,去查V_PORT_CS这个视图就会超级慢(40.11秒),用其他字段都不会有问题,比如用name等去查。以下是其他相关信息:1.   SELECT COUNT(*) FROM V_PORT_CS;    -- 322212该视图共32万条数据2.视图定义create or replace view v_port_cs as(select   ID,   MBID,   MRID,   MSID,   coderule(CODE,ID,'E_NPORT') AS CODE,   NAME,   RESOURCEIDfrom e_nportwhere kindcode in (-99,1,2,3,6,200,101,9,108,4,8,7));  3.  函数定义create or replace function coderule(object_code in varchar2,tableid in number,tablename in varchar2) return varchar2 is  rvalue varchar2(1000);  eqcode varchar2(1000);  efcode varchar2(1000);  efidx   number;  modulecode varchar2(1000);  begin       if tablename='E_NPORT' then         begin       select efid into efidx from E_NPORT where id=tableid;       select (select name from e_equipment where id=e.object_id) into eqcode from e_eqframe e where e.id=efidx;       EXCEPTION              when others then              dbms_output.put_line(sqlerrm);       end;       begin       select (select code from e_eqframe where id=e.efid) into efcode from E_NPORT e where e.id=tableid;       EXCEPTION              when others then              dbms_output.put_line(sqlerrm);       end;       begin       select (select code from e_module where id=e.moduleid) into modulecode from E_NPORT e where e.id=tableid;       EXCEPTION              when others then              dbms_output.put_line(sqlerrm);       end;       if modulecode IS NULL then          rvalue:=eqcode||'/'||efcode||'/'||object_code;       end if;       if modulecode IS NOT NULL then          rvalue:=eqcode||'/'||efcode||'/'||modulecode||'/'||object_code;       end if;      end if;    return rvalue;end coderule;5 对于 视图中的name,code 等均做了索引以上。求解!   问题补充:&nbsp;&nbsp; 首先我想知道的是原因,为什么会这么慢。<br />&nbsp;&nbsp; 个人猜测,是否是因为视图不是真实存在的,去查询视图时,数据库要先去创建该视图,就是因为这个创建的过程而导致慢下来了

解决方案

因为coderule里是一个完整的逻辑,如果其中的任意一个逻辑都是需要一个固定的时间n的话,那么23W条数据就至少是23W*n秒的时间,当然会很慢。在正常的逻辑中,只进行一次23W行的扫描就会花去相当的时间了,所以通常我们会用上索引,那么对当前列的数据可以进行非常快速的查询了。而coderule函数由于系统在进行语法分析时无法对其进行优化,那么会进行一次全表扫描,如果32万行数据都需要进行一次coderule()操作的话,后果可想而知。所以给你的建议是将逻辑提到外面来,那么分成多个SQL语句,但是如果每个SQL的操作都很简单,并且能被数据库识别,那么每个操作都会很快。在你的上述逻辑上,只要写成一个存储过程,那么只需要查询一次原来的表e_nport,然后根据游标操作,就会大大加块查询速度了
解决方案二:
你这个逻辑很复杂了,楼上的方法比较直接。或者换成过程,写临时表。
解决方案三:
无解想办法将function方法体的逻辑提到外面来。

时间: 2024-10-28 01:03:38

超级慢,只要加上这个条件查询时。为什么,该如何解决?的相关文章

mysql-Mysql 条件查询时记录的唯一id,有多个id并且已知的,该怎么查询

问题描述 Mysql 条件查询时记录的唯一id,有多个id并且已知的,该怎么查询 已知id的值,比如 int pId[100]; CString sql; sql.Format("select * from table_name where id!=%d and id!=%d and id!=%d .....",pId[0],pId[1],pId[2],.....); 难道是这样写吗? 解决方案 mysql多ID查询查询多个ID的数据 解决方案二: 用not in试试,这么写; sel

lazy-Spring data JPA使用CriteriaQuery进行不定条件查询时,发起了多次查询

问题描述 Spring data JPA使用CriteriaQuery进行不定条件查询时,发起了多次查询 //PlatformSecurityUser为账户信息实体,和用户基本信息platformSysUser存在一对一的映射关系,fetchType为lazy //在获取账户信息的同时,希望一次获取用户基本信息-platformSysUser import javax.persistence.*; import javax.persistence.criteria.*; import java.

thinkPHP使用post方式查询时分页失效的解决方法_php实例

本文实例讲述了thinkPHP使用post方式查询时分页失效的解决方法.分享给大家供大家参考,具体如下: 昨天晚上一直没有解决的php项目中的bug,就在刚才终于搞定,在这里还需要感谢各位大神给的帮助! 具体问题描述 最近遇到一个非常棘手的问题,也是因为刚入手thinkphp.在做项目的过程中,因为需要非常多的查询条件,如果以get方式提交表单的话,会因为url长度限制而报错,所以必须使用post方式提交表单数据,但是在分页的过程中,遇到了问题,因为thinkphp自带的分页是以a标签的形式,进

MVC开发时使用MVCPager条件查询时遇到第二页点击出现空白或者无条件查询结果!问题已经解决了,但具体为什么要这样,不明白!跪求大神解释!

问题描述 首先按照官方的说明需要使用@{Html.RegisterMvcPagerScriptResource();}这个我在默认layout里面已经添加了,如果不添加将会出现点第二页时报找不到链接的错.在上述以前添加的情况下,发现部分页面是正常的,部分页面是不正常的,检查cshtml文件都是一样的配置.以下就是我的网页各个view目录,花红线的就是有问题的几个.#regionHome&Search////GET:/User/[Authorize]publicActionResultIndex(

ASP项目中的通用条件查询模块

一.提出问题:    在大型的ASP项目中,都涉及到了条件查询这一功能.用户要求能够针对特定的字段进行查询.对于有些数据,是从多个表取出来的,因此也要能对多个表进行查询.    一般的话,大多数的做法就是每个程序都做一个查询功能,因为每个查询的表都不同,涉及的字段也不同.但是,如果在大型的ASP项目中这么做的话,不仅增加了工作量.影响开发进度,而且不能使系统模块化.代码复用,增加了系统维护难度.因此,我们有必要使条件查询模块化. 二.解决思路:    我们设计条件查询的功能为:    1.选择查

脚本-oracle条件查询,才能查询时不区分大小写

问题描述 oracle条件查询,才能查询时不区分大小写 Oracle 默认是区分大小写.如果不要区分,就要额外的设置. 下面就是不区分的脚本设置: ALTER SESSION SET NLS_COMP=ANSI; ALTER SESSION SET NLS_SORT=binary_ci;不过这个是在当前会话上,也就是说在每次发起查询的时候都需要执行这个才能起作用的.那么在java中该怎么设置才能得到所需的结果 解决方案 oracle查询区分大小写查询区分大小写查询区分大小写 解决方案二: sql

extjs 做数据库增删改查时,原先是全部查上来显示的,现在用条件查询,怎么在原先的位置上显示条件查询的结果

问题描述 extjs 做数据库增删改查时,原先是全部查上来显示的,现在用条件查询,怎么在原先的位置上显示条件查询的结果 问题补充:myali88 写道 解决方案 重写store的onbeforeload方法,构造查询参数,执行查询时这些参数可以直接在后台获取到.这种方式比较好理解.每次刷新(refreshGrid)都会执行这个方法.var grid;/** * grid的参数 */var params = {start : 0,limit : 1000};var rIndex;/** 操作行的i

dropdownlist内容作为SQL的查询参数,怎么实现默认为“不限”,从而SQL查询时,此参数限定条件为“无”?

问题描述 dropdownlist内容作为SQL的查询参数,怎么实现默认为"不限",从而SQL查询时,此参数限定条件为"无"?多谢指教!! 解决方案 解决方案二:你把dropdownlist里添加个不限这项SelectValue设为空!查询如果时候传这个参数自动传为空解决方案三:不懂.....设置成1=1??select*fromtablewhere1=1不就不限了解决方案四:添加个item,value值为空.解决方案五:DDLCarId.Items.Insert(

条件查询分页问题

问题描述 小弟刚出道的JAVA程序员,遇到了一个分页显示问题,全部查询的时候,分页没什么问题,可是面对一个多条件的查询分页显示,搞了一天的测试,知道了什么问题,但是去解决,以失败告终.好了废话不多说了,贴出来大家看看#11头一次发帖子,见谅~ ~!分2种情况:1. 都不填写值时,点击搜索,显示所有信息,并分页.2. 4选1,4选2,4选3 或者都填写,点击搜索,根据所填值或者选择的值进行分页显示.问题是,按理想的出结果了,但是,跳完action回来之后,下一页,数字转化异常.限于文字的限制,只贴