【问题标题】:Why Firebird access to joined tables in a simple count?为什么 Firebird 可以通过简单的计数访问连接的表?
【发布时间】:2014-04-20 07:18:47
【问题描述】:

我有这样的看法:

SELECT F1, F2
FROM T1
LEFT JOIN T2 ON T2.ID=T1.ID
LEFT JOIN T3 ON T3.ID=T1.ID

当我进行如下计数查询时:

SELECT COUNT(*) FROM MYVIEW

如果 T1 有 1000 条记录,Firebird 生成对记录的 3000 次访问:1000 次用于 T1,1000 次用于 T2,1000 次用于 T3。

有没有办法优化它?我可以直接使用表格: 从 T1 中选择 COUNT(*)

但我需要使用视图,我不能使用表格。嗯,问题比较复杂,但是我用这个简单的例子来说明基础问题。 Firebird 似乎没有优化某些查询,我的问题是我是否可以优化查询以更改视图的 DDL 中的某些内容。

【问题讨论】:

  • LEFT JOIN 应该导致返回小于 3000(即最多1000)。结果不同于 3 个单独表格上的 3 个单独计数。如果 LEFT JOIN 导致性能不佳,请检查索引和查询计划。
  • @user2864740 afaik op 指的是读取统计信息,而不是计数。

标签: firebird


【解决方案1】:

T1T2(和T3)的JOIN 可以产生比T1 更多的记录。假设T1中的每条记录在T2中有两条记录,那么T1中的1000条记录计数结果为2000。

理论上优化器可以知道T1.IDT2.ID都是主键(或唯一的),因此只扫描T1,但Firebird中的优化器不是很先进,所以也许它根本不能这样做。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-25
    • 2018-04-30
    • 2020-12-25
    • 2015-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多