Sql sybase-showplan通过向查询中添加另一个表,大大降低了估计的I/O

Sql sybase-showplan通过向查询中添加另一个表,大大降低了估计的I/O,sql,sybase,Sql,Sybase,查询的应用已经改变,但理论是一样的 4个表: 状态-状态列表(状态索引) stores-stores及其所处的状态(state、store上的单独索引) store_orders-将订单绑定到存储(存储、订单上的单独索引) 订单状态-具有订单和状态(订单和状态的单独索引) 我想计算一个特定状态下每个状态下的订单数量 一个问题: 选择操作系统订单状态、计数(操作系统订单状态) 从门店sto、门店订单so、订单状态os 其中sto.state='PA' sto.store=so.store so.o

查询的应用已经改变,但理论是一样的

4个表:

状态-状态列表(状态索引) stores-stores及其所处的状态(state、store上的单独索引) store_orders-将订单绑定到存储(存储、订单上的单独索引) 订单状态-具有订单和状态(订单和状态的单独索引)

我想计算一个特定状态下每个状态下的订单数量

一个问题:

选择操作系统订单状态、计数(操作系统订单状态) 从门店sto、门店订单so、订单状态os 其中sto.state='PA' sto.store=so.store so.order=os.order 按os.order\U状态分组

在实际应用程序中,这里的showplan估计I/O约为500000

但如果我这样做:

选择操作系统订单状态、计数(操作系统订单状态) 从状态sta、存储sto、存储订单so、订单状态os 其中sta.state='PA' 其中sto.state=sta.state sto.store=so.store so.order=os.order 按os.order\U状态分组

I/O估计在2000左右,我所做的所有更改都是将states表连接到stores表,并在states而不是stores中指定确切的值

无论我指定一个显式值,还是使用该显式值连接另一个表,DBM都必须对存储进行相同的搜索,这难道不是吗

我正在试图弄清楚为什么估计的I/O要高得多


我不是DBA,但我会尽可能多地学习,因为我总是碰到这样的事情,我也不知道为什么。

懒惰的Bob,你能不能也打开IO统计信息,然后将结果添加到问题中:

将统计信息设置为on

showplan本身不会提供您在评论中报告的信息

此外,请张贴准确的工作查询-理想情况下,格式正确


您的查询显示“where sta.state='PA'where sto.state=sta.state”,这显然不是您可以运行的,您是否可以打开IO统计信息,然后将结果添加到问题中:

将统计信息设置为on

showplan本身不会提供您在评论中报告的信息

此外,请张贴准确的工作查询-理想情况下,格式正确


您的查询显示“where sta.state='PA'where sto.state=sta.state”,这显然不是您可以运行的内容

showplan将提供它正在执行的操作的详细信息,他们没有解释IO不同的原因吗?我查看了两个showplan,使用了所有相同的索引,页面大小相同,等等。我看到的唯一区别是附加表和总I/O。sybase showplan只显示总I/O,而不是一个表或另一个表中的单个I/O。showplan将详细说明它正在做什么,他们没有解释IO不同的原因吗?我浏览了两个showplan,使用了所有相同的索引,页面大小相同,等等。我看到的唯一区别是附加表和总I/O。sybase showplan仅显示总I/O,而不是一个表或另一个表中的单个I/O。谢谢DVK。。。这正是我需要的命令。在查看了实际的I/O统计数据之后,结果表明,正如预期的那样,添加额外的表实际上会导致更高的I/O成本。好的,您可以打印两个查询的IO结果和查询计划的确切输出,以便通过添加表来帮助找出IO下降的原因吗?(最有可能的是,对一些大桌子的扫描较少)谢谢你,DVK。。。这正是我需要的命令。在查看了实际的I/O统计数据之后,结果表明,正如预期的那样,添加额外的表实际上会导致更高的I/O成本。好的,您可以打印两个查询的IO结果和查询计划的确切输出,以便通过添加表来帮助找出IO下降的原因吗?(最有可能的情况是,对某些大型表的扫描较少)