Oracle 查询技巧与优化(二) 多表查询

2023-11-19

前言

上一篇blog介绍了Oracle中的单表查询和排序的相关技巧(http://blog.csdn.net/wlwlwlwl015/article/details/52083588),本篇blog继续介绍查询中用的最多的——多表查询的技巧与优化方式,下面依旧通过一次例子看一个最简单的多表查询。

多表查询

上一篇中提到了学生信息表的民族代码(mzdm_)这个字段通常应该关联字典表来查询其对应的汉字,实际上我们也是这么做的,首先简单看一下表结构,首先是字典表:
这里写图片描述

如上图,可以看到每个民族代码和名称都是由两个字段——“itemkey_”和“itemvalue_”以键值形式对应起来的,而学生信息表只存了民族代码字段(mzdm_),所以通过mzdm_和itemkey_相对应就能很好的查询出民族对应的汉字了,比如这样写:

select t1.*, t2.itemvalue_ mzmc_
  from (select sid_, stuname_, mzdm_ from t_studentinfo) t1
  left join (select itemkey_, itemvalue_
               from t_dict
              where itemname_ = 'EthnicType') t2
    on t1.mzdm_ = t2.itemkey_;

接下来查看一下运行结果:
这里写图片描述

如上写法(左连接查询)是我在项目中运用最多的形式之一,暂不评论好坏与效率,总之查询结果是很好的展现出来了,接下来就具体研究一下多表查询的几种方式与区别。

UNION ALL

如题,这是我们第一个介绍的操作多表的方式就是UNION和UNION ALL,UNION和UNION ALL也是存在一定区别的,首先明确一点基本概念,UNION和UNION ALL是用来合并多个数据集的,例如将两个select语句的结果合并为一个整体:

select bmh_, stuname_, csrq_, mzdm_
  from t_studentinfo
 where mzdm_ = 2
union all
select bmh_, stuname_, csrq_, mzdm_
  from t_studentinfo
 where mzdm_ = 5

查询结果如下:
这里写图片描述

如上图所示,把mzdm_为2和5的结果集合并在了一起,那么接下来把UNION ALL换成UNION再看一下运行结果:
这里写图片描述

注意观察上图中的第一列BMH_不难发现,UNION进行了排序(默认规则排序,即按查询结果的首列进行排序),这就是它与UNION ALL的区别之一,再看一下下面这两个SQL和查询结果:

select bmh_, stuname_, csrq_, mzdm_
  from t_studentinfo
 where mzdm_ in (2, 5)
   and csrq_ like '200%';

运行结果如下:
这里写图片描述

select bmh_, stuname_, csrq_, mzdm_
  from t_studentinfo
 where mzdm_ in (2, 5)
   and csrq_ like '2001%';

运行结果如下:
这里写图片描述

可以看到第二段查询结果肯定是包含在第一段查询结果之内的,那么它们进行UNION和UNION ALL又会有何区别呢?分别看一下,首先是UNION ALL:
这里写图片描述

如上图,不难发现使用UNION ALL查询出了上面两个结果集的总和,包括6对重复数据+5条单独的数据总共17条,那么再看看UNION的结果:
这里写图片描述

显而易见,和UNION ALL相比UNION帮我们自动剔除了6条重复结果,得到的是上面两个结果集的并集,同时并没有排序,这也就是UNION ALL与UNION的第二个区别了,最后简单总结一下UNION与UNION ALL的区别:

  1. UNION会自动去除多个结果集合中的重复结果,而UNION ALL则将所有的结果全部显示出来,不管是不是重复。
  2. UNION会对结果集进行默认规则的排序,而UNION ALL则不会进行任何排序。

所以效率方面很明显UNION ALL要高于UNION,因为它少去了排序和去重的工作。当然还有一点需要注意,UNION和UNION ALL也可以用来合并不同的两张表的结果集,但是字段类型和个数需要匹配,例如:

select sid_, stuname_, mzdm_
  from t_studentinfo
 where sid_ = '33405'
union all
select did_, itemvalue_, itemkey_
  from t_dict
 where did_ = '366'

查看一下运行结果:
这里写图片描述

当数据配型不匹配或是列数不匹配时则会报错:
这里写图片描述
这里写图片描述

当列数不够时完全也可以用NULL来代替从而避免上图中的错误。最后再举个例子看一下UNION ALL在某些比较有意义的场景下的作用,首先创建一张临时表:

with test as
 (select 'aaa' as name1, 'bbb' as name2
    from dual
  union all
  select 'bbb' as name1, 'ccc' as name2
    from dual
  union all
  select 'ccc' as name1, 'ddd' as name2
    from dual
  union all
  select 'ddd' as name1, 'eee' as name2
    from dual
  union all
  select 'eee' as name1, 'fff' as name2
    from dual
  union all
  select 'fff' as name1, 'ggg' as name2
    from dual)
select * from test;

运行结果如下:
这里写图片描述

我们的需求也很简单,即:统计NAME1和NAME2中每个不同的值出现的次数。谈一下思路,首先统计NAME1每个值出现的次数,再统计NAME2每个值出现的次数,最后对上面两个结果集进行UNION ALL合并,最后再进行一次分组和排序即可:

with test as
 (select 'aaa' as name1, 'bbb' as name2
    from dual
  union all
  select 'bbb' as name1, 'ccc' as name2
    from dual
  union all
  select 'ccc' as name1, 'ddd' as name2
    from dual
  union all
  select 'ddd' as name1, 'eee' as name2
    from dual
  union all
  select 'eee' as name1, 'fff' as name2
    from dual
  union all
  select 'fff' as name1, 'ggg' as name2
    from dual)
select namex, sum(times) times
  from (select name1 namex, count(*) times
          from test
         group by name1
        union all
        select name2 namex, count(*) times
          from test
         group by name2)
 group by namex
 order by namex;

运行结果如下:
这里写图片描述

OK,很好的完成了查询,那么关于UNION和UNION ALL暂且介绍到这里。

是否使用JOIN

如题,blog开头写的那个例子是使用LEFT JOIN完成两张表的关联查询的,那么另外也可以不用JOIN而通过WHERE条件来完成以达到相同的效果:

select t1.sid_, t1.stuname_, t1.mzdm_, t2.itemvalue_ mzmc_
  from t_studentinfo t1, t_dict t2
 where t1.mzdm_ = t2.itemkey_
   and t2.itemname_ = 'EthnicType';

运行效果如下:
这里写图片描述

回头看一下blog开头的SQL和运行效果,可以发现和上图一模一样,那使用哪一种更合适呢?JOIN的写法是SQL-92的标准,多表关联时候使用JOIN方式进行关联查询可以更清楚的看到各表之间的联系,也方便维护SQL,所以还是不建议上面使用WHERE的查询方式,而是应该使用JOIN的写法。

IN和EXISTS

如题,这也是在查询中经常用到的,尤其是IN关键字,在项目中使用的相当频繁,经常会有通过for循环和StringBuffer来拼接IN语句的写法,那么接下来就仔细看一下IN和EXISTS的使用场景以及效率问题,依旧通过举例说明,比如这个需求,查询所有汉族学生的成绩:

explain plan for select *
  from t_studentscore
 where bmh_ in (select bmh_ from t_studentinfo where mzdm_ = 1);
select * from table(dbms_xplan.display());

观察一下执行计划:

1 Plan hash value: 902966761
2
3 ————————————————————————————-
4 | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
5 ————————————————————————————-
6 | 0 | SELECT STATEMENT | | 535 | 37985 | 240 (1)| 00:00:03 |
7 |* 1 | HASH JOIN | | 535 | 37985 | 240 (1)| 00:00:03 |
8 |* 2 | TABLE ACCESS FULL| T_STUDENTINFO | 535 | 5885 | 207 (1)| 00:00:03 |
9 | 3 | TABLE ACCESS FULL| T_STUDENTSCORE | 11642 | 682K| 32 (0)| 00:00:01 |
10 ————————————————————————————-
11
12 Predicate Information (identified by operation id):
13 —————————————————
14
15 1 - access(“BMH_”=SYS_OP_C2C(“BMH_”))
16 2 - filter(“MZDM_”=1)

同理,将IN换成EXISTS再来看一下SQL和执行计划:

explain plan for select *
  from t_studentscore ts
 where exists (select 1
          from t_studentinfo
         where mzdm_ = 1
           and bmh_ = ts.bmh_);
select * from table(dbms_xplan.display());

观察一下执行计划:

1 Plan hash value: 3857445149
2
3 —————————————————————————————
4 | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
5 —————————————————————————————
6 | 0 | SELECT STATEMENT | | 1 | 71 | 240 (1)| 00:00:03 |
7 |* 1 | HASH JOIN RIGHT SEMI| | 1 | 71 | 240 (1)| 00:00:03 |
8 |* 2 | TABLE ACCESS FULL | T_STUDENTINFO | 535 | 5885 | 207 (1)| 00:00:03 |
9 | 3 | TABLE ACCESS FULL | T_STUDENTSCORE | 11642 | 682K| 32 (0)| 00:00:01 |
10 —————————————————————————————
11
12 Predicate Information (identified by operation id):
13 —————————————————
14
15 1 - access(“TS”.”BMH_”=SYS_OP_C2C(“BMH_”))
16 2 - filter(“MZDM_”=1)

如上所示,尽管IN的写法用了HASH JOIN(哈希连接)而EXISTS的写法用了HASH JOIN RIGHT SEMI(哈希右半连接),但它们的执行计划却没有区别,效率都是一样的,这是因为数据量不大,所以有一点结论就是在简单查询中,IN和EXISTS是等价的。还有一点需要明确,在早期的版本中仿佛有这样的规则:

  1. 子查询结果集小,用IN。
  2. 外表小,子查询表大,用EXISTS。

这两个说法在Oracle11g中已经是完全错误的了!在Oracle8i中这样也许还经常是正确的,但Oracle 9i CBO就已经优化了IN和EXISTS的区别,Oracle优化器有个查询转换器,很多SQL虽然写法不同,但是Oracle优化器会根据既定规则进行查询重写,重写为优化器觉得效率最高的SQL,所以可能SQL写法不同,但是执行计划却是完全一样的,所以还有个结论就是:关于IN和EXISTS哪种更高效应该及时查看PLAN,而不是记固定的结论,至少在目前的Oracle版本中是这样的。

INNER LEFT RIGHT FULL JOIN

如题,很常用的几种连接方式,下面就分别看一下它们之间的区别。

INNER JOIN

首先是内连接(INNER JOIN),顾名思义,INNER JOIN返回的是两表相匹配的数据,依旧以blog开头的例子改写为INNER JOIN:

select t1.sid_, t1.stuname_, t1.mzdm_, t2.itemvalue_ mzmc_
  from t_studentinfo t1
 inner join t_dict t2
    on t1.mzdm_ = t2.itemkey_
 where t2.itemname_ = 'EthnicType';

运行结果如下:
这里写图片描述

可以看到和上面的结果依旧是完全一样,但这个例子没有说明INNER JOIN的特点,所以就再重新创建两张表说明一下问题,这次用比较经典的学生表班级表来进行测试:

create table T_TEST_STU
(
  sid     INTEGER,
  stuname VARCHAR2(20),
  clsid   INTEGER
)
tablespace USERS
  pctfree 10
  initrans 1
  maxtrans 255
  storage
  (
    initial 64K
    next 1M
    minextents 1
    maxextents unlimited
  );
create table T_TEST_CLS
(
  cid   INTEGER,
  cname VARCHAR2(20)
)
tablespace USERS
  pctfree 10
  initrans 1
  maxtrans 255
  storage
  (
    initial 64K
    next 1M
    minextents 1
    maxextents unlimited
  );

表创建好后插入测试数据:

insert into T_TEST_STU (SID, STUNAME, CLSID) values (1, '张三', 1);

insert into T_TEST_STU (SID, STUNAME, CLSID) values (2, '李四', 1);

insert into T_TEST_STU (SID, STUNAME, CLSID) values (3, '小明', 2);

insert into T_TEST_STU (SID, STUNAME, CLSID) values (4, '小李', 3);

insert into T_TEST_CLS (CID, CNAME) values (1, '三年级1班');

insert into T_TEST_CLS (CID, CNAME) values (5, '三年级5班');

如上所示,可以看到非常简单,学生表插入了4条数据,班级表插入了1条数据,用学生表的clsid来关联班级表的cid查询一下班级名称,下面看一下使用INNER JOIN的查询语句:

select t1.sid, t1.stuname, t2.cname
  from t_test_stu t1
 inner join t_test_cls t2
    on t1.clsid = t2.cid;

运行后可以看到查询结果:
这里写图片描述

如上所示,很好的验证了INNER JOIN的概念,即返回两表均匹配的数据,由于班级表只有1条1班的数据和1条5班的数据,而学生表仅有两名1班的学生并且没有任何5班的学生,所以自然只能返回两条。

LEFT JOIN

如题,LEFT JOIN是以左表为主表,返回左表的全部数据,右表只返回相匹配的数据,将上面的SQL改为LEFT JOIN看一下:

select t1.sid, t1.stuname, t2.cname
  from t_test_stu t1
  left join t_test_cls t2
    on t1.clsid = t2.cid;

看一下运行结果:
这里写图片描述

如上图所示,也非常简单,因为右表(班级表)并没有2班和3班的数据,所以班级名称不会显示。

RIGHT JOIN

如题,RIGHT JOIN和LEFT JOIN是相反的,以右表数据为主表,左表仅返回相匹配的数据,同理将上面的SQL改写为RIGHT JOIN的形式:

select t1.sid, t1.stuname, t2.cname
  from t_test_stu t1
 right join t_test_cls t2
    on t1.clsid = t2.cid;

运行结果如下:
这里写图片描述

如上图,由于是以班级表为主表进行关联,所以匹配到1班的2名学生以及5班的数据。

FULL JOIN

如题,顾名思义,FULL JOIN就是不管左右两边是否匹配,一次性显示出所有的查询结果,相当于LEFT JOIN和RIGHT JOIN结果的并集,依旧将上面的SQL改写为FULL JOIN并查看结果:

select t1.sid, t1.stuname, t2.cname
  from t_test_stu t1
  full join t_test_cls t2
    on t1.clsid = t2.cid;

运行结果如下:
这里写图片描述

到这里这4种JOIN查询方式就已经简要的介绍完毕,单从概念上来将还是很好理解和区分的。

自关联

如题,这是一个使用场景比较特殊的关联方式,个人感觉如果数据库合理设计的话不会出现这种需求吧,既然提到了就举例说明一下,依旧以上面的测试学生表为例,现在需要添加一个字段:

alter table T_TEST_STU add leader INTEGER;

假设有如下需求,每个学生都有一个直属leader,负责检查作业,老师为了避免作弊行为不会指定两个人相互检查,而是依次错开,比如学生A检查学生B,学生B检查学生C,所以我们的表数据可以这样来描述这个问题:
这里写图片描述

如上图,张三的LEADER是李四,李四的LEADER是小明,小明的LEADER是小李,而小李的LEADER又是张三,那么问题来了,该如何查询得到每个学生的LEADER的姓名呢?没错,这里就用到了自关联查询,简单的讲就是把同一张表查两遍并进行关联,用视图来说明获取更清晰,所以首先创建两个视图:

CREATE OR REPLACE VIEW V_STU as select * from T_TEST_STU;
CREATE OR REPLACE VIEW V_LEADER as select * from T_TEST_STU;

接下来就通过自关联查询:

select v1.SID, v1.STUNAME, v1.CLSID, v1.LEADER, v2.STUNAME leader
  from V_STU v1
  left join V_LEADER v2
    on v1.LEADER = v2.SID
 order by v1.SID

运行结果如下:
这里写图片描述

如上图所示,这样就通过自关联很好的查询出了每个学生对应的LEADER的姓名。

NOT IN和NOT EXISTS

如题,我们现在有一张学生信息表和一张录取结果表,例如我们想知道有哪些学生没被录取,即学生表有数据但录取表却没有该学生的数据,这时就可以用到NOT IN或NOT EXISTS,依旧结合执行计划看一看这种方式的差异:

explain plan for
select * from t_studentinfo where bmh_ not in (select bmh_ from t_lq);
select * from table(dbms_xplan.display());

观察一下执行计划:

1 Plan hash value: 4115710565
2
3 —————————————————————————————–
4 | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
5 —————————————————————————————–
6 | 0 | SELECT STATEMENT | | 119 | 52003 | 551 (1)| 00:00:07 |
7 |* 1 | HASH JOIN RIGHT ANTI NA| | 119 | 52003 | 551 (1)| 00:00:07 |
8 | 2 | TABLE ACCESS FULL | T_LQ | 11643 | 93144 | 343 (1)| 00:00:05 |
9 | 3 | TABLE ACCESS FULL | T_STUDENTINFO | 11772 | 4931K| 207 (1)| 00:00:03 |
10 —————————————————————————————–
11
12 Predicate Information (identified by operation id):
13 —————————————————
14
15 1 - access(“BMH_”=”BMH_”)

接下来将SQL转换为NOT EXISTS再看一下执行计划:

explain plan for 
select * from t_studentinfo t1 where not exists (select null from t_lq t2 where t1.bmh_ = t2.bmh_);
select * from table(dbms_xplan.display());

执行结果如下:

1 Plan hash value: 270337792
2
3 ————————————————————————————–
4 | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
5 ————————————————————————————–
6 | 0 | SELECT STATEMENT | | 119 | 52003 | 551 (1)| 00:00:07 |
7 |* 1 | HASH JOIN RIGHT ANTI| | 119 | 52003 | 551 (1)| 00:00:07 |
8 | 2 | TABLE ACCESS FULL | T_LQ | 11643 | 93144 | 343 (1)| 00:00:05 |
9 | 3 | TABLE ACCESS FULL | T_STUDENTINFO | 11772 | 4931K| 207 (1)| 00:00:03 |
10 ————————————————————————————–
11
12 Predicate Information (identified by operation id):
13 —————————————————
14
15 1 - access(“T1”.”BMH_”=”T2”.”BMH_”)

如上所示,两个PLAN都应用了HASH JOIN RIGHT ANTI,所以它们的效率是一样的,所以在Oracle11g中关于NOT IN和NOT EXISTS也没有绝对的效率优劣,依旧是要通过PLAN来判断和测试哪种更高效。

多表查询时的空值处理

如题,假设有以下需求,我需要查询一下性别不为男的学生的录取分数,但在这之前我首先给学生表添加一条报名号(bmh_)为null的学生数据,如下所示:
这里写图片描述

接下来写查询语句,这里刻意用一下NOT IN关键字而不是IN关键字:

select bmh_, stuname_, lqfs_
  from t_lq
 where bmh_ not in (select bmh_ from t_studentinfo where sextype_ = 1)

运行结果如下图所示:
这里写图片描述

我们惊奇的发现没有任何数据被查出来,这就是因为NOT IN后的子查询中的5000+结果中仅仅有一条存在NULL值,所以这个查询整体就不会显示任何结果,有点一只老鼠毁了一锅汤的感觉,这也正是Oracle的特性之一,即:如果NOT IN关键字后的子查询包含空值,则整体查询都会返回空,所以这类查询务必要加非NULL判断条件,即:

select bmh_, stuname_, lqfs_
  from t_lq
 where bmh_ not in (select bmh_
                      from t_studentinfo
                     where sextype_ = 1
                       and bmh_ is not null);

这次再看一下运行结果:
这里写图片描述

如上图所示,这次就很好的查询出了我们需要的结果。

总结

简单记录一下Oracle多表查询中的各种模式以及个人认为值得注意的一些点和优化方式,希望对读到的同学有所帮助和提高,The End。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Oracle 查询技巧与优化(二) 多表查询 的相关文章

  • 删除超过 2 个月的分区

    我有一个基于日期字段进行分区的表 现在 我必须编写一个过程来删除所有超过 2 个月的分区 即 test date 超过 2 个月 我该怎么做 create table test table test id number test date
  • 如何为 Weblogic 10.3.6 启用 Java 持久性 2.0

    我正在使用 eclipse 和 weblogic 服务器 为了将项目添加到 weblogic 服务器 它需要支持 Java Persistance 2 0 但是当尝试安装它时 我不断收到此消息 在 Weblogic Server 安装中启用
  • 通过一个表中的列更新另一表中的列

    我有两张桌子 A 和 B 两者都有一个共同的列 name 并通过列 id 相互链接 表A中的 name 列是空的 而表B中有数据 我的任务是用相应的id填充从表B到表A的该列中的所有数据 我正在使用以下查询 UPDATE A SET A n
  • Oracle 12 对 SQL 中的本地集合类型有问题吗?

    长话短说 我建议讨论下面看到的代码 运行时 Oracle 11 编译器引发 PLS 00306 调用 PIPE TABLE 时参数提示的数量或类型错误 PLS 00642 SQL 语句中不允许使用本地集合类型 Oracle 12编译下面的包
  • oracle中是否有相当于concat_ws的东西?

    我有大量的列试图聚合在一起 其中大多数都有 NULL 值 我想分隔确实以 出现的值但我在oracle中找不到有效的方法来做到这一点 CONCAT WS 正是我所需要的 因为它不会在 NULL 值之间添加分隔符 但 Oracle 不支持这一点
  • oracle 数据透视表中的列

    示例选择 select from select 1 cnt 2 sm 55 name 12 month 2011 year 12 2011 mnth txt from dual union all select 1 cnt 2 sm 54
  • Rails 建模:将 HABTM 转换为 has_many :through

    我正在现有的 Rails 站点上进行维护工作 并且遇到了一些由多对多关联引起的问题 看起来该网站最初是使用has and belongs to many对于一些业务逻辑变得更加复杂的关系 所以我需要使用has many through而是支
  • 从 Oracle Varchar2 中查找并删除非 ASCII 字符

    我们目前正在将一个 Oracle 数据库迁移到 UTF8 并且发现一些记录接近 4000 字节 varchar 限制 当我们尝试迁移这些记录时 它们会失败 因为它们包含的字符变成了多字节 UF8 字符 我想要在 PL SQL 中做的是找到这
  • 数据库的创建日期

    这是一个问题 起源于this https stackoverflow com questions 2522626 check how old an oracle database is 2523227 2523227杰米提出的问题 我想我会
  • 如何使用 Java 创建多个模式连接?

    我必须使用两个数据库 DB2 Oracle 我在 DB2 数据库中有一个名为NAVID 我想使用 Java 为 Oracle 中的所有表创建相同的架构 public class automateExport static String va
  • 安装 OCI8:如何纠正“使用未定义常量 OCI_COMMIT_ON_SUCCESS”错误?

    我正在尝试在 RedHat 服务器 RHEL7 上为我的 Apache 服务器安装 OCI8 此时 当我尝试使用 Symphony 连接到我的服务器时 出现以下错误 异常 ErrorException 使用未定义的常量 OCI COMMIT
  • Oracle内置函数元数据

    有没有办法获取 Oracle 内置聚合和其他功能的元数据 例如AVG STDDEV SQRT ETC 我需要知道对象 id 和参数元 In the SYS ALL OBJECTS查看我找不到任何有用的东西 我也尝试过搜索SYS ALL AR
  • Oracle 删除约束级联等效于 Sql Server

    在Oracle中 删除约束PK SAI我使用语法 ALTER TABLE SAISIE DROP CONSTRAINT PK SAI CASCADE SQL Server 中与此等效的是什么 您正在考虑与实际 DELETE 语句相关的 FO
  • ORA-00933 与内部联接和“as”混淆

    我有一个使用以下命令从两个表中获取数据的查询inner join 但我收到错误SQL command not properly ended as 下面有一个星号 select P carrier id O order id O aircra
  • 使用 Hibernate 将 Oracle 日期映射到 Java 对象

    我收到消息 文字与格式字符串不匹配 例如 以下是 Java 类中的一些方法 public String getDateTime public void setDateTime String date time 以下是该类的 Hibernat
  • 以编程方式插入行(父行和子行)

    我正在使用 Spring 和 JDBCTemplate 该场景是 CUSTOMER 表和 ORDERS 表的父子关系 我想做一个插入 例如 1 个客户和 5 个订单 但我不确定如何以编程方式在 CUSTOMER 表中插入一行 如何获取 Or
  • Oracle JDBC 预取:如何避免 RAM 不足/如何使 oracle 更快高延迟

    使用 Oracle java JDBC ojdbc14 10 2 x 加载包含多行的查询需要很长时间 高延迟环境 这显然是 Oracle JDBC 中的默认预取默认大小 10 每 10 行需要一次往返时间 我正在尝试设置一个激进的预取大小来
  • Java、Oracle 中索引处缺少 IN 或 OUT 参数:: 1 错误

    您好 我使用 Netbeans 8 0 2 和 Oracle 11g Express Edition 在 JSF 2 2 中编写了一个图书馆管理系统 我有几个名为 书籍 借阅者 等的页面 以及数据库中一些名为相同名称的表 我的问题是这样的
  • Oracle SQL 函数中可以有 commit 语句吗

    在 SQL 函数中使用 COMMIT 语句是否可能 有意义 从技术上来说 答案是肯定的 你can请执行下列操作 create or replace function committest return number as begin upd
  • Oracle Text:如何清理用户输入

    如果有人有使用 Oracle 文本的经验 CTXSYS CONTEXT 我想知道当用户想要搜索可能包含撇号的名称时如何处理用户输入 在某些情况下 转义 似乎有效 但对于单词末尾的 s 则不起作用 s 在停用词列表中 因此似乎已被删除 目前

随机推荐

  • go struct{} 空结构体的特点和作用

    空结构体的特点和作用 参考代码 package main import fmt unsafe func main empStruct 空结构体的实例和作用 func empStruct 空结构体的特点 1 不占用内存 2 地址不变 var
  • Input

    Unity3d的所有输入 包括键盘鼠标和智能手机触摸等都是通过这一个类来完成 Input类 见API http docs unity3d com ScriptReference Input html 输入Input类使用 建议在Updata
  • Minikube 架构及启动流程剖析

    原文作者 wzqnls 编辑 夏天 对于要学习 Kubernetes 或者需要本地开发的开发人员来说 Minikube 是一个不错的选择 通过使用 Minikube 这个工具 我们可以非常快捷地在本地部署一套单节点的 Kubernetes
  • 【Linux】线程安全

    文章目录 1 线程互斥 1 1 线程间互斥的相关概念 1 2互斥量 1 3互斥量接口 1 4互斥量实现原理 2 可重入VS线程安全 3 常见锁概念 3 1死锁 3 2常见死锁情况 3 2 1情况一 忘记释放锁 3 2 2情况二 线程重复申请
  • [机缘参悟-66]:怎样才能让别人愿意帮你:利益共享法则、“大道”、“人性”

    目录 前言 第1章 生命是利益 1 1 什么是利益 1 2 不同时期 利益展现不同的形态 1 3 利益是维系社会运行的根本力量 1 4 利益是中性词 第2章 共享利益 2 1 共享利益的形态 2 2 显性的共享利益 物质利益 2 3 利益的
  • 分享一个嘉立创封装库(内含AD和PADS两种格式)

    一直以来做封装都是令我头疼的问题 偶然发现嘉立创的封装库 真的非常好用 而且封装做得非常漂亮 这个封装做得非常好 我也打过几款板子出来 手工焊接起来也非常好 真的是非常好的一个封装库 封装库里面包含了AD Protel99和PADS三种格式
  • 给windows宿主机和wsl2的ubuntu-20.04分配固定IP,使能相互ping通

    我们知道wsl2是基于hyper v的虚拟机 每次重新启动的时候 都会重新拉一个新的hyper v虚拟机实例 然后虚拟网卡的IP是dhcp随机分配的 如果作为开发系统用 就会比较烦每次都要换一个IP 有人提供了个脚本 他写了个bat脚本在w
  • Tomcat之startup.bat启动闪退解决

    安装完了service 那个服务器 使用从官网下载的apche包 我使用的是这个包apache tomcat 8 5 81 windows x64 去bin里面启动 startup bat结果出现闪退 问题还是java环境变量的设置问题 可
  • 用户的计算机名,获取计算机名及用户名

    ifdef WINDOWS uses Windows endif ifdef UNIX uses BaseUnix endif ifdef UNIX function GetUserName String begin Result GetE
  • docker介绍

    公式 Usage docker OPTIONS COMMAND A self sufficient runtime for containers Options config string Location of client config
  • Ipv4学习笔记之实践篇

    什么是IP 学习IP是入门网络的第一步 要想了解网络的工作原理 首先要了解的就是IP协议 IP standards for Internet Protocol 也就是说IP是Internet Protocol的缩写 是internet通信协
  • 【Termux Python3.11开发】安装opencv-contrib-python后终于可以尝鲜airtest,poco

    无意看到airtest的一些介绍 正好在找一些工具 Python自动化的轮子 好放在Termux环境下进行测试效果如何 经过一些时间的折腾 总算顺利解决 安装好几个相关的库 点击链接加入群聊 Termux友情赞助群 897177804 pi
  • uniapp小程序跳转其他小程序uni.navigateToMiniProgram效果demo(整理)

    放点击事件里面即可 uni navigateToMiniProgram appId 跳转的小程序的aooId path pages index index id 123 如果这里不填 默认是跳转到对方小程序的主页面 extraData 需要
  • 无人机+三维实景建模助力古建筑保护,传承历史记忆

    历史文化建筑 承载着过去各个时代的文化记忆 无论是保存还是修缮古建筑 都需要将其基本信息进行数字化建档 为修缮提供精准参考 根据住建部的要求 从2020年开始到2022年 全国需完成历史建筑100 测绘及系统录入工作 并且明确鼓励采用摄影测
  • iOS-根据系统语言更改App名称或其他配置

    要求 要根据系统的语言更改app的名字 解决方案 在xcode中进行打包前的配置 我用的是xcode11版本 一 Bundle display name 可以通过直接修改Bundle display name来确定app的名称 Bundle
  • 用云服务器搭建虚拟主机,如何用云服务器搭建虚拟主机

    如何用云服务器搭建虚拟主机 内容精选 换一换 在云服务器上搭建网站后 部分客户通过本地网络访问网站时出现偶发性无法访问的情况 确认客户使用的本地网络 若客户的本地网络是NAT网络 本地主机通过NAT功能使用公网IP地址访问弹性云服务器 可能
  • Windows 11开启硬件加速后出现的黑屏、闪屏(如Edge浏览器、照片)问题的两种解决方案

    2022年3月21日更新 若只有Edge出现闪屏问题 可跳到下方查看原文章 若其他软件也出现闪屏问题的话 可能是Intel核显驱动的问题 可以到Intel官网搜索相应的驱动程序 不要下载最新版 core 6 11代驱动下载地址 https
  • Verilog之assign

    Verilog中的关键词assign主要用于如下两个地方 数据流建模 用于数据流建模的显示连续赋值语句语法格式如下
  • 【数学建模】随机森林预测(Python代码实现)

    目录 1 参数 2 算例实现 2 1 算例 2 2 单目标预测 DecisionTreeRegressor 2 3 多目标预测MultiOutputRegressor 1 参数 n estimators 森林中决策树的数量 默认100 表示
  • Oracle 查询技巧与优化(二) 多表查询

    前言 上一篇blog介绍了Oracle中的单表查询和排序的相关技巧 http blog csdn net wlwlwlwl015 article details 52083588 本篇blog继续介绍查询中用的最多的 多表查询的技巧与优化方