0

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

4张桌子:

states - 状态列表(状态索引) stores - 商店,以及它们所处的状态(状态,商店的单独索引) store_orders - 将订单与商店联系起来(商店,订单的单独索引) order_statuses - 有订单和状态(订单、状态的单独索引)

我想计算特定状态的每个状态有多少订单。

一个查询:

select os.order_status, count(os.order_status) from stores sto, store_order so, order_statuses os where sto.state = 'PA' and sto.store = so.store and so.order = os.order group by os.order_status

在实际应用中,这里的展示计划估计 I/O 约为 500,000

但如果我这样做:

select os.order_status, count(os.order_status) from states sta, stores sto, store_order so, order_statuses os where sta.state = 'PA' where sto.state = sta.state and sto.store = so.store 等等。 order = os.order group by os.order_status

I/O 估计在 2,000 左右,我更改查询所做的只是将 states 表连接到 stores 表,并在 states 中而不是 store 中指定确切的值。

无论我指定一个显式值,还是用那个显式值加入另一个表,DBM 是否仍然需要对存储进行相同的搜索?

我试图弄清楚为什么估计的 I/O 如此之高。

我不是 DBA,但我会尽可能多地学习,因为我经常遇到这样的事情,而且我永远不知道为什么。

4

1 回答 1

3

懒惰的鲍勃,您能否也打开 IO 统计,然后将结果添加到问题中:

设置统计信息

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

另外,请发布准确的工作查询 - 理想情况下,格式正确。

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

于 2009-08-24T13:31:21.673 回答