SQL优化

SQL优化

0
推荐
1359
浏览

SPL 简化 SQL 案例详解:分组关联

在数据库应用开发中,我们经常需要面对复杂的SQL式计算,比如多层分组中的关联计算。在SQL中,分组必须同时进行汇总计算,并且不能进行对象式关联访问,因此处理这类问题会比较复杂,只能用窗口函数嵌套多层子查...

润乾软件 发表了文章 • 2019-06-24 09:54

0
推荐
1563
浏览

SPL 简化 SQL 案例详解:多级关联

在数据库应用开发中,我们经常需要面对复杂的SQL式计算,多级关联就是其中一种。SQL的join语句比较抽象,只适合表达简单的关联关系,一旦关联的层级较多,相应的代码就会变得非常复杂。而SPL则可以利用对象引用来...

润乾软件 发表了文章 • 2019-06-24 09:38

0
推荐
1411
浏览

SPL 简化 SQL 案例详解:多层固定分组

在数据库应用开发中,我们经常需要面对各种复杂的SQL计算,多层固定分组就是其中一种。实现该算法的思路是用left join语句将源数据按照固定的依据对齐,但由于该算法往往涉及分组汇总、行间计算、填补缺失数据,...

润乾软件 发表了文章 • 2019-05-22 10:39

0
推荐
1463
浏览

如何用外部程序优化SQL语句中的IN和EXISTS

数据结构IN 和 EXISTS 是 SQL 中常见的复杂条件,在将 SQL(存储过程)转换成库外计算获取高性能时也会面对这些问题。本文将以 TPC-H 定义的模型为基础,介绍如何用集算器的语法实现 IN、EXISTS 并做优化。TPC-H ...

润乾软件 发表了文章 • 2018-11-20 16:12

0
推荐
1792
浏览

【老贝伏枥】Index解析

1、索引的种类  常用的index按物理属性有B-Tree Index(常规树)、B Tree(二叉树)、B+Tree、Bitmap Index(位图)、Reverse Index(反向)、Hash Index、分区和非分区Index。按使用方法上划分有 唯一和非唯一索引...

贝克汉姆 发表了文章 • 2018-07-10 16:51

0
投票
3
回答
1588
浏览

求助,多表联合视图的索引问题

BILizzy 回复了问题 • 2015-12-04 17:38
2
推荐
11360
浏览

Oracle SQL性能优化经典案例分享必看

一、SQL优化的本质一般来说,SQL优化是让SQL运行得更快,使SQL更快的方式有很多,比如提高索引的使用效率,或者并行查询。可以看到里面的公式:执行效率或者一般说的执行时间,是和完成一次SQL所需要访问的资源总...

dandan_14104 发表了文章 • 2015-11-25 20:48

0
投票
2
已解决
2968
浏览

oracle多个关键字模糊查询问题

xiaob786 回复了问题 • 2015-11-18 09:41
0
投票
2
回答
1976
浏览
0
投票
1
已解决
2040
浏览
0
投票
5
已解决
3381
浏览
0
投票
2
已解决
3446
浏览
0
投票
1
已解决
2142
浏览
0
投票
3
已解决
7129
浏览

1万6千条数据left join 特别慢 求优化sql

seng 回复了问题 • 2015-11-02 11:27
0
投票
2
已解决
3014
浏览
条新动态, 点击查看
梁勇

梁勇 回答了问题 • 2015-10-15 10:29 • 3 个回复 不感兴趣

oracle中单表有上亿记录sql优化与并发性能处理?

赞同来自:

看题目意思,面试的Java职位,估计事物系统。估计主要提供一定的思路。。优化这块,还是在索引、分区等角度考虑。。Oracle数据库优化主要从哪几方面入手? http://www.flybi.net/question/633 可以参考下这个。
看题目意思,面试的Java职位,估计事物系统。估计主要提供一定的思路。。优化这块,还是在索引、分区等角度考虑。。Oracle数据库优化主要从哪几方面入手? http://www.flybi.net/question/633 可以参考下这个。
老头子

老头子 回答了问题 • 2015-10-22 11:02 • 2 个回复 不感兴趣

ORACLE删除重复记录求优化

赞同来自:

发下你的执行计划,看下是不是发生了视图合并?
2、3w的数据量不大
 
还有最好不要group by那几个字段
DELETE
    FROM   "table"
    WHERE  "RowID" NOT IN (S... 显示全部 »
发下你的执行计划,看下是不是发生了视图合并?
2、3w的数据量不大
 
还有最好不要group by那几个字段
DELETE
    FROM   "table"
    WHERE  "RowID" NOT IN (SELECT MAX("RowID")
                         FROM   "table"
                         GROUP BY
                                "aaa",
                                "bbb",
                                "ccc"
                         HAVING COUNT(*) >= 1);
可以把group by换成表关联,group by 和 having 效率较低。
DELETE
    FROM   "table" a
    WHERE  "RowID" NOT IN (SELECT MAX("RowID")
                         FROM   "table" b
                         where a.aaa = b.aaa and
                               a.bbb = b.bbb and
                               a.ccc = b.ccc
                          );
 
ps: 在关联的时候注意对空值的处理
RID查找,又称书签查找,键查找,就是非聚集索引的RID先查询到聚集索引的键值,再根据这个键值查询到具体的记录。
缺点:
书签查找(键查找)要求索引页面访问之外的数据页面访问。访问两组页面增加了查询逻辑读操作次数。而且,如果页面不在内存中,书签查找(键查找)可... 显示全部 »
RID查找,又称书签查找,键查找,就是非聚集索引的RID先查询到聚集索引的键值,再根据这个键值查询到具体的记录。
缺点:
书签查找(键查找)要求索引页面访问之外的数据页面访问。访问两组页面增加了查询逻辑读操作次数。而且,如果页面不在内存中,书签查找(键查找)可能需要在磁盘上的一个随机(非顺序)I/O操作来从索引页面跳转到数据页面,还需要必要的CPU能力来汇集这一数据并执行必要的操作。

为了从非聚集索引中获益,查询应该请求相对少的行。
如果请求的行相对较多,那么在有聚集索引的情况下,尽量指定走聚集索引。
使用聚集索引和表扫描时不存在书签查找(RID查找、键查找)。

书签查找(RID查找、键查找)的起因:
如果查询的各部分(不只是选择列表)中引用的列不都包含在使用的非聚集索引中,就会发生书签查找(键查找)。

解决书签查找(RID查找、键查找)
使用一个聚集索引:有局限性,因为一个表只能有一个聚集索引。
使用一个覆盖索引:要么添加到索引列,要么INCLUDE包含这些列。推荐首选
使用聚集索引列作为SELECT子句的查询列。
 
使用索引联接:
如果覆盖索引变得非常宽,使用多个窄索引的索引连接也可以作为避免书签查找(RID查找、键查找)的一种技术。
优点:
    多个窄索引和宽的覆盖索引相比,可以为更大量的查询提供服务。
    窄索引比宽的覆盖索引需要的维护开销更小。

通常来说,可以先创建窄索引,看优化器是否利用了多个窄索引的索引连接。如果没有的话,那就是用覆盖索引,尽量少用复合索引。

如果一个表没有聚集索引,只有非聚集索引,那么在查询一个大的结果集时,表扫描比通过非聚集索引再通过书签查找(RID查找、键查找)性能更好。
 
 
flybi_xw

flybi_xw 回答了问题 • 2015-10-23 15:01 • 3 个回复 不感兴趣

sqlserver怎么优化group by

赞同来自:

你的需求,不需要group by .直接去掉。
select distinct A from table with(Nolock) where    A in(几千条数据)
还慢的话,把in 换成 join
你的需求,不需要group by .直接去掉。
select distinct A from table with(Nolock) where    A in(几千条数据)
还慢的话,把in 换成 join
gogodiy

gogodiy 回答了问题 • 2015-10-26 09:18 • 2 个回复 不感兴趣

请教下大神们,我这个SQL语句该怎么优化下

赞同来自:

--MSSQL2008R2及以上版本:
;WITH AAA AS
(
SELECT pk,
COUNT(name) as total
FROM b
GROUP BY pk
)
SELECT *
FROM a INNER JOIN
AAA AS... 显示全部 »
--MSSQL2008R2及以上版本:
;WITH AAA AS
(
SELECT pk,
COUNT(name) as total
FROM b
GROUP BY pk
)
SELECT *
FROM a INNER JOIN
AAA AS b ON a.pk=b.pk
WHERE a.ID_NO='111'
ORDER BY b.total DESC;
gogodiy

gogodiy 回答了问题 • 2015-10-26 11:00 • 3 个回复 不感兴趣

SQL多条件优化查询

赞同来自:

除非数据量很小,否则不建议使用CHARINDEX,IN等语法,还是建议将需要匹配的值保存到临时表,创建合适索引后,使用表关联方式进行查询。
MSSQL2008R2及以上版本,也可以使用CTE先保存查询匹配值,然后关联CTE进行查询。
除非数据量很小,否则不建议使用CHARINDEX,IN等语法,还是建议将需要匹配的值保存到临时表,创建合适索引后,使用表关联方式进行查询。
MSSQL2008R2及以上版本,也可以使用CTE先保存查询匹配值,然后关联CTE进行查询。
gogodiy

gogodiy 回答了问题 • 2015-10-27 18:49 • 2 个回复 不感兴趣

求助:Oracle数据库多个大数据表查询慢的问题

赞同来自:

Oracle用的不多,根据MSSQL和MYSQL的优化经验,无非从几个方面入手:
1.硬件是否有升级的可能。很多时候升级硬件能解决不少问题。
2.分析需求,是否需要那么多的数据量。比如常见的分页,其实看的也就是前10页比较多,那重点就放在前10页数据的提取上。... 显示全部 »
Oracle用的不多,根据MSSQL和MYSQL的优化经验,无非从几个方面入手:
1.硬件是否有升级的可能。很多时候升级硬件能解决不少问题。
2.分析需求,是否需要那么多的数据量。比如常见的分页,其实看的也就是前10页比较多,那重点就放在前10页数据的提取上。
3.看执行计划,找到瓶颈所在,分析原因是没有索引、索引使用不当、索引列统计信息未更新,或是和其他查询阻塞甚至导致死锁。
4.分析可能的结果集,尽量将减少结果集的表关联放在最前面,提供附属信息的表关联放到后面。
5.个人一家之言——坚决不用视图。Oracle除了物化视图,其他类型的都是虚拟表,就是保存了一段事先准备好的查询代码,而且你还无法确定查询条件,只能提供一个大而全的功能。你查询视图,本质是转化为对这段代码的查询,查询性能根本没什么提高。还不如直接表关联,还能控制代码。你用物化视图的话,刷新视图的开销又吃不消。
 
 
老头子

老头子 回答了问题 • 2015-11-01 15:48 • 3 个回复 不感兴趣

1万6千条数据left join 特别慢 求优化sql

赞同来自:

执行计划也发一下才能给你定位问题,如果不发的话不知道你表上有没有索引,不知道你的统计信息是否最新,也不知道你的数据分布,任何优化都是盲目瞎猜。
不过你不发执行计划,单看你的SQL,能给出的建议只有以下几点:

1. tmp_table 建立email + id... 显示全部 »
执行计划也发一下才能给你定位问题,如果不发的话不知道你表上有没有索引,不知道你的统计信息是否最新,也不知道你的数据分布,任何优化都是盲目瞎猜。
不过你不发执行计划,单看你的SQL,能给出的建议只有以下几点:

1. tmp_table 建立email + id + mobilenum 的组合索引
2. hui_user  建立email + id + meetid 索引
3. 去掉子查询
改写成:
select tt.id,tt.email,tt.mobilenum
  from tmp_table  tt
  left join hui_user u
   on tt.email = usr.email
  and u.meetid = 411 ;
老头子

老头子 回答了问题 • 2015-11-02 15:36 • 1 个回复 不感兴趣

分区表 为什么不能建立 全局索引呢?

赞同来自:

分区表可以建立全局索引,但是只能建立全局前缀索引,也就是说索引的第一个字段必须是分区字段。
你的这个SYS_C0011183索引应该是某个约束,系统自建的索引。你要删除这个索引首先要删除约束,检查这个字段上是否有约束,比如主键等。
分区表可以建立全局索引,但是只能建立全局前缀索引,也就是说索引的第一个字段必须是分区字段。
你的这个SYS_C0011183索引应该是某个约束,系统自建的索引。你要删除这个索引首先要删除约束,检查这个字段上是否有约束,比如主键等。
seng

seng 回答了问题 • 2015-11-03 22:47 • 5 个回复 不感兴趣

oracle 分页查询中计算总页数的count(*) 效率问题

赞同来自:

SELECT ROWNUM AS rowno, t.*
          FROM emp t
         WHERE  ROWNUM <= 200
这个随机取数据的吧, 因该不要排序的,只要前200条

count(*)要扫描全表或索引, 就慢... 显示全部 »
SELECT ROWNUM AS rowno, t.*
          FROM emp t
         WHERE  ROWNUM <= 200
这个随机取数据的吧, 因该不要排序的,只要前200条

count(*)要扫描全表或索引, 就慢了。 有索引读取数据量就少,会快点。 应该有主键吧?
gogodiy

gogodiy 回答了问题 • 2015-11-04 11:57 • 2 个回复 不感兴趣

各位大神看看下面两段SQL的效率不一样还是?

赞同来自:

第一种方式:使用默认隔离级别(已提交读,如果没人为更改的话),因此数据库会为这个查询申请一个共享锁(S),如果对象表正被INSERT、UPDATE、DELETE的话,你的查询就需要等待,因为此时表处于排他锁(X),共享锁级别低,被排他锁排斥,必须等待操作完毕才... 显示全部 »
第一种方式:使用默认隔离级别(已提交读,如果没人为更改的话),因此数据库会为这个查询申请一个共享锁(S),如果对象表正被INSERT、UPDATE、DELETE的话,你的查询就需要等待,因为此时表处于排他锁(X),共享锁级别低,被排他锁排斥,必须等待操作完毕才能执行查询。但可以保证得到的数据是最新的。同时由于只有表名,没有其他标志,如果系统在同一个实例下,在其他数据库、其他架构下也有同名数据表,那么实际查询的会是dbo.contract表,不一定是你真正想要查询的。在高并发情况下,容易发生阻塞。
第二种方式:使用with(nolock)后,等于是强制将隔离级别从默认的已提交读,被降级为未提交读,也即是系统不会为了这个查询申请一个共享锁(S),避免被排他锁(X)排斥,但是查询到的数据有可能是修改之前的版本。
总结:
方法1适合对数据准确性要求高的OLTP中
方法2适合数据量小,对数据准确性要求不高的系统中,比如报表统计等等。
另外说一点:
查询的表名,最好还是按照数据库名.架构名.表名的方式。
 
未考虑你系统的全貌,如果仅仅是为了这个大表的分析查询,你可以用Infobright试试。
列存数据库,开源,也是基于Mysql的。Community Edition只能够LOAD,不能做DML,但如果你的数据主要是用于查询,且更新不是很频繁,还正好适用,速度一... 显示全部 »
未考虑你系统的全貌,如果仅仅是为了这个大表的分析查询,你可以用Infobright试试。
列存数据库,开源,也是基于Mysql的。Community Edition只能够LOAD,不能做DML,但如果你的数据主要是用于查询,且更新不是很频繁,还正好适用,速度一般是传统数据库的5-10倍,压缩比大约是1:10,也就是说即使你有1T的数据,放进去也就是100G。
 
如果需求仅限于此,不妨尝试。
老头子

老头子 回答了问题 • 2015-11-17 14:57 • 2 个回复 不感兴趣

oracle多个关键字模糊查询问题

赞同来自:

使用substr取出两个值,然后再进行过程计算:
with laotouzi as 
(
select '建行 南京' as para from dual
)
select 
substr(para,1,instr(para,' ')-1),substr(pa... 显示全部 »
使用substr取出两个值,然后再进行过程计算:
with laotouzi as 
(
select '建行 南京' as para from dual
)
select 
substr(para,1,instr(para,' ')-1),substr(para,instr(para,' ')+1)
from laotouzi
0
投票
3
回答
1588
浏览

求助,多表联合视图的索引问题

BILizzy 回复了问题 • 2015-12-04 17:38
0
投票
2
已解决
2968
浏览

oracle多个关键字模糊查询问题

xiaob786 回复了问题 • 2015-11-18 09:41
0
投票
2
回答
1976
浏览
0
投票
5
已解决
3381
浏览
0
投票
2
已解决
3446
浏览
0
投票
1
已解决
2142
浏览
0
投票
3
已解决
7129
浏览
0
投票
2
已解决
3014
浏览
0
投票
3
已解决
1953
浏览

SQL多条件优化查询

老头子 回复了问题 • 2015-10-26 11:21
0
投票
2
已解决
1614
浏览
0
投票
3
已解决
2472
浏览
0
投票
2
已解决
1914
浏览
0
推荐
1359
浏览

SPL 简化 SQL 案例详解:分组关联

在数据库应用开发中,我们经常需要面对复杂的SQL式计算,比如多层分组中的关联计算。在SQL中,分组必须同时进行汇总计算,并且不能进行对象式关联访问,因此处理这类问题会比较复杂,只能用窗口函数嵌套多层子查...

润乾软件 发表了文章 • 2019-06-24 09:54

0
推荐
1563
浏览

SPL 简化 SQL 案例详解:多级关联

在数据库应用开发中,我们经常需要面对复杂的SQL式计算,多级关联就是其中一种。SQL的join语句比较抽象,只适合表达简单的关联关系,一旦关联的层级较多,相应的代码就会变得非常复杂。而SPL则可以利用对象引用来...

润乾软件 发表了文章 • 2019-06-24 09:38

0
推荐
1411
浏览

SPL 简化 SQL 案例详解:多层固定分组

在数据库应用开发中,我们经常需要面对各种复杂的SQL计算,多层固定分组就是其中一种。实现该算法的思路是用left join语句将源数据按照固定的依据对齐,但由于该算法往往涉及分组汇总、行间计算、填补缺失数据,...

润乾软件 发表了文章 • 2019-05-22 10:39

0
推荐
1463
浏览

如何用外部程序优化SQL语句中的IN和EXISTS

数据结构IN 和 EXISTS 是 SQL 中常见的复杂条件,在将 SQL(存储过程)转换成库外计算获取高性能时也会面对这些问题。本文将以 TPC-H 定义的模型为基础,介绍如何用集算器的语法实现 IN、EXISTS 并做优化。TPC-H ...

润乾软件 发表了文章 • 2018-11-20 16:12

0
推荐
1792
浏览

【老贝伏枥】Index解析

1、索引的种类  常用的index按物理属性有B-Tree Index(常规树)、B Tree(二叉树)、B+Tree、Bitmap Index(位图)、Reverse Index(反向)、Hash Index、分区和非分区Index。按使用方法上划分有 唯一和非唯一索引...

贝克汉姆 发表了文章 • 2018-07-10 16:51

2
推荐
11360
浏览

Oracle SQL性能优化经典案例分享必看

一、SQL优化的本质一般来说,SQL优化是让SQL运行得更快,使SQL更快的方式有很多,比如提高索引的使用效率,或者并行查询。可以看到里面的公式:执行效率或者一般说的执行时间,是和完成一次SQL所需要访问的资源总...

dandan_14104 发表了文章 • 2015-11-25 20:48