我要投搞

标签云

收藏小站

爱尚经典语录、名言、句子、散文、日志、唯美图片

当前位置:六合图库 > 多数据 >

数据库的多表大数据查询应如何优化?

归档日期:07-03       文本归类:多数据      文章编辑:爱尚语录

  oracle数据库中现有10张客户信息表,其中5张表是每张400万条记录,另5张表是每张10万条记录,每张表都有一个通用主键cust_id(客户号)。现在前台需要显示每个客户的所有信息,也就是说...

  oracle数据库中现有10张客户信息表,其中5张表是每张400万条记录,另5张表是每张10万条记录,每张表都有一个通用主键cust_id(客户号)。

  现在前台需要显示每个客户的所有信息,也就是说根据客户号查询这10张表,但只取其中的部分有用字段,由于表太多数据量太大,肯定不能在前台直接查询原表,那么问题来了:

  建立实表,然后在过程中建立5张临时表,这5张临时表分别存储一张400w与一张10w的数据,最后再把这5张表合并到那张实表。

  建立合并的实表,然后在过程中建立4张临时表,第一张临时表加载两张表的数据(配合随意),第二张临时表加载第一张临时表与另外两张业务表连接后的数据,第三张再加载第二张连接两张业务表的数据,这样以此类推,最后合并的实表正好加载完。

  可选中1个或多个下面的关键词,搜索相关资料。也可直接点“搜索资料”搜索整个问题。

  知道合伙人软件行家采纳数:530获赞数:3023毕业于南京大学,硕士学位。10年软件研发经验。现任信息系统架构师。向TA提问展开全部1.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如:

  可以在num上设置默认值0,确保表中num列没有null值,然后这样查询:

  2.应尽量避免在 where 子句中使用!=或操作符,否则将引擎放弃使用索引而进行全表扫描。优化器将无法通过索引来确定将要命中的行数,因此需要搜索该表的所有行。

  3.应尽量避免在 where 子句中使用 or 来连接条件,否则将导致引擎放弃使用索引而进行全表扫描,如:

  5.尽量避免在索引过的字符数据中,使用非打头字母搜索。这也使得引擎无法利用索引。

  即使NAME字段建有索引,前两个查询依然无法利用索引完成加快操作,引擎不得不对全表所有数据逐条操作来完成任务。而第三个查询能够使用索引来加快操作。

  6.必要时强制查询优化器使用某个索引,如在 where 子句中使用参数,也会导致全表扫描。因为SQL只有在运行时才会解析局部变量,但优化程序不能将访问计划的选择推迟到运行时;它必须在编译时进行选择。然而,如果在编译时建立访问计划,变量的值还是未知的,因而无法作为索引选择的输入项。如下面语句将进行全表扫描:

  7.应尽量避免在 where 子句中对字段进行表达式操作,这将导致引擎放弃使用索引而进行全表扫描。如:

  即:任何对列的操作都将导致表扫描,它包括数据库函数、计算表达式等等,查询时要尽可能将操作移至等号右边。

  8.应尽量避免在where子句中对字段进行函数操作,这将导致引擎放弃使用索引而进行全表扫描。如:

  9.不要在 where 子句中的“=”左边进行函数、算术运算或其他表达式运算,否则系统将可能无法正确使用索引。

  10.在使用索引字段作为条件时,如果该索引是复合索引,那么必须使用到该索引中的第一个字段作为条件时才能保证系统使用该索引,否则该索引将不会被使用,并且应尽可能的让字段顺序与索引顺序相一致。

  两者产生相同的结果,但是后者的效率显然要高于前者。因为后者不会产生大量锁定的表扫描或是索引扫描。

  展开全部视图的唯一优势就是简化开发时查询的SQL,效率上和直接查询没有区别。

  而实体表可以用来做汇聚,这个虽然查询很快但缺点是它是静态的,如果客户信息发生变化就要重新汇聚才能保证信息准确。更多追问追答追问因为要在前台进行查询啊,如果直接在前台的程序中直接进行sql即时查询,400w+的数据一张一张的连接费时的很,所以要考虑直接在数据库中用一张表存储拼接后的各业务数据,这样前台用到的时候直接去查这张表就行了追答那就是做汇聚咯,静态表肯定是最快的。但缺点我上面也提到了。追问重新汇聚的缺点不用考虑,因为业务表也是每天都要重新加载的,主要问题还是怎么做表汇聚,如何优化速度更快追答汇聚就后台执行,搞个定时的批处理或者使用oracle的job,每天凌晨1点左右跑一次汇聚的sql。

本文链接:http://lcvam.com/duoshuju/641.html