类似groupby的分组计数功能
之前同事发过一个语句,实现的功能比较简单,类似group by的分组计数功能,因为where条件有like,又无法用group by来实现。SELECT a.N0,b.N1,c.N2,d.N3,e.N4,f.N5,g.N6,h.N7,i.N8,j.N9 from (select count(*) N0 from tbl_loginfo_20141110 where keyrecord
之前同事发过一个语句,实现的功能比较简单,类似group by的分组计数功能,因为where条件有like,又无法用group by来实现。 SELECT a.N0,b.N1,c.N2,d.N3,e.N4,f.N5,g.N6,h.N7,i.N8,j.N9 from (select count(*) N0 from tbl_loginfo_20141110 where keyrecord like '0%' or keyrecord like 'GJ_0%') a, (select count(*) N1 from tbl_loginfo_20141110 where keyrecord like '1%' or keyrecord like 'GJ_1%') b, (select count(*) N2 from tbl_loginfo_20141110 where keyrecord like '2%' or keyrecord like 'GJ_2%') c, (select count(*) N3 from tbl_loginfo_20141110 where keyrecord like '3%' or keyrecord like 'GJ_3%') d, (select count(*) N4 from tbl_loginfo_20141110 where keyrecord like '4%' or keyrecord like 'GJ_4%') e, (select count(*) N5 from tbl_loginfo_20141110 where keyrecord like '5%' or keyrecord like 'GJ_5%') f, (select count(*) N6 from tbl_loginfo_20141110 where keyrecord like '6%' or keyrecord like 'GJ_6%') g, (select count(*) N7 from tbl_loginfo_20141110 where keyrecord like '7%' or keyrecord like 'GJ_7%') h, (select count(*) N8 from tbl_loginfo_20141110 where keyrecord like '8%' or keyrecord like 'GJ_8%') i, (select count(*) N9 from tbl_loginfo_20141110 where keyrecord like '9%' or keyrecord like 'GJ_9%') j; 为了了解语句的性能,我做了如下类似的测试: select * from v$version; --Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production drop table a; create table a as select * from dba_objects where rownum<=50000; begin for x in 1..6 loop insert into a select * from a; end loop; commit; end; select count(*) from a; --3200000 select bytes/1024/1024 from user_segments where segment_name='A'; --357M alter system flush shared_pool; alter system flush buffer_cache; SELECT a.N0,b.N1,c.N2,d.N3,e.N4,f.N5,g.N6,h.N7,i.N8,j.N9 from (select count(*) N0 from a where object_name like 'A%' or object_name like 'V%') a, (select count(*) N1 from a where object_name like 'B%' or object_name like 'V%') b, (select count(*) N2 from a where object_name like 'C%' or object_name like 'V%') c, (select count(*) N3 from a where object_name like 'D%' or object_name like 'V%') d, (select count(*) N4 from a where object_name like 'E%' or object_name like 'V%') e, (select count(*) N5 from a where object_name like 'F%' or object_name like 'V%') f, (select count(*) N6 from a where object_name like 'G%' or object_name like 'V%') g, (select count(*) N7 from a where object_name like 'H%' or object_name like 'V%') h, (select count(*) N8 from a where object_name like 'I%' or object_name like 'V%') i, (select count(*) N9 from a where object_name like 'J%' or object_name like 'V%') j; --58s alter system flush shared_pool; alter system flush buffer_cache; --改写后 select sum(case when object_name like 'A%' or object_name like 'V%' then 1 else 0 end) N0, sum(case when object_name like 'B%' or object_name like 'V%' then 1 else 0 end) N1, sum(case when object_name like 'C%' or object_name like 'V%' then 1 else 0 end) N2, sum(case when object_name like 'D%' or object_name like 'V%' then 1 else 0 end) N3, sum(case when object_name like 'E%' or object_name like 'V%' then 1 else 0 end) N4, sum(case when object_name like 'F%' or object_name like 'V%' then 1 else 0 end) N5, sum(case when object_name like 'G%' or object_name like 'V%' then 1 else 0 end) N6, sum(case when object_name like 'H%' or object_name like 'V%' then 1 else 0 end) N7, sum(case when object_name like 'I%' or object_name like 'V%' then 1 else 0 end) N8, sum(case when object_name like 'J%' or object_name like 'V%' then 1 else 0 end) N9 from a; --19s --对比执行计划: --前者执行计划: SQL> explain plan for 2 SELECT a.N0,b.N1,c.N2,d.N3,e.N4,f.N5,g.N6,h.N7,i.N8,j.N9 from 3 (select count(*) N0 from a where object_name like 'A%' or object_name like 'V%') a, 4 (select count(*) N1 from a where object_name like 'B%' or object_name like 'V%') b, 5 (select count(*) N2 from a where object_name like 'C%' or object_name like 'V%') c, 6 (select count(*) N3 from a where object_name like 'D%' or object_name like 'V%') d, 7 (select count(*) N4 from a where object_name like 'E%' or object_name like 'V%') e, 8 (select count(*) N5 from a where object_name like 'F%' or object_name like 'V%') f, 9 (select count(*) N6 from a where object_name like 'G%' or object_name like 'V%') g, 10 (select count(*) N7 from a where object_name like 'H%' or object_name like 'V%') h, 11 (select count(*) N8 from a where object_name like 'I%' or object_name like 'V%') i, 12 (select count(*) N9 from a where object_name like 'J%' or object_name like 'V%') j; Explained. Elapsed: 00:00:00.15 SQL> @getplan 'general,outline,starts' Enter value for plan type: PLAN_TABLE_OUTPUT ----------------------------------------------------------------------------------------- Plan hash value: 2527411742 ------------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | ------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | 130 | 123K (1)| 00:24:46 | | 1 | NESTED LOOPS | | 1 | 130 | 123K (1)| 00:24:46 | | 2 | NESTED LOOPS | | 1 | 117 | 111K (1)| 00:22:17 | | 3 | NESTED LOOPS | | 1 | 104 | 99032 (1)| 00:19:49 | | 4 | NESTED LOOPS | | 1 | 91 | 86653 (1)| 00:17:20 | | 5 | NESTED LOOPS | | 1 | 78 | 74274 (1)| 00:14:52 | | 6 | NESTED LOOPS | | 1 | 65 | 61895 (1)| 00:12:23 | | 7 | NESTED LOOPS | | 1 | 52 | 49516 (1)| 00:09:55 | | 8 | NESTED LOOPS | | 1 | 39 | 37137 (1)| 00:07:26 | | 9 | NESTED LOOPS | | 1 | 26 | 24758 (1)| 00:04:58 | | 10 | VIEW | | 1 | 13 | 12379 (1)| 00:02:29 | | 11 | SORT AGGREGATE | | 1 | 66 | | | |* 12 | TABLE ACCESS FULL| A | 91587 | 5903K| 12379 (1)| 00:02:29 | | 13 | VIEW | | 1 | 13 | 12379 (1)| 00:02:29 | | 14 | SORT AGGREGATE | | 1 | 66 | | | |* 15 | TABLE ACCESS FULL| A | 137K| 8831K| 12379 (1)| 00:02:29 | | 16 | VIEW | | 1 | 13 | 12379 (1)| 00:02:29 | | 17 | SORT AGGREGATE | | 1 | 66 | | | |* 18 | TABLE ACCESS FULL | A | 85818 | 5531K| 12379 (1)| 00:02:29 | | 19 | VIEW | | 1 | 13 | 12379 (1)| 00:02:29 | | 20 | SORT AGGREGATE | | 1 | 66 | | | |* 21 | TABLE ACCESS FULL | A | 111K| 7158K| 12379 (1)| 00:02:29 | | 22 | VIEW | | 1 | 13 | 12379 (1)| 00:02:29 | | 23 | SORT AGGREGATE | | 1 | 66 | | | |* 24 | TABLE ACCESS FULL | A | 86539 | 5577K| 12379 (1)| 00:02:29 | | 25 | VIEW | | 1 | 13 | 12379 (1)| 00:02:29 | | 26 | SORT AGGREGATE | | 1 | 66 | | | |* 27 | TABLE ACCESS FULL | A | 91587 | 5903K| 12379 (1)| 00:02:29 | | 28 | VIEW | | 1 | 13 | 12379 (1)| 00:02:29 | | 29 | SORT AGGREGATE | | 1 | 66 | | | |* 30 | TABLE ACCESS FULL | A | 228K| 14M| 12379 (1)| 00:02:29 | | 31 | VIEW | | 1 | 13 | 12379 (1)| 00:02:29 | | 32 | SORT AGGREGATE | | 1 | 66 | | | |* 33 | TABLE ACCESS FULL | A | 87981 | 5670K| 12379 (1)| 00:02:29 | | 34 | VIEW | | 1 | 13 | 12379 (1)| 00:02:29 | | 35 | SORT AGGREGATE | | 1 | 66 | | | |* 36 | TABLE ACCESS FULL | A | 84376 | 5438K| 12379 (1)| 00:02:29 | | 37 | VIEW | | 1 | 13 | 12379 (1)| 00:02:29 | | 38 | SORT AGGREGATE | | 1 | 66 | | | |* 39 | TABLE ACCESS FULL | A | 112K| 7251K| 12379 (1)| 00:02:29 | ------------------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 12 - filter("OBJECT_NAME" LIKE 'J%' OR "OBJECT_NAME" LIKE 'V%') 15 - filter("OBJECT_NAME" LIKE 'I%' OR "OBJECT_NAME" LIKE 'V%') 18 - filter("OBJECT_NAME" LIKE 'H%' OR "OBJECT_NAME" LIKE 'V%') 21 - filter("OBJECT_NAME" LIKE 'G%' OR "OBJECT_NAME" LIKE 'V%') 24 - filter("OBJECT_NAME" LIKE 'F%' OR "OBJECT_NAME" LIKE 'V%') 27 - filter("OBJECT_NAME" LIKE 'E%' OR "OBJECT_NAME" LIKE 'V%') 30 - filter("OBJECT_NAME" LIKE 'D%' OR "OBJECT_NAME" LIKE 'V%') 33 - filter("OBJECT_NAME" LIKE 'C%' OR "OBJECT_NAME" LIKE 'V%') 36 - filter("OBJECT_NAME" LIKE 'B%' OR "OBJECT_NAME" LIKE 'V%') 39 - filter("OBJECT_NAME" LIKE 'A%' OR "OBJECT_NAME" LIKE 'V%') --后者执行计划: SQL> explain plan for 2 select 3 sum(case when object_name like 'A%' or object_name like 'V%' then 1 else 0 end) N0, 4 sum(case when object_name like 'B%' or object_name like 'V%' then 1 else 0 end) N1, 5 sum(case when object_name like 'C%' or object_name like 'V%' then 1 else 0 end) N2, 6 sum(case when object_name like 'D%' or object_name like 'V%' then 1 else 0 end) N3, 7 sum(case when object_name like 'E%' or object_name like 'V%' then 1 else 0 end) N4, 8 sum(case when object_name like 'F%' or object_name like 'V%' then 1 else 0 end) N5, 9 sum(case when object_name like 'G%' or object_name like 'V%' then 1 else 0 end) N6, 10 sum(case when object_name like 'H%' or object_name like 'V%' then 1 else 0 end) N7, 11 sum(case when object_name like 'I%' or object_name like 'V%' then 1 else 0 end) N8, 12 sum(case when object_name like 'J%' or object_name like 'V%' then 1 else 0 end) N9 13 from a; Explained. Elapsed: 00:00:00.01 SQL> @getplan 'general,outline,starts' Enter value for plan type: PLAN_TABLE_OUTPUT -------------------------------------------------------------------------------------------- Plan hash value: 3918351354 --------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | --------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | 66 | 12349 (1)| 00:02:29 | | 1 | SORT AGGREGATE | | 1 | 66 | | | | 2 | TABLE ACCESS FULL| A | 3097K| 194M| 12349 (1)| 00:02:29 | --------------------------------------------------------------------------- Note ----- - dynamic sampling used for this statement (level=2) 可以看出,前者10次全表扫描,后者1次全表扫描。从而时间上也大大降低了。由58s降低到19s。 优化这个sql主要还是思路的转换,难点在于怎样把10次全表扫描转化成1次全表扫描。 在OLAP中,可以加并行使sql速度更快。

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

豆包app里会有很多ai创作的功能,那么豆包app有什么功能呢?用户们可以通过这个软件来创作绘画,和ai进行聊天,还能够为用户生成文章,帮助大家搜索歌曲等。这篇豆包app功能介绍就能够告诉大家具体的操作方法,下面就是具体内容,赶紧看看吧!豆包app有什么功能答:可以绘画、聊天、写文、找歌。功能介绍:1、问题查询:可以通过ai来更快的找到问题的答案,什么样的问题都是可以询问。2、图片生成:可以有ai来为大家创建不同的图片,只需要告诉大家大概的要求。3、ai聊天:能够为用户们创建一个可以聊天的ai,

vivox100s和x100手机都是vivo手机产品线中的代表机型,它们分别代表了vivo在不同时间段内的高端技术水平,因此这两款手机在设计、性能和功能上均有一定区别。本文将从性能对比和功能解析两个方面对这两款手机进行详细比较,帮助消费者更好地选择适合自己的手机。首先,我们来看vivox100s和x100在性能方面的对比。vivox100s搭载了最新的

JPA和MyBatis:功能与性能对比分析引言:在Java开发中,持久化框架扮演着非常重要的角色。常见的持久化框架包括JPA(JavaPersistenceAPI)和MyBatis。本文将对这两个框架的功能和性能进行对比分析,并提供具体的代码示例。一、功能对比:JPA:JPA是JavaEE的一部分,提供了一种面向对象的数据持久化解决方案。它通过注解或X

随着互联网的快速发展,自媒体这个概念已经深入人心。那么,自媒体到底是什么?它有哪些主要特点和功能呢?接下来,我们将一一探讨这些问题。一、自媒体到底是什么?自媒体,顾名思义,就是自己就是媒体。它是指通过互联网平台,个人或者团队可以自主创建、编辑、发布和传播内容的信息载体。不同于传统媒体,如报纸、电视、电台等,自媒体具有更强的互动性和个性化,让每个人都能成为信息的生产者和传播者。二、自媒体的主要特点和功能有哪些?1.低门槛:自媒体的崛起降低了进入媒体行业的门槛,不再需要繁琐的设备和专业的团队,一部手

《探索Discuz:定义、功能及代码示例》随着互联网的迅猛发展,社区论坛已经成为人们获取信息、交流观点的重要平台。在众多的社区论坛系统中,Discuz作为国内较为知名的一种开源论坛软件,备受广大网站开发者和管理员的青睐。那么,什么是Discuz?它又有哪些功能,能为我们的网站提供怎样的帮助呢?本文将对Discuz进行详细介绍,并附上具体的代码示例,帮助读者更

蓝牙适配器是干什么的随着科技的不断发展,无线通信技术也得到了快速的发展和普及。其中,蓝牙技术作为一种短距离无线通信技术,广泛地应用于各种设备之间的数据传输和连接。而蓝牙适配器则是作为支持蓝牙通信的重要设备,扮演着至关重要的角色。蓝牙适配器是一种能够将非蓝牙设备变为支持蓝牙通信的设备。它通过将无线信号转换为蓝牙信号,实现设备之间的无线连接和数据传输。蓝牙适配器

PHP技巧:快速实现返回上一页功能在网页开发中,经常会遇到需要实现返回上一页的功能。这样的操作可以提高用户体验,让用户更加方便地在网页之间进行导航。在PHP中,我们可以通过一些简单的代码来实现这一功能。本文将介绍如何快速实现返回上一页功能,并提供具体的PHP代码示例。在PHP中,我们可以使用$_SERVER['HTTP_REFERER']来获取上一页的URL

随着小红书在年轻人中的流行,越来越多的人开始利用这一平台分享各方面的经验和生活见解。如何有效管理多个小红书账号成为一个关键问题。在本文中,我们将讨论一些小红书账号管理软件的功能,并探讨如何更好地经营小红书账号。随着社交媒体的发展,许多人发现自己需要管理多个社交账号。对于小红书用户来说,这也是一个挑战。一些小红书账号管理软件可以帮助用户更轻松地管理多个账号,包括自动发布内容、定时发布、数据分析等功能。通过这些工具,用户可以更高效地管理他们的账号,提高账号的曝光率和关注度。另一、小红书账号管理软件有
