12
返回列表 发新帖
楼主: diablo2

[精华] 优化器的问题

[复制链接]
论坛徽章:
233
天枰座
日期:2016-02-02 09:36:332012新春纪念徽章
日期:2012-01-04 11:49:54ITPUB十周年纪念徽章
日期:2011-11-01 16:19:41灰彻蛋
日期:2011-06-22 19:28:30现任管理团队成员
日期:2011-05-07 01:45:082010广州亚运会纪念徽章:拳击
日期:2011-04-08 16:56:552011新春纪念徽章
日期:2011-02-18 11:43:332011新春纪念徽章
日期:2011-01-25 15:42:562011新春纪念徽章
日期:2011-01-25 15:42:332011新春纪念徽章
日期:2011-01-25 15:42:15
11#
 楼主| 发表于 2007-8-10 18:12 | 只看该作者
最初由 askgyliu 发布
[B]/home/db2inst/Scripts > db2 -v "create table t1 (a int, b char(10), c int)"
create table t1 (a int, b char(10), c int)
DB20000I  The SQL command completed successfully.

/home/db2inst/Scripts > db2 -v "insert into t1 values(1,'1@', 1)"
insert into t1 values(1,'1@', 1)
DB20000I  The SQL command completed successfully.

/home/db2inst/Scripts > db2 -v "insert into t1 values(2,'12', 0)"
insert into t1 values(2,'12', 0)
DB20000I  The SQL command completed successfully.

/home/db2inst/Scripts > db2 -v "insert into t1 values(5,'55', 2)"
insert into t1 values(5,'55', 2)
DB20000I  The SQL command completed successfully.

/home/db2inst/Scripts > db2 -v "select * from t1 where a in(2,5) and dec(b,10,5)>0"
select * from t1 where a in(2,5) and dec(b,10,5)>0

A           B          C
----------- ---------- -----------
          2 12                   0
          5 55                   2

  2 record(s) selected.



/home/db2inst/Scripts >
[/B]


试试 '55.5'

使用道具 举报

回复
招聘 : c/c++研发
论坛徽章:
45
技术图书徽章
日期:2014-03-10 14:09:192012新春纪念徽章
日期:2012-02-13 15:12:092012新春纪念徽章
日期:2012-02-13 15:12:092012新春纪念徽章
日期:2012-01-04 11:51:22ITPUB十周年纪念徽章
日期:2011-11-01 16:21:15现任管理团队成员
日期:2011-05-07 01:45:082011新春纪念徽章
日期:2011-01-25 15:42:562011新春纪念徽章
日期:2011-01-25 15:42:332011新春纪念徽章
日期:2011-01-25 15:42:152011新春纪念徽章
日期:2011-01-25 15:41:50
12#
发表于 2007-8-10 18:40 | 只看该作者
关键是
                Predicates:
                ----------
                2) Sargable Predicate
                        Relational Operator:            Less Than (< )
                        Subquery Input Required:        No
                        Filter Factor:                  0.333333

                        Predicate Text:
                        --------------
                        (0 < DEC(Q1.B, '..'))

                3) Sargable Predicate
                        Relational Operator:            In List (IN)
                        Subquery Input Required:        No
                        Filter Factor:                  0.285714

                        Predicate Text:
                        --------------
                        Q1.A IN (2, 5)

VS

                Predicates:
                ----------
                2) Sargable Predicate
                        Relational Operator:            In List (IN)
                        Subquery Input Required:        No
                        Filter Factor:                  0.285714

                        Predicate Text:
                        --------------
                        Q1.A IN (2, 5)

                3) Sargable Predicate
                        Relational Operator:            Less Than (< )
                        Subquery Input Required:        No
                        Filter Factor:                  0.333333

                        Predicate Text:
                        --------------
                        (0 < DEC(Q1.B, '..'))

在你的测试里两者的顺序和你调用的顺序相符,但是并不是在所有情况下都一定会相符

使用道具 举报

回复
招聘 : c/c++研发
论坛徽章:
45
技术图书徽章
日期:2014-03-10 14:09:192012新春纪念徽章
日期:2012-02-13 15:12:092012新春纪念徽章
日期:2012-02-13 15:12:092012新春纪念徽章
日期:2012-01-04 11:51:22ITPUB十周年纪念徽章
日期:2011-11-01 16:21:15现任管理团队成员
日期:2011-05-07 01:45:082011新春纪念徽章
日期:2011-01-25 15:42:562011新春纪念徽章
日期:2011-01-25 15:42:332011新春纪念徽章
日期:2011-01-25 15:42:152011新春纪念徽章
日期:2011-01-25 15:41:50
13#
发表于 2007-8-10 18:52 | 只看该作者
现在他们使用sargable,所以两种predicate的weight应该相同,所以顺序不作调整,使用你的输入顺序。但是如果一个是start/stop key predicate,另一个是sargable,那么肯定首先apply start/stop key啦

使用道具 举报

回复
论坛徽章:
21
在线时间
日期:2007-07-25 04:01:022012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:23马上有车
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:142012新春纪念徽章
日期:2012-02-13 15:09:23
14#
发表于 2007-8-10 21:02 | 只看该作者


我 只 是 漏 掉 了 一 个 细 节 。 我 创 建 了 一 个 INDEX:

create index idx_t1 on t1(a)



教 训 就 是 , 千 万 别 利 用 OPTIMIZER的 这 种 predicate sequence来 玩 。

You will never know what will happen, or will there be any change in the optimizer, or a join may totally change the result, which will be very troublesome to debug.

btw, Oracle has the same behavior.

使用道具 举报

回复
论坛徽章:
233
天枰座
日期:2016-02-02 09:36:332012新春纪念徽章
日期:2012-01-04 11:49:54ITPUB十周年纪念徽章
日期:2011-11-01 16:19:41灰彻蛋
日期:2011-06-22 19:28:30现任管理团队成员
日期:2011-05-07 01:45:082010广州亚运会纪念徽章:拳击
日期:2011-04-08 16:56:552011新春纪念徽章
日期:2011-02-18 11:43:332011新春纪念徽章
日期:2011-01-25 15:42:562011新春纪念徽章
日期:2011-01-25 15:42:332011新春纪念徽章
日期:2011-01-25 15:42:15
15#
 楼主| 发表于 2007-8-12 18:07 | 只看该作者
最初由 askgyliu 发布
[B]

我 只 是 漏 掉 了 一 个 细 节 。 我 创 建 了 一 个 INDEX:

create index idx_t1 on t1(a)



教 训 就 是 , 千 万 别 利 用 OPTIMIZER的 这 种 predicate sequence来 玩 。

You will never know what will happen, or will there be any change in the optimizer, or a join may totally change the result, which will be very troublesome to debug.

btw, Oracle has the same behavior. [/B]



你是说在有索引的基础上,不会有我测试的现象?

使用道具 举报

回复
招聘 : c/c++研发
论坛徽章:
45
技术图书徽章
日期:2014-03-10 14:09:192012新春纪念徽章
日期:2012-02-13 15:12:092012新春纪念徽章
日期:2012-02-13 15:12:092012新春纪念徽章
日期:2012-01-04 11:51:22ITPUB十周年纪念徽章
日期:2011-11-01 16:21:15现任管理团队成员
日期:2011-05-07 01:45:082011新春纪念徽章
日期:2011-01-25 15:42:562011新春纪念徽章
日期:2011-01-25 15:42:332011新春纪念徽章
日期:2011-01-25 15:42:152011新春纪念徽章
日期:2011-01-25 15:41:50
16#
发表于 2007-8-12 23:07 | 只看该作者
因为有索引会用start/stop key predicate,所以再同时存在start/stop key和SARGable得情况下肯定先做start/stop key

使用道具 举报

回复
论坛徽章:
21
在线时间
日期:2007-07-25 04:01:022012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:23马上有车
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:142012新春纪念徽章
日期:2012-02-13 15:09:23
17#
发表于 2007-8-13 08:49 | 只看该作者
/home/db2inst/Scripts > db2 -v "select * from test0809"
select * from test0809

A           B          C
----------- ---------- -----------
          1 121@1                1
          2 22                   0
          1 11                   0
          3 3*3                  1
          3 33                   0
          4 3*3                  0
          5 55.5                 0

  7 record(s) selected.


在一般情况下,可能DB2会从右往左apply the predicates。

/home/db2inst/Scripts > db2 -v "select * from test0809 where a in(2,5) and dec(b,10,5)>0"
select * from test0809 where a in(2,5) and dec(b,10,5)>0

A           B          C
----------- ---------- -----------
SQL0420N  Invalid character found in a character string argument of the
function "DECIMAL".  SQLSTATE=22018

/home/db2inst/Scripts > db2 -v "select * from test0809 where dec(b,10,5)>0 and a in (2,5)"
select * from test0809 where dec(b,10,5)>0 and a in (2,5)

A           B          C
----------- ---------- -----------
          2 22                   0
          5 55.5                 0

  2 record(s) selected.

但我创建了index on column a之后,DB2 optimizer发现使用index可能会快一些,而刚好在这种情况下after the filtering of column a, all the data in column can be casted to decimal values:

/home/db2inst/Scripts > db2 -v "create index idx_t1 on test0809(a)"
create index idx_t1 on test0809(a)
DB20000I  The SQL command completed successfully.

/home/db2inst/Scripts > db2 -v "select * from test0809 where a in(2,5) and dec(b,10,5)>0"
select * from test0809 where a in(2,5) and dec(b,10,5)>0

A           B          C
----------- ---------- -----------
          2 22                   0
          5 55.5                 0

  2 record(s) selected.

However, after I did a runstats on the table, DB2 optimizer realize that to fulfill this query for this particular table, accessing by index may be even slower because the tablesize is so small that accessed by index may need two or three physical reads, while accessed by table itself (full table scan) may need only one physical read. And this causes the filtering to be applied from right to the left again, and resulted in error again.

/home/db2inst/Scripts > db2 -v "runstats on table db2.test0809 and indexes all"
runstats on table db2.test0809 and indexes all
DB20000I  The RUNSTATS command completed successfully.

/home/db2inst/Scripts > db2 -v "select * from test0809 where a in(2,5) and dec(b,10,5)>0"
select * from test0809 where a in(2,5) and dec(b,10,5)>0

A           B          C
----------- ---------- -----------
SQL0420N  Invalid character found in a character string argument of the
function "DECIMAL".  SQLSTATE=22018

所以,我的认识是,如果真的有必要做data type conversion的话,最好确保所有的数据都是真的可以CONVERTED。

使用道具 举报

回复
论坛徽章:
233
天枰座
日期:2016-02-02 09:36:332012新春纪念徽章
日期:2012-01-04 11:49:54ITPUB十周年纪念徽章
日期:2011-11-01 16:19:41灰彻蛋
日期:2011-06-22 19:28:30现任管理团队成员
日期:2011-05-07 01:45:082010广州亚运会纪念徽章:拳击
日期:2011-04-08 16:56:552011新春纪念徽章
日期:2011-02-18 11:43:332011新春纪念徽章
日期:2011-01-25 15:42:562011新春纪念徽章
日期:2011-01-25 15:42:332011新春纪念徽章
日期:2011-01-25 15:42:15
18#
 楼主| 发表于 2007-8-14 14:10 | 只看该作者
借兄弟们的精彩解答,给自己授精。哈哈

使用道具 举报

回复
论坛徽章:
0
19#
发表于 2008-3-9 13:33 | 只看该作者
好难懂哦

使用道具 举报

回复
论坛徽章:
0
20#
发表于 2009-10-14 17:11 | 只看该作者
受以精华只贴 ~~

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表