我正在 PostgreSQL 数据库上连接一个大表(约 600K 行)和一个较小的表(约 11K 行),并且需要通过描述性字段过滤结果集text。
当按bigint较小表的字段进行过滤时,优化器会正确估计结果行数,但是当按text小表的字段进行过滤时,优化器会低估结果行数数千倍,即使有 1- 1 两者之间的关系。
我无法理解这种行为。
\n整个环境,包括数据,都可以使用此 Pastebin中的说明进行设置。对于传统的在线模拟数据库来说太大了。
\nselect version();\n\n|version |\n|---------------------------------------------------------------------------------------------------|\n|PostgreSQL 13.6 on x86_64-pc-linux-gnu, compiled by gcc (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0, 64-bit|\nRun Code Online (Sandbox Code Playgroud)\n坐在 Azure 灵活服务器上。
\n父表(11228 行):
\ncreate table parent_tb as\nselect id, md5(random()::text) descr\nfrom generate_series(1::bigint,11228::bigint) as a(id);\n\nalter table parent_tb add primary key (id);\ncreate index idx_parent_tb_desc on parent_tb(descr);\nRun Code Online (Sandbox Code Playgroud)\n样本数据:
\nselect *\nfrom parent_tb\nlimit …Run Code Online (Sandbox Code Playgroud)