日期:2014-05-18  浏览次数:20438 次

智力游戏:写sql 语句。。。要求执行效率高。。。可以给出时间复杂度说明。。。
问题1:查询出某一姓名的所有尼称,表如下(当然需要在数据级比较大的时候效率才明显,下表数据只是部份数据)
表名:dear
姓名 编号 名称 ...
你 1 a
我 3 a
我 3 b
他 6 c
张 7 d
王 10 a
王 10 c
王 10 d
李 13
赵 18

.
.
.

问题2:查询出某一姓名的所有尼称,表如下(当然需要在数据级比较大的时候效率才明显,下表数据只是部份数据)
表1名:name
姓名 编号 ...
你 1
我 3
他 6
张 7
王 10
李 13
赵 18
.
.
.
表2名:dear
编号 名称 ...
1 a
3 a
3 b
6 c
7 d
10 a
10 c
10 d
13
18
.
.
.

问题3:比较前2个问题的执行效率

------解决方案--------------------
消灭0回复,,,
------解决方案--------------------
SQL code
问题1
select * from dear where 姓名 = '你'
问题2
select name.* , dear.名称 from name,dear where name ='你' and name.编号 = dear.编号
问题3:比较前2个问题的执行效率
肯定是第一个效率高,因为第二个要联合两表查询.

------解决方案--------------------
问题一会快,但是关系数据库就是靠关系来消除隆余的.问题2省空间,是一般的使用方法.
------解决方案--------------------
海量数据的情况下,应该第一种的效率高。

单从效率考虑,将昵称串接放在一起,如:

  王 10 a
  王 10 c  -〉王 10 a,c,d
  王 10 d 

虽然增加了昵称字段长度的开销,但减少记录数(相对增加长度的开销,可能还有赚),无疑检索更快。

------解决方案--------------------
方法,最简单最有效就是直接select 
问题1
在Name列建索引
create index 索引名 on 表(Name)
问题2:
建组合索引(Name,编号)
create index 索引名 on 表(Name,编号)

-----

------解决方案--------------------
看你的表格之后发觉大家都被你的取名所误导了,
表中的编号仅仅是指姓的编号,所以编号和姓是一对一的。
表一表三中的名称就是指名,合起来就是一个姓下面有多少名,
所以表一和表三的复杂度一致,
都可以用编号+名字组成PK的。
建议直接丢弃编号栏位,
因为我觉得仅仅姓使用编号,名没有使用编号没有什么意义。
------解决方案--------------------
我智商低了点,没看出来,接点分好了,hehe
------解决方案--------------------
在只有一两个字段的情况下, 分表的好处根本就显现不出来的。
------解决方案--------------------
个人更倾向于昨夜小楼的做法,
问题一:冗余度大。
二:查询效率问题。
三:不是很了解。

但是根据现在的情况来说,能从空间换取时间,从成本的角度考虑,冗余度不是大问题的。
当然表大到KG的情况,那我的说法就被推翻了。
------解决方案--------------------
问是一只满足第二范式,问题二满足第三范式。数据量较大建议分表处理。