搜索
首页数据库mysql教程类似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=&#39;A&#39;;  --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 &#39;A%&#39; or object_name like &#39;V%&#39;) a,
 (select count(*) N1 from a where object_name like &#39;B%&#39; or object_name like &#39;V%&#39;) b,
 (select count(*) N2 from a where object_name like &#39;C%&#39; or object_name like &#39;V%&#39;) c,
 (select count(*) N3 from a where object_name like &#39;D%&#39; or object_name like &#39;V%&#39;) d,
 (select count(*) N4 from a where object_name like &#39;E%&#39; or object_name like &#39;V%&#39;) e,
 (select count(*) N5 from a where object_name like &#39;F%&#39; or object_name like &#39;V%&#39;) f,
 (select count(*) N6 from a where object_name like &#39;G%&#39; or object_name like &#39;V%&#39;) g,
 (select count(*) N7 from a where object_name like &#39;H%&#39; or object_name like &#39;V%&#39;) h,
 (select count(*) N8 from a where object_name like &#39;I%&#39; or object_name like &#39;V%&#39;) i,
 (select count(*) N9 from a where object_name like &#39;J%&#39; or object_name like &#39;V%&#39;) j;
--58s
alter system flush shared_pool;
alter system flush buffer_cache;

--改写后
select 
sum(case when object_name like &#39;A%&#39; or object_name like &#39;V%&#39; then 1 else 0 end) N0,
sum(case when object_name like &#39;B%&#39; or object_name like &#39;V%&#39; then 1 else 0 end) N1, 
sum(case when object_name like &#39;C%&#39; or object_name like &#39;V%&#39; then 1 else 0 end) N2, 
sum(case when object_name like &#39;D%&#39; or object_name like &#39;V%&#39; then 1 else 0 end) N3, 
sum(case when object_name like &#39;E%&#39; or object_name like &#39;V%&#39; then 1 else 0 end) N4, 
sum(case when object_name like &#39;F%&#39; or object_name like &#39;V%&#39; then 1 else 0 end) N5, 
sum(case when object_name like &#39;G%&#39; or object_name like &#39;V%&#39; then 1 else 0 end) N6, 
sum(case when object_name like &#39;H%&#39; or object_name like &#39;V%&#39; then 1 else 0 end) N7, 
sum(case when object_name like &#39;I%&#39; or object_name like &#39;V%&#39; then 1 else 0 end) N8, 
sum(case when object_name like &#39;J%&#39; or object_name like &#39;V%&#39; 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 &#39;A%&#39; or object_name like &#39;V%&#39;) a,
  4   (select count(*) N1 from a where object_name like &#39;B%&#39; or object_name like &#39;V%&#39;) b,
  5   (select count(*) N2 from a where object_name like &#39;C%&#39; or object_name like &#39;V%&#39;) c,
  6   (select count(*) N3 from a where object_name like &#39;D%&#39; or object_name like &#39;V%&#39;) d,
  7   (select count(*) N4 from a where object_name like &#39;E%&#39; or object_name like &#39;V%&#39;) e,
  8   (select count(*) N5 from a where object_name like &#39;F%&#39; or object_name like &#39;V%&#39;) f,
  9   (select count(*) N6 from a where object_name like &#39;G%&#39; or object_name like &#39;V%&#39;) g,
 10   (select count(*) N7 from a where object_name like &#39;H%&#39; or object_name like &#39;V%&#39;) h,
 11   (select count(*) N8 from a where object_name like &#39;I%&#39; or object_name like &#39;V%&#39;) i,
 12   (select count(*) N9 from a where object_name like &#39;J%&#39; or object_name like &#39;V%&#39;) j;

Explained.

Elapsed: 00:00:00.15
SQL> @getplan
&#39;general,outline,starts&#39;

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 &#39;J%&#39; OR "OBJECT_NAME" LIKE &#39;V%&#39;)
  15 - filter("OBJECT_NAME" LIKE &#39;I%&#39; OR "OBJECT_NAME" LIKE &#39;V%&#39;)
  18 - filter("OBJECT_NAME" LIKE &#39;H%&#39; OR "OBJECT_NAME" LIKE &#39;V%&#39;)
  21 - filter("OBJECT_NAME" LIKE &#39;G%&#39; OR "OBJECT_NAME" LIKE &#39;V%&#39;)
  24 - filter("OBJECT_NAME" LIKE &#39;F%&#39; OR "OBJECT_NAME" LIKE &#39;V%&#39;)
  27 - filter("OBJECT_NAME" LIKE &#39;E%&#39; OR "OBJECT_NAME" LIKE &#39;V%&#39;)
  30 - filter("OBJECT_NAME" LIKE &#39;D%&#39; OR "OBJECT_NAME" LIKE &#39;V%&#39;)
  33 - filter("OBJECT_NAME" LIKE &#39;C%&#39; OR "OBJECT_NAME" LIKE &#39;V%&#39;)
  36 - filter("OBJECT_NAME" LIKE &#39;B%&#39; OR "OBJECT_NAME" LIKE &#39;V%&#39;)
  39 - filter("OBJECT_NAME" LIKE &#39;A%&#39; OR "OBJECT_NAME" LIKE &#39;V%&#39;)
  
  
  
  
  
--后者执行计划:  
SQL> explain plan for
  2  select
  3  sum(case when object_name like &#39;A%&#39; or object_name like &#39;V%&#39; then 1 else 0 end) N0,
  4  sum(case when object_name like &#39;B%&#39; or object_name like &#39;V%&#39; then 1 else 0 end) N1,
  5  sum(case when object_name like &#39;C%&#39; or object_name like &#39;V%&#39; then 1 else 0 end) N2,
  6  sum(case when object_name like &#39;D%&#39; or object_name like &#39;V%&#39; then 1 else 0 end) N3,
  7  sum(case when object_name like &#39;E%&#39; or object_name like &#39;V%&#39; then 1 else 0 end) N4,
  8  sum(case when object_name like &#39;F%&#39; or object_name like &#39;V%&#39; then 1 else 0 end) N5,
  9  sum(case when object_name like &#39;G%&#39; or object_name like &#39;V%&#39; then 1 else 0 end) N6,
 10  sum(case when object_name like &#39;H%&#39; or object_name like &#39;V%&#39; then 1 else 0 end) N7,
 11  sum(case when object_name like &#39;I%&#39; or object_name like &#39;V%&#39; then 1 else 0 end) N8,
 12  sum(case when object_name like &#39;J%&#39; or object_name like &#39;V%&#39; then 1 else 0 end) N9
 13  from a;

Explained.

Elapsed: 00:00:00.01
SQL> @getplan
&#39;general,outline,starts&#39;

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速度更快。




声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
使用JavaScript实现自动登录功能使用JavaScript实现自动登录功能Jun 15, 2023 pm 11:52 PM

随着互联网的发展,人们越来越依赖网络,大部分时间都在使用各种各样的网站和应用程序,这也使得我们需要记住很多账号和密码。为了方便用户的使用,很多网站提供了自动登录功能,让用户免除频繁输入账号和密码的烦恼。本文将介绍使用JavaScript实现自动登录功能的方法。一、登录流程分析在开始实现自动登录功能之前,我们需要了解整个登录流程。一般情况下,一个网站的登录流程

groupby函数的用法groupby函数的用法Sep 12, 2023 am 10:47 AM

groupby函数的用法是“DataFrame.groupby(by=None, axis=0, level=None, as_index=True, sort=True, group_keys=True, squeeze=False, observed=False, dropna=True)”。groupby函数是一种常见的数据处理函数,用于对数据进行分组操作。

如何使用PHP实现天气预报功能如何使用PHP实现天气预报功能Jun 27, 2023 pm 05:54 PM

PHP作为一款流行的后端编程语言,在Web开发领域广受欢迎。天气预报功能是一种常见的Web应用场景,基于PHP实现天气预报功能相对简单易懂。本文将介绍如何使用PHP实现天气预报功能。一、获取天气数据API要实现天气预报功能,首先需要获取天气数据。我们可以使用第三方天气API来获取实时、准确的天气数据。目前,国内主流的天气API供应商包括免费的“心知天气”和收

未来功能抢先用 Safari 技术预览 173 版本释出未来功能抢先用 Safari 技术预览 173 版本释出Jul 02, 2023 pm 01:37 PM

Apple今日释出了Safari技术预览173版本,涵盖部分可能于Safari17推出的功能。该版本适用于macOSSonoma测试版以及macOSVentura系统,有兴趣的用户可于官方网页下载。Safari技术预览173版于设定中新增了功能标志区块,取代原先开发菜单的实验功能。该区块可让开发者快速地搜索特定功能,并以不同形式将「稳定」、「可供测试」、「预览」或「开发人员」等状态标示出来。重新设计的开发菜单可以帮助创作者更容易找到关键工具,以便建立网页、网页应用程序、其他应用程序中的网页内容、

如何在PHP中实现数据的分组和统计功能如何在PHP中实现数据的分组和统计功能Sep 24, 2023 pm 01:39 PM

如何在PHP中实现数据的分组和统计功能在实际的开发过程中,经常会遇到对数据进行分组和统计的需求。无论是对数据库中的数据进行分组统计,还是对数组中的数据进行操作,PHP提供了丰富的函数和方法来满足我们的需求。下面将分别演示如何在PHP中对数据库和数组数据进行分组和统计。数据库中的数据分组和统计假设我们有一个学生成绩表,表结构如下:CREATETABLE`s

如何使用Laravel的流畅查询构建器选择计数?如何使用Laravel的流畅查询构建器选择计数?Sep 04, 2023 pm 10:17 PM

Laravel中的流畅查询构建器是一个负责创建和运行数据库查询的界面。查询构建器可以与Laravel支持的所有数据库配合良好,并且可以用来执行几乎所有数据库操作。使用流畅的查询生成器的优点是它可以防止SQL注入攻击。它利用PDO参数绑定,您可以根据需要自由发送字符串。流畅的查询构建器支持许多方法,例如count、min、max、avg、sum,可以从表中获取汇总值。现在让我们看看如何使用流畅的查询构建器来获取选择查询中的计数。要使用流畅的查询构建器,请使用数据库外观类,如下所示useIllumi

鸿蒙OS3.0的功能有什么?鸿蒙OS3.0的功能有什么?Jun 29, 2023 pm 10:53 PM

鸿蒙os3.0目前正在测试阶段,很快用户就将迎来新的系统体验了,那么相较于2.0版本,鸿蒙os3.0有什么功能呢?华为鸿蒙3.0包含了多屏协同、性能共享等功能,用户可以获得更加完善的协同体验,同时也能提升手机运行大型游戏或软件的流畅度。另外,它简化了小窗交互方式,并改进通知栏,带给你更为完美的体验,接下来就让小编给大家分析一下华为鸿蒙3.0新功能介绍,一起来了解一下吧。华为鸿蒙3.0功能介绍1、多屏协同:此前鸿蒙2.0可以在电脑手机之间互相切换使用,提高了用户的工作效率和使用体验,但此次的鸿蒙3

iOS 17更新了什么功能?iOS 17更新了什么功能?Jun 06, 2023 am 08:22 AM

Apple今日正式发表iOS17,针对电话、FaceTime、讯息等方面作出了改善,让用户得以用不同以往的方式来与他人互动。透过iOS17,用户还能够全新的「NameDrop」功能来与朋友分享自己的资讯,只要使用者将装置贴近对方装置即可。Apple还将推出《日记》App,适合用来记录统整你想要保存的信息,例如照片、位置、活动、音乐等等,App甚至能够为你提供写作范例,让记录更加简单直截,该app预计将于今年稍晚于iOS推出。升級至iOS17後,當使用者將裝置橫放時,還能夠將iPhone當作時鐘使

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
3 周前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
3 周前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
3 周前By尊渡假赌尊渡假赌尊渡假赌

热工具

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

MinGW - 适用于 Windows 的极简 GNU

MinGW - 适用于 Windows 的极简 GNU

这个项目正在迁移到osdn.net/projects/mingw的过程中,你可以继续在那里关注我们。MinGW:GNU编译器集合(GCC)的本地Windows移植版本,可自由分发的导入库和用于构建本地Windows应用程序的头文件;包括对MSVC运行时的扩展,以支持C99功能。MinGW的所有软件都可以在64位Windows平台上运行。

Atom编辑器mac版下载

Atom编辑器mac版下载

最流行的的开源编辑器

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

mPDF

mPDF

mPDF是一个PHP库,可以从UTF-8编码的HTML生成PDF文件。原作者Ian Back编写mPDF以从他的网站上“即时”输出PDF文件,并处理不同的语言。与原始脚本如HTML2FPDF相比,它的速度较慢,并且在使用Unicode字体时生成的文件较大,但支持CSS样式等,并进行了大量增强。支持几乎所有语言,包括RTL(阿拉伯语和希伯来语)和CJK(中日韩)。支持嵌套的块级元素(如P、DIV),