一张有1000w级别的table最好别深层次改动表结构(除非优化到么的办法了,那就拆ename字段,那个比较高深且代价昂贵不确定是否能优化) 首先ename加一个索引是完全ok的 然后是查询,每次过滤查询不超过此table所有数据的20%为佳,查询还有个原则就是where后右操作优先 例如: select * from tab where 1=1 and 2=2 先过滤2=2 再1=1 所以最后优化结果:select substr(t.ename,2,2) from emp t where LENGTH(t.ename)>=3 and t.ename is not nullsubstr() 各个db厂商不知道怎么实现的,如果还能优化可以再此再动动点子,原则还是把substr()集合再提前先缩小一些 以上为按照记忆中优化原则而来,欢迎指正
人家问你 select substr(ename,2,2) from emp 整表查询 你居然说建索引,呵呵,你被人家故意说的“没有索引”骗了。因为这样的整表查询建索引没有用的。如果是经常发生这样的substr(ename,2,2)查询,最好是把这个用一个单独的字段表示
首先,这里建立索引是没有用的,因为此查询没有过滤条件. 这道面试题主要考察的是你的设计能力.你要明白,在此数量级的表里substr(ename,2,2)是相当费时的,既然有如此的查询要求,就说明substr(ename,2,2)是有业务需要的,所以在设计表的时候就应该把此信息单独拿出来,增加一个字段subName,以后查询的时候直接select subName from emp就可以了. 在银行电信等大数据量的项目中,表设计是很重要的,但是目前国内很少有优秀的数据库设计人员.谢谢.
16楼的,每年那么多Java程序员面试受挫,有你的一份啊 学习了,呵呵
这个题目真正正确的答案是: 也许出题的人也没有想到,ename的substr(2,2)是什么?最多是26的平方个不重复记录。 而本题查询目的不是统计,也没有排序,所以只是想知道有哪些记录。所以本题除了查寻本身的优化外,还要考虑返回结果的优化。从查询目的而言。结果只要列出不重复的记录 即最多676条记录即可,即使要全部列出,也只要分组计数,count group by aa 230 ab 490 ac 212 .......... 这样的结果就足够达到查询目的了。
2. 创建视图。 按查询结果创建视图。应该会有所提速吧
3. 增加subEname字段, select subEname from emp。
以上我都不是十分的确定,等着高手指导。
首先ename加一个索引是完全ok的
然后是查询,每次过滤查询不超过此table所有数据的20%为佳,查询还有个原则就是where后右操作优先
例如:
select * from tab where 1=1 and 2=2
先过滤2=2 再1=1
所以最后优化结果:select substr(t.ename,2,2) from emp t where LENGTH(t.ename)>=3 and t.ename is not nullsubstr() 各个db厂商不知道怎么实现的,如果还能优化可以再此再动动点子,原则还是把substr()集合再提前先缩小一些
以上为按照记忆中优化原则而来,欢迎指正
select substr(ename,2,2) from emp
整表查询
你居然说建索引,呵呵,你被人家故意说的“没有索引”骗了。因为这样的整表查询建索引没有用的。如果是经常发生这样的substr(ename,2,2)查询,最好是把这个用一个单独的字段表示
从1000万条数据库中提取所有记录(从实际情况看,ename >=3的条件基本是全满足)。
即使每条记录只有2byte(如果是双字节是4,UTF-8是6,UTF-16是8),总数据量是:
20000000byte/1024 约 = 20000m.
20000m/1024 约 = 20G.
你们见过什么样的数据库,什么样的硬件能提供在数据库地址空间内创建这么大的临时结果集?这完全是架构总题,绝对不是结构问题。
=.=
20000000byte/1024 约 = 20000m.
20000m/1024 约 = 20G.
你再想想!!
但是1000万条数据,直接提取,先不说substr,就说en已经是length =2了,不加任何条件查询看看。这样的数据绝对不是修改结构和优化的问题,应该分区并行处理。
我以前给银行写cobol的时候数据经常是20m记录以上的(测试环境),生产环境据说一天可以有100m记录以上。
晚上跑批量谁程序没写好一不小心就一夜都跑不完囧。然后被夜班跑批量的人狂bs...
数据库能容纳多少记录和数据库和硬件环境都是有关系的10m记录绝对不算多的。。
以前在IBM小机上的数据库,几个表日产数据100k以上,只要数据库规划得好,性能没有任何问题。
一般都是用的存储阵列,好像分区的用处不大(我自己的理解)
首先,这里建立索引是没有用的,因为此查询没有过滤条件.
这道面试题主要考察的是你的设计能力.你要明白,在此数量级的表里substr(ename,2,2)是相当费时的,既然有如此的查询要求,就说明substr(ename,2,2)是有业务需要的,所以在设计表的时候就应该把此信息单独拿出来,增加一个字段subName,以后查询的时候直接select subName from emp就可以了.
在银行电信等大数据量的项目中,表设计是很重要的,但是目前国内很少有优秀的数据库设计人员.谢谢.
学习了,呵呵
也许出题的人也没有想到,ename的substr(2,2)是什么?最多是26的平方个不重复记录。
而本题查询目的不是统计,也没有排序,所以只是想知道有哪些记录。所以本题除了查寻本身的优化外,还要考虑返回结果的优化。从查询目的而言。结果只要列出不重复的记录
即最多676条记录即可,即使要全部列出,也只要分组计数,count group by
aa 230
ab 490
ac 212
..........
这样的结果就足够达到查询目的了。