sqlserver,表已添加索引,是否仍会随着数据量不断不断增大而查询越来越慢?
(select * from table1 union all select * from table2 union all……union all select * from table100),视图没有索引,表有索引。
请比较
select column1 from table1 where index_column='XXX'和
select column1 from vwtable where index_column='XXX',
哪个快?
一个表大约700万条记录 展开
无论哪一种数据库,只要数据量不断增大都会逐渐变慢,有时候数据到一个量级
速度会断壁式下跌。
一般是直接从表查询快。已经是索引列了。但是第一个查询如果数据不存在还是要遍历其他的表。这样速度就大打折扣了。
如果能保证数据一定在指定表中就是第一个快了。
大体分为如下几种情况会逆袭:
1、这个就是数据不存在,如果挨个遍历表,速度可能不如使用视图。
2、使用索引视图技术,这个跟使用表查询速度相差不大。
3、sqlserver是高级版本,可以发挥多CPU优势,这个时候速度也相差不大。
4、索引碎片过多集中在的某三四个表以上,这时候性能都比较沮丧。
看如上,因为我这个是32核CPU,多并行几个时间只是略多一点,如果单表查询,那么执行计划就是一个分支。
第一个查询select table1已确认数据在该表(事实之前已快速定位到该表);
第二个查询中就是普通视图。
在平均一个表700万记录的情况下,两者的查询速度会相差非常大吗?
查询这个视图会先把union all的100张表全部执行完联合再从结果集中查询记录吗?
查询这个视图会使用到表的索引吗?
查询这个视图会使用到表的索引吗?
视图你可以理解为还是一个查询,如果字段HIT中索引,那么会用到索引。
在平均一个表700万记录的情况下,两者的查询速度会相差非常大吗?
如果使用到索引,速度相差不会很大,一般会比直接定位表高出几秒。多出的时间就是索引页遍历时间。
查询这个视图会先把union all的100张表全部执行完联合再从结果集中查询记录吗?
用到索引是不会的,因为先加载索引页,然后根据索引页指向到数据页,然后从数据页中抽出数据。
过程如下:
使用使用了100个表,也就多花销了遍历索引页的时间。
如果索引页得到定位,那么索引页就会指向对应的数据页,发生一次聚集索引扫描。
抽出对应的数据。
因为索引页比较小,一本中华大字典,查偏旁的目录页也不过十几页。遍历这几页时间不算多。
向你说的组合100个表构成一个视图,我觉得这个SQL报文就很大了。
SQL进入预编译,生成查询计划都是要耗费一定时间的。当然这个相对数据输出可以忽略。
出现这种情况应该早用分区方案了。