- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
使用 PostgreSQL 13,我遇到了一个性能问题,从连接两个表的 View 中选择最高 ID,具体取决于我执行的选择语句。
这是一个示例设置:
CREATE TABLE test1 (
id BIGSERIAL PRIMARY KEY,
joincol VARCHAR
);
CREATE TABLE test2 (
joincol VARCHAR
);
CREATE INDEX ON test1 (id);
CREATE INDEX ON test1 (joincol);
CREATE INDEX ON test2 (joincol);
CREATE VIEW testview AS (
SELECT test1.id,
test1.joincol AS t1charcol,
test2.joincol AS t2charcol
FROM test1, test2
WHERE test1.joincol = test2.joincol
);
我正在执行两条导致完全不同的执行计划和运行时间的语句。以下语句的执行时间不到 100 毫秒。据我了解执行计划,运行时独立于行数,因为 Postgres 逐行迭代行(从最高 ID 开始,使用索引)直到可以连接一行并立即返回。
SELECT id FROM testview ORDER BY ID DESC LIMIT 1;
但是,这个平均需要超过 1 秒(取决于行数),因为在 Postgres 使用索引选择最高 ID 之前,这两个表是“完全连接”的。
SELECT MAX(id) FROM testview;
请引用 dbfiddle 上的这个示例来检查解释计划:
https://www.db-fiddle.com/f/bkMNeY6zXqBAYUsprJ5eWZ/1
在我的真实环境中,test1
只包含一手完整的行 (< 100),在 joincol
中具有唯一值。 test2
包含多达 ~1000 万行,其中 joincol
始终与 test1
的 joincol
的值相匹配。 test2
的 joincol
不可为空。
为什么 Postgres 无法识别它可以在行的基础上使用索引向后扫描进行第二次选择?有什么我可以改进的表/索引吗?
最佳答案
why does Postgres not recognize that it could use a Index Scan Backward on row basis for the second select?
为了使上下文清晰:
max(id)
不包括 NULL
值。但是ORDER BY ... LIMIT 1
没有。NULL
值按升序排序在最后,在降序中在第一。所以Index Scan Backward
可能无法首先找到最大值(根据 max()
),但可以找到任意数量的 NULL
值(value)观。正式等同于:
SELECT max(id) FROM testview;
不是:
SELECT id FROM testview ORDER BY id DESC LIMIT 1;
但是:
SELECT id FROM testview ORDER BY id DESC NULLS LAST LIMIT 1;
后一个查询没有得到快速查询计划。但它会使用具有匹配排序顺序的索引:(id DESC NULLS LAST)
.
聚合函数的情况不同 min()
和 max()
.那些在定位表时得到一个快速计划 test1
直接使用 (id)
上的普通 PK 索引.但不是基于 View (或直接底层连接查询 - View 不是阻止程序)。在正确位置对 NULL 值进行排序的索引几乎没有任何效果。
我们知道id
在此查询中永远不可能是 NULL
.该列定义为 NOT NULL
. View 中的连接实际上是一个 INNER JOIN
。不能介绍NULL
id
的值.
我们也知道 test.id
上的索引不能包含 NULL 值。
但是 Postgres 查询规划器不是 AI。 (也不会尝试这样做,这可能会很快失控。)我看到了两个缺点:
min()
和 max()
仅在针对表时获取快速计划,不考虑索引排序顺序,添加索引条件:Index Cond: (id IS NOT NULL)
ORDER BY ... LIMIT 1
仅使用完全匹配的索引排序顺序获取快速计划。不确定,是否可以(轻松)改进。
db<> fiddle here - 展示以上所有内容
Is there anything I could improve on the tables/indexes?
这个索引完全没用:
CREATE INDEX ON "test" ("id");
PK test.id
是通过列上的唯一索引实现的,它已经涵盖了附加索引可能为您做的所有事情。
可能还有更多,等待问题解决。
测试用例与实际用例相距太远,没有意义。
在测试设置中,每个表有 100k 行,不能保证 joincol
中的每个值另一边有一个匹配项,并且两列都可以为 NULL
您的真实案例在 table1
中有 1000 万行并且 table2
中 < 100 行, table1.joincol
中的每个值在 table2.joincol
中匹配, 两者都被定义为 NOT NULL
, 和 table2.joincol
是独特的。经典的一对多关系。应该有一个 UNIQUE
对 table2.joincol
的约束和 FK 约束 t1.joincol --> t2.joincol
.
但是目前这个问题已经完全扭曲了。等待清理干净。
关于sql - View 对聚合函数的性能影响与结果集限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68665508/
我有一个 ServiceBusQueue(SBQ),它获取大量消息负载。我有一个具有 accessRights(manage) 的 ServiceBusTrigger(SBT),它不断轮询来自 SBQ
在下面给出的结果集中,有 2 个唯一用户 (id),并且查询中可能会出现更多此类用户: 这是多连接查询: select id, name, col1Code, col2Code, col2Va
我正在用 Python 2.7.3 编写一个带有 GRequests 的小脚本和 lxml 可以让我从各种网站收集一些收藏卡价格并进行比较。问题是其中一个网站限制了请求的数量,如果我超过它,就会发回
我想知道何时实际使用删除级联或删除限制以及更新级联或更新限制。我对使用它们或在我的数据库中应用感到很困惑。 最佳答案 在外键约束上使用级联运算符是一个热门话题。 理论上,如果您知道删除父对象也将自动删
下面是我的输出,我只想显示那些重复的名字。每个名字都是飞行员,数字是飞行员驾驶的飞机类型。我想显示驾驶不止一架飞机的飞行员的姓名。我正在使用 sql*plus PIL_PILOTNAME
我正在评估不同的移动框架,我认为 nativescript 是一个不错的选择。但我不知道开发过程是否存在限制。例如,我对样式有限制(这并不重要),但我想知道将来我是否可以有限制并且不能使用某些 nat
我正在尝试使用 grails 数据绑定(bind)将一些表单参数映射到我的模型中,但我认为在映射嵌入式集合方面可能存在一些限制。 例如,如果我提交一些这样的参数,那么映射工作正常: //this wo
是否可以将 django 自过滤器起的时间限制为 7 天。如果日期超过 7 天,则不应用过滤器 最佳答案 timesince 的源代码位于 django/django/utils/timesince.
我想在我的网站上嵌入一个 PayPal 捐赠按钮。但问题是我住在伊朗——这个国家受到制裁,人们不使用国际银行账户或主要信用卡。 有什么想法吗?请帮忙! 问候 沮丧 最佳答案 您可以在伊朗境内使用为伊朗
这是我的查询 select PhoneNumber as _data,PhoneType as _type from contact_phonenumbers where ContactID = 3
这个问题在这里已经有了答案: What is the maximum number of parameters passed to $in query in MongoDB? (4 个答案) 关闭
我的一个项目的 AndroidManifest.xml 变得越来越大(> 1000 行),因为我必须对某些文件类型使用react并且涵盖所有情况变得越来越复杂。我想知道 list 大小是否有任何限制。
在使用 Sybase、Infomix、DB2 等其他数据库产品多年后使用 MySQL 5.1 Enterprise 时;我遇到了 MySQL 不会做的事情。例如,它只能为 SELECT 查询生成 EX
这个问题在这里已经有了答案: What is the maximum number of parameters passed to $in query in MongoDB? (4 个回答) 关闭5年
通常我们是在{$apache}/conf/httpd.conf中设置Apache的参数,然而我们并没有发现可以设置日志文件大小的配置指令,通过参考http://httpd.apache.org/do
我正在搜索最大的 Android SharedPreferences 键值对,但找不到任何好的答案。其次,我想问一下,如果我有一个键,它的字符串值限制是多少。多少字符可以放入其中。如果我需要频繁更改值
我目前正在试验 SoundCloud API,并注意到我对/tracks 资源的 GET 请求一次从不返回超过 200 个结果。关于这个的几个问题: 这个限制是故意的吗? 有没有办法增加这个限制? 如
我正在与一家名为 Dwolla 的金融技术公司合作,该公司提供了一个 API,用于将银行信息附加到用户并收取/发送 ACH 付款。 他们需要我将我的 TLS 最低版本升级到 1.2(禁用 TLS 1.
我在 PHP 中有一个多维数组,如下所示: $array = Array ( [0] => Array ( [bill] => 1 ) [1] => Array ( [
我在获取下一个查询的第一行时遇到了问题: Select mar.Title MarketTitle, ololo.NUMBER, ololo.Title from Markets mar JOIN(
我是一名优秀的程序员,十分优秀!