纵表结构:userid,key,value 其中userid,key为联合主键,自动生成了在这两个列上的聚集索引
横表有1000w条数据,对应纵表就有10000w条数据,现需要根据userid查询记录,哪个效率会更高,横表:纵表=?呢
感觉上横表会快很多,因为一个用户只有一条记录,而纵表中一个用户会有10条记录。而且两个表的记录本身相差10倍。
但是,我的测试结果(使用sqlserver2005测试的)却是纵表更快! 难道真是这样么?谁能够解释一下啊!!!
5 个解决方案
#1
mark
#2
其中userid为主键
是否聚集?
是否聚集?
#3
对纵表和横表的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来查,肯定是横表快.
如果是按userid来查,肯定是横表快.
#5
设为主键就自动为聚集索引了。
查询纵表: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
对纵表和横表的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来查,肯定是横表快.
如果是按userid来查,肯定是横表快.
#5
设为主键就自动为聚集索引了。
查询纵表:SELECT * from col where userid ='08613575174704'
查询横表:SELECT * from row where userid ='08613575174704'
上面两个语句分别执行后,读取次数都是一样的:
逻辑读取 4 次,物理读取 4 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次
时间上每次执行都有不同,但大部分时候查询纵表的速度更快。我怀疑是不是因为纵表只有三个列,其中两个列都已经在索引里面了,所以会快些??