【100分】金山面试题

BaronZ 2012-08-20 11:09:43
加精
题目如下:
数据库1中存放着a类数据,数据库2中存放着以天为单位划分的表30张(比如table_20110909,table_20110910,table_20110911),总共是一个月的数据。表1中的a类数据中有一个字段userid来唯一判别用户身份,表2中的30张表(每张表结构相同)也有一个字段userid来唯一识别用户身份。如何判定a类数据库的多少用户在数据库2中出现过?

1)各位高手能否说一下这道题的考点是什么
2)能否说一下你们的实现思路或者关键的sql语句
...全文
36349 169 打赏 收藏 转发到动态 举报
写回复
用AI写文章
169 条回复
切换为时间正序
请发表友善的回复…
发表回复
anshuyi2013 2014-03-31
  • 打赏
  • 举报
回复
新手,过来学习学习
菜心爸爸 2014-03-17
  • 打赏
  • 举报
回复
现实中这样的数据查询,不会很慢吗,设计是不是有问题
jgsmile 2013-10-22
  • 打赏
  • 举报
回复
引用 153 楼 dwood01 的回复:
[Quote=引用 149 楼 的回复:] 我觉得这个题目的考点不是写sql语句,而是在大数据量的情况下如何判断重复数据。 如果是我,我会利用bit map来做这道题!首先可以知道userid的最大值max(一般在数据表中唯一标示的字段是自增的int类型,这个可以跟面试官确定下),那么我们可以申请一个max位的bit数组(这个数组占用的内存对于目前普通的pc机都远远的满足了,比如10亿,够大了吧,那才250M的样子,一般1亿就很不错了,这…… [/Quote] 何为bit map,做一个拓展: 有数组int[] num={4,6,3,7,1},要求进行排序,采用bit map即可实现快速排序,num数组中,7最大,我们就只需要8个Bit(1Bytes)内存空间即可,首先我们开辟1Byte的空间,将这些空间的所有Bit位都置为0,例如[0,0,0,0,0,0,0,0],然后根据num数组的数值将对应Bit的位置置为1,譬如对于num中第一个数字4,将Bit中对应第4个位置置为1:[0,0,0,0,1,0,0,0](注意,bit是从0开始算起的),以此类推余下的对应位置bit的设置如下:[0,1,0,1,1,0,1,1],设置之后,将bit按位顺序输出即可完成排序。这就是Bit map的核心。 对于149楼说的,我们做个推广,以上面例子为例,num={4,6,3,7,1}是库1.用户ID,假设库2其中一张表去重后的用户ID是{1,5},首先建立库1用户ID的bit map:[0,1,0,1,1,0,1,1],再将库2的用户ID在bit map中进行比较,只要ID对应的Bit map位置上是1的,就可以选出来。这就是149楼所说的原理吧,对于存储空间,用户ID最大值是多少,所需的存储空间就是多少(如max=20,则需要20位存储空间),1M=1024*1024KB*8bit=838万位(1byte = 8bit),即可处理838万个用户ID,10亿用户ID大概120MB。 如果库2中30张表,每张表平均有30万个去重的UserID,那么总的比较次数会是30万*30=900万次,实时统计所用的性能损耗要求不少啊,但应该可以继续优化。 此方法是另开辟径地实现了非SQL查询方式,思路很开阔。
醍醐灌顶的感觉啊!!!
jgsmile 2013-10-22
  • 打赏
  • 举报
回复
引用 115 楼 attilaxp 的回复:
这个题目个人认为不是简单的通过优化查询语句来解决问题,此处只有30张表,表更多的话,语句再怎么优化都没用,而是涉及到分布式数据处理问题,估计是考利用mapreduce的解决思路的。 具体的就是在sql查询前做一个数据接入层,将sql拆分成子查询,然后将子结果合并,数据接入层对sql是透明的。举个例子 此问题的SQL是:SELECT * FROM T WHERE USERID='11',表T为所有30张子表的合集 数据接入层将其分解为:SELECT * FROM T_20110101 WHERE USERID='11',其结果为R1 ...... SELECT * FROM T_20110130 WHERE USERID='11',其结果为R30 得到子结果后总的结果为R=R1+...+R30 这样一来,可以将查询拆开分布并行执行,效率会高的得多,而且查询语句相当简单,横向可扩展性比较好,表再多也没问题。 实际上淘宝就有自己的数据接入层,不通过自己想办法,单依靠数据库来解决大数据问题是没有出路的
受教了,大数据时代来临了啊
u010297353 2013-09-04
  • 打赏
  • 举报
回复
我觉得应该先把a类数据和表中的userid字段都提取出来,再分别扫描一遍,给他们排好序,放入线顺序表中,这样查找起来会更快一些,大数据的话空间复杂度会增多 外行~~
老鼠和帽子 2013-09-02
  • 打赏
  • 举报
回复
引用
select count(*) from 数据库1.a类数据 where exists (select 1 from 数据库2.table_20110909 where userid = 数据库1.a类数据.userid) or exists (select 1 from 数据库2.table_20110910 where userid = 数据库1.a类数据.userid) or exists (select 1 from 数据库2.table_20110911 where userid = 数据库1.a类数据.userid)
我用这个语句在SQL Sever中进行测试,他显示<数据库1.a类数据>语法错误
Weirenren_027 2013-08-28
  • 打赏
  • 举报
回复
引用 162 楼 Weirenren_027 的回复:
[quote=引用 153 楼 dwood01 的回复:] [Quote=引用 149 楼 的回复:] 我觉得这个题目的考点不是写sql语句,而是在大数据量的情况下如何判断重复数据。 如果是我,我会利用bit map来做这道题!首先可以知道userid的最大值max(一般在数据表中唯一标示的字段是自增的int类型,这个可以跟面试官确定下),那么我们可以申请一个max位的bit数组(这个数组占用的内存对于目前普通的pc机都远远的满足了,比如10亿,够大了吧,那才250M的样子,一般1亿就很不错了,这…… [/Quote] 何为bit map,做一个拓展: 有数组int[] num={4,6,3,7,1},要求进行排序,采用bit map即可实现快速排序,num数组中,7最大,我们就只需要8个Bit(1Bytes)内存空间即可,首先我们开辟1Byte的空间,将这些空间的所有Bit位都置为0,例如[0,0,0,0,0,0,0,0],然后根据num数组的数值将对应Bit的位置置为1,譬如对于num中第一个数字4,将Bit中对应第4个位置置为1:[0,0,0,0,1,0,0,0](注意,bit是从0开始算起的),以此类推余下的对应位置bit的设置如下:[0,1,0,1,1,0,1,1],设置之后,将bit按位顺序输出即可完成排序。这就是Bit map的核心。 对于149楼说的,我们做个推广,以上面例子为例,num={4,6,3,7,1}是库1.用户ID,假设库2其中一张表去重后的用户ID是{1,5},首先建立库1用户ID的bit map:[0,1,0,1,1,0,1,1],再将库2的用户ID在bit map中进行比较,只要ID对应的Bit map位置上是1的,就可以选出来。这就是149楼所说的原理吧,对于存储空间,用户ID最大值是多少,所需的存储空间就是多少(如max=20,则需要20位存储空间),1M=1024*1024KB*8bit=838万位(1byte = 8bit),即可处理838万个用户ID,10亿用户ID大概120MB。 如果库2中30张表,每张表平均有30万个去重的UserID,那么总的比较次数会是30万*30=900万次,实时统计所用的性能损耗要求不少啊,但应该可以继续优化。 此方法是另开辟径地实现了非SQL查询方式,思路很开阔。
这个地方的说明需要更清晰准确点:max指的是最大用户ID值,如用户总数量10000,那么max=10000,就需要10000bit的内存空间[/quote] ee
Weirenren_027 2013-08-28
  • 打赏
  • 举报
回复
引用 153 楼 dwood01 的回复:
[Quote=引用 149 楼 的回复:] 我觉得这个题目的考点不是写sql语句,而是在大数据量的情况下如何判断重复数据。 如果是我,我会利用bit map来做这道题!首先可以知道userid的最大值max(一般在数据表中唯一标示的字段是自增的int类型,这个可以跟面试官确定下),那么我们可以申请一个max位的bit数组(这个数组占用的内存对于目前普通的pc机都远远的满足了,比如10亿,够大了吧,那才250M的样子,一般1亿就很不错了,这…… [/Quote] 何为bit map,做一个拓展: 有数组int[] num={4,6,3,7,1},要求进行排序,采用bit map即可实现快速排序,num数组中,7最大,我们就只需要8个Bit(1Bytes)内存空间即可,首先我们开辟1Byte的空间,将这些空间的所有Bit位都置为0,例如[0,0,0,0,0,0,0,0],然后根据num数组的数值将对应Bit的位置置为1,譬如对于num中第一个数字4,将Bit中对应第4个位置置为1:[0,0,0,0,1,0,0,0](注意,bit是从0开始算起的),以此类推余下的对应位置bit的设置如下:[0,1,0,1,1,0,1,1],设置之后,将bit按位顺序输出即可完成排序。这就是Bit map的核心。 对于149楼说的,我们做个推广,以上面例子为例,num={4,6,3,7,1}是库1.用户ID,假设库2其中一张表去重后的用户ID是{1,5},首先建立库1用户ID的bit map:[0,1,0,1,1,0,1,1],再将库2的用户ID在bit map中进行比较,只要ID对应的Bit map位置上是1的,就可以选出来。这就是149楼所说的原理吧,对于存储空间,用户ID最大值是多少,所需的存储空间就是多少(如max=20,则需要20位存储空间),1M=1024*1024KB*8bit=838万位(1byte = 8bit),即可处理838万个用户ID,10亿用户ID大概120MB。 如果库2中30张表,每张表平均有30万个去重的UserID,那么总的比较次数会是30万*30=900万次,实时统计所用的性能损耗要求不少啊,但应该可以继续优化。 此方法是另开辟径地实现了非SQL查询方式,思路很开阔。
这个地方的说明需要更清晰准确点:max指的是最大用户ID值,如用户总数量10000,那么max=10000,就需要10000bit的内存空间
njtvwoshiisp 2013-07-29
  • 打赏
  • 举报
回复
引用 93 楼 H_E_L_L_O_ 的回复:
我觉得可以每个表按照userId建索引,然后先把每个表的 userId 选出来,然后再用join来全部连接。得出的结果就是所有表都存在的userId集合。 select userId from 数据库1.a类数据 inner join (select userId from 数据库2.table_20110909) on 数据库1.a类数据.userId = 数据库2.table_20110909.userId inner join (select userId from 数据库2.table_20110910) on 数据库1.a类数据.userId = 数据库2.table_20110910.userId inner join (select userId from 数据库2.table_20110910) on 数据库1.a类数据.userId = 数据库2.table_20110911.userId ...... 使用一个后台小程序在服务器上跑,每天定时取出数据存到文本文件里面就行。
这位兄台的想法和我一样。但是,我觉得在数据量大的情况下,如果达到几百万条数据的话,肯定应该有更好的方法。只是偶是新手,刚接触Mysql
komac001 2013-04-28
  • 打赏
  • 举报
回复
好多高手啊,个人觉得还是考大数据的处理
ilogo 2013-04-12
  • 打赏
  • 举报
回复
我来说下我的想法,我不太熟悉数据库的语言,把这个题当作是个算法题好了!金山的用户数量不会超过10亿吧,直接用位图记载数据库2中出现过的ID,然后用这个位图去检查数据库1中的所有ID,线性时间就可以完成。 另一种是利用搜索树(森林),不过空间换时间,事先可以根据30张表中的ID范围建好这个树,存在硬盘上,用时调出来用就行了。在这种环境下,查询特别快。查找深度不超过ID的位数加上一个小常数。
lumb 2012-12-18
  • 打赏
  • 举报
回复
第一次看到这个题的时候我也觉得要数据库1和数据库2的表要对比或关联查询。但实际上是既然userid是对应的就有按常理数据库2中的人数只会小于或等于数据库中的人数。直接统计数据库2的人数就好了,数据库1根本就是打酱油用来起到外键作用。 第二种可能就是在设计数据库时把人分别存到不同的库或同个库的不同表中,那对比是很有必要的,虽然这样设计数据库不科学,很容易造成userid的混乱。查完数据库2再对比数据库1反而不效率,直接拿数据库1中的userid挨个查倒比较好。 所以问题的关键还是先试探出userid的从属再解决。虽然比较花时间但给的最终方案会比较效率。
lgt_168 2012-11-27
  • 打赏
  • 举报
回复
刚刚写的··你们帮我看看看! create table #tmp ( userid varchar(20) ) declare @i int declare @k varchar(2) declare @table_2011 varchar(50) set @i=0 while @I<=31 begin if @i<10 set @k='0'+cast(@i as varchar(1)) select @table_2011=N'''table_2011'+@k+'''' if exists(select 1 from ku2..sysobjects where name=@table_2011) exec(' insert into table_userid select userid from ku2..'+@table_2011 +' where exists(select 1 from ku1..table where ku1..table.userid=ku2..'+@table_2011+'.userid)' +' and not exists(select 1 from #tmp=ku1..table.userid)' ) set @i=@i+1 end select count(*) from #tmp drop table #tmp
tyler34 2012-10-26
  • 打赏
  • 举报
回复
感觉大神太多了,我这个菜鸟无地自容。。
guozhonglin2310 2012-10-12
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

select count(*) from 数据库1.a类数据
where exists (select 1 from 数据库2.table_20110909 where userid = 数据库1.a类数据.userid)
or exists (select 1 from 数据库2.table_20110910 where userid = 数据库1.a类数据.userid)
or ex……
[/Quote]
如果用这个也得找出不重复的。加个distinct 吧。
select count(distinct 数据库1.userid) from 数据库1.a类数据
where exists (select 1 from 数据库2.table_20110909 where userid = 数据库1.a类数据.userid)
or exists (select 1 from 数据库2.table_20110910 where userid = 数据库1.a类数据.userid)
or exists (select 1 from 数据库2.table_20110911 where userid = 数据库1.a类数据.userid)
dwood01 2012-10-11
  • 打赏
  • 举报
回复
[Quote=引用 149 楼 的回复:]
我觉得这个题目的考点不是写sql语句,而是在大数据量的情况下如何判断重复数据。
如果是我,我会利用bit map来做这道题!首先可以知道userid的最大值max(一般在数据表中唯一标示的字段是自增的int类型,这个可以跟面试官确定下),那么我们可以申请一个max位的bit数组(这个数组占用的内存对于目前普通的pc机都远远的满足了,比如10亿,够大了吧,那才250M的样子,一般1亿就很不错了,这……
[/Quote]
何为bit map,做一个拓展:
有数组int[] num={4,6,3,7,1},要求进行排序,采用bit map即可实现快速排序,num数组中,7最大,我们就只需要8个Bit(1Bytes)内存空间即可,首先我们开辟1Byte的空间,将这些空间的所有Bit位都置为0,例如[0,0,0,0,0,0,0,0],然后根据num数组的数值将对应Bit的位置置为1,譬如对于num中第一个数字4,将Bit中对应第4个位置置为1:[0,0,0,0,1,0,0,0](注意,bit是从0开始算起的),以此类推余下的对应位置bit的设置如下:[0,1,0,1,1,0,1,1],设置之后,将bit按位顺序输出即可完成排序。这就是Bit map的核心。
对于149楼说的,我们做个推广,以上面例子为例,num={4,6,3,7,1}是库1.用户ID,假设库2其中一张表去重后的用户ID是{1,5},首先建立库1用户ID的bit map:[0,1,0,1,1,0,1,1],再将库2的用户ID在bit map中进行比较,只要ID对应的Bit map位置上是1的,就可以选出来。这就是149楼所说的原理吧,对于存储空间,用户ID最大值是多少,所需的存储空间就是多少(如max=20,则需要20位存储空间),1M=1024*1024KB*8bit=838万位(1byte = 8bit),即可处理838万个用户ID,10亿用户ID大概120MB。
如果库2中30张表,每张表平均有30万个去重的UserID,那么总的比较次数会是30万*30=900万次,实时统计所用的性能损耗要求不少啊,但应该可以继续优化。
此方法是另开辟径地实现了非SQL查询方式,思路很开阔。
MichealTX 2012-10-11
  • 打赏
  • 举报
回复
顶一个,我也觉得不是考sql语句,而是考算法。sql语句效率应该不高啊。


[Quote=引用 149 楼 的回复:]

我觉得这个题目的考点不是写sql语句,而是在大数据量的情况下如何判断重复数据。
如果是我,我会利用bit map来做这道题!首先可以知道userid的最大值max(一般在数据表中唯一标示的字段是自增的int类型,这个可以跟面试官确定下),那么我们可以申请一个max位的bit数组(这个数组占用的内存对于目前普通的pc机都远远的满足了,比如10亿,够大了吧,那才250M的样子,一般1亿就很不错了,……
[/Quote]
MichealTX 2012-10-11
  • 打赏
  • 举报
回复
我觉得吧,把数据库2每张表建立对应的hashtable,然后看数据库1中某个ID是否在这个hashtable中,在的话计数器加1,并且不再搜寻这个ID,直到数据库1中每个ID都找到或者数据库2每个表都检查一遍。这样的话用c或者c++写程序。

没必要那么多表连接查询吧,数据量大的时候,sql会不会超级慢啊。

抛砖引玉。谢谢。
so_and_so 2012-10-09
  • 打赏
  • 举报
回复
金山游戏的需求,需要统计出最近一个月没有上线的玩家,然后就有了"欢迎老玩家回归"的奖励...哈哈
andyliuxs 2012-10-06
  • 打赏
  • 举报
回复
我觉得这个题目的考点不是写sql语句,而是在大数据量的情况下如何判断重复数据。
如果是我,我会利用bit map来做这道题!首先可以知道userid的最大值max(一般在数据表中唯一标示的字段是自增的int类型,这个可以跟面试官确定下),那么我们可以申请一个max位的bit数组(这个数组占用的内存对于目前普通的pc机都远远的满足了,比如10亿,够大了吧,那才250M的样子,一般1亿就很不错了,这样才25M)。每位bit为0表示相应的索引号对应的userid存在。这样,开始扫描库2的30张表进对特定位置1,然后,扫描库1的数据即可判断哪些userid已经存在了。
加载更多回复(96)
│ C++面试题大全.doc │ c与c++面试题汇总.doc │ java面试题集.txt │ ├─C++笔试题 │ (1)C,C++经典问题,及面试笔试题 .txt │ (2)cc++.txt │ (3)笔试题2.doc │ (4)笔试题.doc │ (5)想成为嵌入式程序员应知道的0x10个基本问题.txt │ (6)网络.操作系统.数据库.txt │ (7)如果你觉得你够牛就回答这几个问题.txt │ (8)以上文档中的明显错误.txt │ c,c++笔试.txt │ CC++笔试题系列.txt │ IT职场中外企面试最爱提的问题TOP10 .txt │ memset.memmove.strcmp.txt │ TC使用.txt │ 介绍自己的优缺点有技巧 .txt │ 多线程编程之一——问题提出.txt │ 多线程编程之三——线程间通讯.txt │ 多线程编程之二——MFC中的多线开发.txt │ 多线程编程之四——线程的同步.txt │ 排序.txt │ 最常问问题和最佳答案.txt │ 求职信 .txt │ 深入析Windows和Linux动态库应用异同 .txt │ 用VC++5.0 定 制 和 调 用 动 态 链 接 库 .txt │ 聘面谈记录切忌随心所欲.txt │ 英语面试.txt │ 范式间区别.txt │ 金山_人力资源试题库_软件工程.doc │ 金山问题.txt │ 面试常见37个问题.doc │ 面试常见问题解析 .txt │ 面试应答中最忌讳的是什么.doc │ ├─java笔试题大集合及答案(另附各大公司笔试题) │ EJB方面.doc │ Java基础方面.doc │ 代码与编程题.doc │ 应聘Java笔试时可能出现问题及其答案.doc │ 求职笔试大全.pdf │ 用户必读.txt │ 线程编程方面.doc │ └─面试题java │ Core Javaceshiti.doc │ c_c++_mianshi.txt │ j2ee面试笔试题大汇总.txt │ java中的易混问题收集 -- 最大的IT资源网.txt │ JAVA常见问题.txt │ Java常见问题集锦 -- 最大的IT资源网.txt │ JAVA问题.txt │ Java陷阱一箩筐----面试题集.doc │ Java陷阱一箩筐----面试题集[zt].txt │ JAVA面试题.txt │ JAVA面试题集(1) -- 最大的IT资源网.txt │ JAVA面试题集(2) -- 最大的IT资源网.txt │ JAVA面试题集(3) -- 最大的IT资源网.txt │ JAVA面试题集(4) -- 最大的IT资源网.txt │ JAVA面试题集(5) -- 最大的IT资源网.txt │ JAVA面试题集(6) -- 最大的IT资源网.txt │ JAVA面试题集(7) -- 最大的IT资源网.txt │ JAVA面试题集(8) -- 最大的IT资源网.txt │ mian shi ti da an 2.txt │ mian shi ti da an1.txt │ mian shi ti.txt │ mianShi.pdf │ mst.pdf │ 追MM与Java的23种设计模式.txt │ 面试题.doc │ └─mianshiti 1.txt 2.txt 3.txt 4.txt 5.txt 6.txt 7.txt 8.txt Java_util_package.txt java_util_test.txt

56,677

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧