1. oracle两张表union all的时候取 count有两种sql写法,哪种效率比较好
应该是一样快的……
其实我一开始也不清楚,但是手头正好有大表,于是自己动手试了试,实验表的数量级为3亿,这是一般实际项目中能涉及到的最大数量级了。
实践结果表明二者耗费是等同的。但是过程实际上是存在差别的。
首先我们可以排除两种方法括号外的耗费。因为无论是select sum 还是 select count(*) 都基本不占用多少资源。大部分资源都被括号里面的sql所占用了。
你的第一种方法相当于分别计算两次select count(*) as tmpcount from tab 这个操作,然后最终耗费时间相当于两次操作的计算之和。
第二种方法则是一次性计算出select * as tmpcount from tab1 union all select * as tmpcount from tab2 这个操作的耗费。
不过因为实际无论是第一种还是第二种,本质上都是遍历两个表。所有即便第一种耗费为600+400=1000,第二种耗费为1000,两者效率依然是一样的。
2. oracle sql语句的union效率问题【急】【急】【急】
把语句贴出来,你不要group by的吗?是不是忘记了?如果有的话请先执行嵌套表S1,s1可以查询出来了再做聚合
select s1.vendorid, s1.dn,s1.node, SUM(clear_ring) ration
from (
/*情况1*/ select his.vendorid,
his.node,
his.dn,
his.occur_time,
his.clr_time,
clear_ring
from rt_data_al_00_ecpex his
where his.occur_time <=
to_date('2008-4-12 23:59:00','yyyy-mm-dd hh24:mi:ss')
and his.clr_time >
to_date('2008-4-12 23:59:00','yyyy-mm-dd hh24:mi:ss')
and vendorid=3
and network_type=15 and clr_by='system'
union all
/*情况2*/
--sql省略,跟第一种情况想象,因为补充问题有字数限制,所以不再粘贴
) s1
group by s1.vendorid, s1.dn,s1.node
3. sql中union 和 union all的区别
UNION用的比较多union
all是直接连接,取到得是所有值,记录可能有重复
union
是取唯一值,记录没有重复
1、UNION
的语法如下:
[SQL
语句
1]
UNION
[SQL
语句
2]
2、UNION
ALL
的语法如下:
[SQL
语句
1]
UNION
ALL
[SQL
语句
2]
效率:
UNION和UNION
ALL关键字都是将两个结果集合并为一个,但这两者从使用和效率上来说都有所不同。
1、对重复结果的处理:UNION在进行表链接后会筛选掉重复的记录,Union
All不会去除重复记录。
2、对排序的处理:Union将会按照字段的顺序进行排序;UNION
ALL只是简单的将两个结果合并后就返回。
从效率上说,UNION
ALL
要比UNION快很多,所以,如果可以确认合并的两个结果集中不包含重复数据且不需要排序时的话,那么就使用UNION
ALL。
4. 将多条sql查询结果用union all 连接后速度很慢,怎么样解决
把第一个查询中的条件p.mediatypeinfoid in (...)改成内连接:
inner join (...) s0 on p.mediatypeinfoid = s0.id
即用子查询作为内连接的table。
5. sql哪些操作降低效率,哪些提升效率
1. SQL优化的原则是:将一次操作需要读取的BLOCK数减到最低,即在最短的时间达到最大的数据吞吐量。
调整不良SQL通常可以从以下几点切入:
? 检查不良的SQL,考虑其写法是否还有可优化内容
? 检查子查询 考虑SQL子查询是否可以用简单连接的方式进行重新书写
? 检查优化索引的使用
? 考虑数据库的优化器
2. 避免出现SELECT * FROM table 语句,要明确查出的字段。
3. 在一个SQL语句中,如果一个where条件过滤的数据库记录越多,定位越准确,则该where条件越应该前移。
4. 查询时尽可能使用索引覆盖。即对SELECT的字段建立复合索引,这样查询时只进行索引扫描,不读取数据块。
5. 在判断有无符合条件的记录时建议不要用SELECT COUNT (*)和select top 1 语句。
6. 使用内层限定原则,在拼写SQL语句时,将查询条件分解、分类,并尽量在SQL语句的最里层进行限定,以减少数据的处理量。
7. 应绝对避免在order by子句中使用表达式。
8. 如果需要从关联表读数据,关联的表一般不要超过7个。
9. 小心使用 IN 和 OR,需要注意In集合中的数据量。建议集合中的数据不超过200个。
10. <> 用 < 、 > 代替,>用>=代替,<用<=代替,这样可以有效的利用索引。
11. 在查询时尽量减少对多余数据的读取包括多余的列与多余的行。
12. 对于复合索引要注意,例如在建立复合索引时列的顺序是F1,F2,F3,则在where或order by子句中这些字段出现的顺序要与建立索引时的字段顺序一致,且必须包含第一列。只能是F1或F1,F2或F1,F2,F3。否则不会用到该索引。
13. 多表关联查询时,写法必须遵循以下原则,这样做有利于建立索引,提高查询效率。格式如下select sum(table1.je) from table1 table1, table2 table2, table3 table3 where (table1的等值条件(=)) and (table1的非等值条件) and (table2与table1的关联条件) and (table2的等值条件) and (table2的非等值条件) and (table3与table2的关联条件) and (table3的等值条件) and (table3的非等值条件)。
注:关于多表查询时from 后面表的出现顺序对效率的影响还有待研究。
14. 子查询问题。对于能用连接方式或者视图方式实现的功能,不要用子查询。例如:select name from customer where customer_id in ( select customer_id from order where money>1000)。应该用如下语句代替:select name from customer inner join order on customer.customer_id=order.customer_id where order.money>100。
15. 在WHERE 子句中,避免对列的四则运算,特别是where 条件的左边,严禁使用运算与函数对列进行处理。比如有些地方 substring 可以用like代替。
16. 如果在语句中有not in(in)操作,应考虑用not exists(exists)来重写,最好的办法是使用外连接实现。
17. 对一个业务过程的处理,应该使事物的开始与结束之间的时间间隔越短越好,原则上做到数据库的读操作在前面完成,数据库写操作在后面完成,避免交叉。
18. 请小心不要对过多的列使用列函数和order by,group by等,谨慎使用disti软件开发t。
19. 用union all 代替 union,数据库执行union操作,首先先分别执行union两端的查询,将其放在临时表中,然后在对其进行排序,过滤重复的记录。
当已知的业务逻辑决定query A和query B中不会有重复记录时,应该用union all代替union,以提高查询效率。
数据更新的效率
1. 在一个事物中,对同一个表的多个insert语句应该集中在一起执行。
2. 在一个业务过程中,尽量的使insert,update,delete语句在业务结束前执行,以减少死锁的可能性。
数据库物理规划的效率
为了避免I/O的冲突,我们在设计数据库物理规划时应该遵循几条基本的原则(以ORACLE举例):
?? table和index分离:table和index应该分别放在不同的tablespace中。
?? Rollback Segment的分离:Rollback Segment应该放在独立的Tablespace中。
?? System Tablespace的分离:System Tablespace中不允许放置任何用户的object。(mssql中primary filegroup中不允许放置任何用户的object)
?? Temp Tablesace的分离:建立单独的Temp Tablespace,并为每个user指定default Temp Tablespace
??避免碎片:但segment中出现大量的碎片时,会导致读数据时需要访问的block数量的增加。对经常发生DML操作的segemeng来说,碎片是不能完全避免的。所以,我们应该将经常做DML操作的表和很少发生变化的表分离在不同的Tablespace中。
当我们遵循了以上原则后,仍然发现有I/O冲突存在,我们可以用数据分离的方法来解决。
?? 连接Table的分离:在实际应用中经常做连接查询的Table,可以将其分离在不同的Taclespace中,以减少I/O冲突。
?? 使用分区:对数据量很大的Table和Index使用分区,放在不同的Tablespace中。
在实际的物理存储中,建议使用RAID。日志文件应放在单独的磁盘中。
6. 关于SQL union操作的效率问题
你的第一个 明显比第二个快,第二个太多子查询了
对于union,不用追究太多,它只是最终将结果组合在一起而已。效率在于你union前后的语句体现上。
7. sql语句or与union all的执行效率哪个更高
这么写比较好,
SQL code
select * from table where table_column in(1,2)
8. SQL语句中:UNION与UNION ALL的区别
1、UNION和UNION
ALL关键字都是将两个结果集合并为一个,但这两者从使用和效率上来说都有所不同。
2、对重复结果的处理:UNION在进行表链接后会筛选掉重复的记录,Union
All不会去除重复记录。
3、对排序的处理:Union将会按照字段的顺序进行排序;UNION
ALL只是简单的将两个结果合并后就返回。
4、从效率上说,UNION
ALL
要比UNION快很多,所以,如果可以确认合并的两个结果集中不包含重复数据且不需要排序时的话,那么就使用UNION
ALL。
9. union all 一定比 多条SQL性能好吗
别人用union all来代替一般查询的时候
一般情况好像是代替 带有OR条件的WHERE语句
比方LZ的查询是
select count(userid) from userinfo where sex = '男' OR sex = '女'
由于OR引起全表扫描 并且不能用到索引
所以改为 union all 的方式代替带OR的WHERE语句
我用的SQLSERVER
运行的语句可以看 执行计划或用SQL命令来看IO消耗与CPU消耗 来判断哪种性能高
SET STATISTICS IO ON
SET STATISTICS TIME ON
在查询结果‘消息’选项卡 就能看到
10. sql中,只使用union和先union all再distinct,两种方式哪个效率高
Distinct可以说是数据查询中最耗时最耗性能的操作了,去重统计是数据查询不可言说的痛,所以不到万不得已不要用,另外,union all 后在distinct的效率如果更高的话,那union存在的意义是什么?所以可想而知,union的效率更高啊