免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4756 | 回复: 7
打印 上一主题 下一主题

急!创建的视图用了union连接表但执行select count(*)发现没有用索引,请斑竹回复!! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-05-08 15:46 |只看该作者 |倒序浏览
如A B两个表字段一致,分别存储各个月份的数据,对所有月份数据查询通过视图实现:
create view v_test(col1,col2,col3) as
select col1,col2,col3 from A
union
select col1,col2,col3 from B

执行查询:
select count(*) from v_test

通过set explain on 发现此SQL查询语句没有通过索引扫描而是全表扫描,结果占用了大量临时表空间

不知是和原因能否?
或者能否 通过join等其它办法解决?

请斑竹回复!!

论坛徽章:
0
2 [报告]
发表于 2010-03-24 12:03 |只看该作者
我也遇到这种情况,帮顶下

论坛徽章:
11
金牛座
日期:2015-03-19 16:56:22数据库技术版块每日发帖之星
日期:2016-08-02 06:20:00数据库技术版块每日发帖之星
日期:2016-04-24 06:20:00数据库技术版块每日发帖之星
日期:2016-04-13 06:20:00IT运维版块每日发帖之星
日期:2016-04-13 06:20:00数据库技术版块每日发帖之星
日期:2016-02-03 06:20:00数据库技术版块每日发帖之星
日期:2015-08-06 06:20:00季节之章:春
日期:2015-03-27 15:54:57羊年新春福章
日期:2015-03-27 15:54:37戌狗
日期:2015-03-19 16:56:41数据库技术版块每日发帖之星
日期:2016-08-18 06:20:00
3 [报告]
发表于 2010-03-24 12:05 |只看该作者
select count(*)  本来就是走全表扫描~

论坛徽章:
0
4 [报告]
发表于 2010-03-24 12:16 |只看该作者
我的视图是这样的.
create view tt_view as
select * from tt@online:tt
union
select * from tt1

单独 count(*) 某个表速度很快,直接count(*)  tt_view报临时表空间不够,郁闷

论坛徽章:
11
金牛座
日期:2015-03-19 16:56:22数据库技术版块每日发帖之星
日期:2016-08-02 06:20:00数据库技术版块每日发帖之星
日期:2016-04-24 06:20:00数据库技术版块每日发帖之星
日期:2016-04-13 06:20:00IT运维版块每日发帖之星
日期:2016-04-13 06:20:00数据库技术版块每日发帖之星
日期:2016-02-03 06:20:00数据库技术版块每日发帖之星
日期:2015-08-06 06:20:00季节之章:春
日期:2015-03-27 15:54:57羊年新春福章
日期:2015-03-27 15:54:37戌狗
日期:2015-03-19 16:56:41数据库技术版块每日发帖之星
日期:2016-08-18 06:20:00
5 [报告]
发表于 2010-03-24 15:32 |只看该作者
我的视图是这样的.
create view tt_view as
select * from tt@online:tt
union
select * from tt1

...
sqlnet 发表于 2010-03-24 12:16



    单count(*)一个表是从systables中读数的.自然快....

论坛徽章:
0
6 [报告]
发表于 2010-03-26 20:55 |只看该作者
单count(*)一个表是从systables中读数的.自然快....
liaosnet 发表于 2010-03-24 15:32



    select count(*) from t1;

----------------------- test@test -------------- Press CTRL-W for Help --------

     (count(*))

           4917


select * from systables
where tabname='t1';

----------------------- test@test -------------- Press CTRL-W for Help --------


tabname          t1
owner            informix
partnum          1048939
tabid            103
rowsize          4
ncols            1
nindexes         0
nrows            0.00
created          2010/03/06
version          6750210
tabtype          T
locklevel        P
npused           0.00
fextsize         16
nextsize         16
flags            0
site
dbname
type_xid         0
am_id            0
pagesize         2048
ustlowts
secpolicyid      0
protgranularity

请问下 那个字段记录了 t1的总条数 4917 呢

论坛徽章:
11
金牛座
日期:2015-03-19 16:56:22数据库技术版块每日发帖之星
日期:2016-08-02 06:20:00数据库技术版块每日发帖之星
日期:2016-04-24 06:20:00数据库技术版块每日发帖之星
日期:2016-04-13 06:20:00IT运维版块每日发帖之星
日期:2016-04-13 06:20:00数据库技术版块每日发帖之星
日期:2016-02-03 06:20:00数据库技术版块每日发帖之星
日期:2015-08-06 06:20:00季节之章:春
日期:2015-03-27 15:54:57羊年新春福章
日期:2015-03-27 15:54:37戌狗
日期:2015-03-19 16:56:41数据库技术版块每日发帖之星
日期:2016-08-18 06:20:00
7 [报告]
发表于 2010-03-26 21:22 |只看该作者
select count(*) from t1;

----------------------- test@test -------------- Press CTRL-W  ...
sqlnet 发表于 2010-03-26 20:55

  1. select t.tabname, p.nrows, t.nrows
  2. from sysmaster:sysptnhdr p, systables t
  3. where p.partnum = t.partnum
  4. and  t.tabname = 't1';

  5. -----------

  6. tabname  t1
  7. nrows    16657
  8. nrows    16657.00000000

复制代码
select count(*) from t1 实际取的就是p.nrows的值, 这也是为什么这个语句的explain走索引的原因..
若我们在这个语句后加上 1=1 ,就会发现这走的是顺序扫描~.
若是p.nrows跟t.nrows相差太多,表时你这个表需要做统计更新了.

  1. QUERY: (OPTIMIZATION TIMESTAMP: 03-26-2010 21:07:10)
  2. ------
  3. select count(*) from t1

  4. Estimated Cost: 1
  5. Estimated # of Rows Returned: 1

  6.   1) informix.t1: INDEX PATH

  7.     (1) Index Name: (count)
  8.         Index Keys: (count)

  9. Query statistics:
  10. -----------------

  11.   Table map :
  12.   ----------------------------
  13.   Internal name     Table name
  14.   ----------------------------

  15.   type     rows_prod  est_rows  rows_cons  time
  16.   -------------------------------------------------
  17.   group    1          1         0          00:00.00

  18. QUERY: (OPTIMIZATION TIMESTAMP: 03-26-2010 21:07:19)
  19. ------
  20. select count(*) from t1 where 1=1

  21. Estimated Cost: 790
  22. Estimated # of Rows Returned: 1

  23.   1) informix.t1: SEQUENTIAL SCAN

  24.         Filters: t

  25. Query statistics:
  26. -----------------

  27.   Table map :
  28.   ----------------------------
  29.   Internal name     Table name
  30.   ----------------------------
  31.   t1                t1

  32.   type     table  rows_prod  est_rows  rows_scan  time       est_cost
  33.   -------------------------------------------------------------------
  34.   scan     t1     16657      16657     16657      00:01.04   791     

  35.   type     rows_prod  est_rows  rows_cons  time
  36.   -------------------------------------------------
  37.   group    1          1         16657      00:01.27
复制代码

论坛徽章:
0
8 [报告]
发表于 2010-03-26 21:41 |只看该作者
谢谢解答。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP