横表和纵表的查询性能比较

时间:2022-04-01 20:10:52
横表结构:userid,key1,value1,key2,value2...key10,value10    其中userid为主键
纵表结构:userid,key,value    其中userid,key为联合主键,自动生成了在这两个列上的聚集索引
横表有1000w条数据,对应纵表就有10000w条数据,现需要根据userid查询记录,哪个效率会更高,横表:纵表=?呢
感觉上横表会快很多,因为一个用户只有一条记录,而纵表中一个用户会有10条记录。而且两个表的记录本身相差10倍。

但是,我的测试结果(使用sqlserver2005测试的)却是纵表更快!   难道真是这样么?谁能够解释一下啊!!!

5 个解决方案

#1


mark

#2


其中userid为主键 
是否聚集?

#3


引用楼主 WutheringH 的帖子:
横表结构:userid,key1,value1,key2,value2...key10,value10    其中userid为主键 
纵表结构:userid,key,value    其中userid,key为联合主键,自动生成了在这两个列上的聚集索引 
横表有1000w条数据,对应纵表就有10000w条数据,现需要根据userid查询记录,哪个效率会更高,横表:纵表=?呢 
感觉上横表会快很多,因为一个用户只有一条记录,而纵表中一个用户会有10条记录。而且两个表的记录本身相差10倍。 

但是,我的测试结果(使用sqlserver2005测试的)却是纵表更快!  难道真是这样么?谁能够解释一下啊!!!


对纵表和横表的userid建立主键或索引.那么查询一般来说是纵表快.
因为:
纵表 select * from 纵表 where key = @key and value = @value
横表 select * from 横表 where (key1 = @key and value1 = @value) or (key2 = @key and value2 = @value) ... or (key10 = @key and value10 = @value)

#4


上为按key和value来查,是纵表快.
如果是按userid来查,肯定是横表快.

#5


引用 2 楼 roy_89 的回复:
其中userid为主键 
是否聚集? 


设为主键就自动为聚集索引了。

查询纵表:SELECT  * from col where userid ='08613575174704'
查询横表:SELECT  * from row where userid ='08613575174704'


上面两个语句分别执行后,读取次数都是一样的:
逻辑读取 4 次,物理读取 4 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次

时间上每次执行都有不同,但大部分时候查询纵表的速度更快。我怀疑是不是因为纵表只有三个列,其中两个列都已经在索引里面了,所以会快些??

#1


mark

#2


其中userid为主键 
是否聚集?

#3


引用楼主 WutheringH 的帖子:
横表结构:userid,key1,value1,key2,value2...key10,value10    其中userid为主键 
纵表结构:userid,key,value    其中userid,key为联合主键,自动生成了在这两个列上的聚集索引 
横表有1000w条数据,对应纵表就有10000w条数据,现需要根据userid查询记录,哪个效率会更高,横表:纵表=?呢 
感觉上横表会快很多,因为一个用户只有一条记录,而纵表中一个用户会有10条记录。而且两个表的记录本身相差10倍。 

但是,我的测试结果(使用sqlserver2005测试的)却是纵表更快!  难道真是这样么?谁能够解释一下啊!!!


对纵表和横表的userid建立主键或索引.那么查询一般来说是纵表快.
因为:
纵表 select * from 纵表 where key = @key and value = @value
横表 select * from 横表 where (key1 = @key and value1 = @value) or (key2 = @key and value2 = @value) ... or (key10 = @key and value10 = @value)

#4


上为按key和value来查,是纵表快.
如果是按userid来查,肯定是横表快.

#5


引用 2 楼 roy_89 的回复:
其中userid为主键 
是否聚集? 


设为主键就自动为聚集索引了。

查询纵表:SELECT  * from col where userid ='08613575174704'
查询横表:SELECT  * from row where userid ='08613575174704'


上面两个语句分别执行后,读取次数都是一样的:
逻辑读取 4 次,物理读取 4 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次

时间上每次执行都有不同,但大部分时候查询纵表的速度更快。我怀疑是不是因为纵表只有三个列,其中两个列都已经在索引里面了,所以会快些??