我实现了多对多的关系:
CREATE TABLE public.message (
id BIGSERIAL PRIMARY KEY,
name varchar(40) UNIQUE NOT NULL
);
CREATE TABLE public.package(
id BIGSERIAL PRIMARY KEY,
name varchar(40) UNIQUE NOT NULL
);
CREATE TABLE public.package_to_message (
message_id BIGINT NOT NULL,
package_id BIGINT NOT NULL,
CONSTRAINT package_to_message_pk PRIMARY KEY (message_id, package_id)
);
我需要选择一个与一组精确定义的消息关联的包[message_name_1, message_name_2, message_name_3]
。以上所有,没有其他。是否可以使用或多或少优化的查询来执行此操作?想不出任何办法。
这里的关键词是“关系划分”。
对于给定的规格,它不会比这更快:
但也许您需要一个更通用/动态的查询......
称呼:
我的查询假设您传递不同的消息名称(无重复)。另外,
message.name
已定义UNIQUE
。注意
ANY
和如何ALL
接受数组或集合。请参阅:关于简短语法
TABLE m
:指标与表现
索引 1
UNIQUE
表上的约束很好message
地覆盖了查找。如果性能至关重要(并且您满足仅索引扫描的先决条件),则覆盖索引会略好一些:
看:
索引 2
为
PRIMARY KEY
下一步package_to_message(message_id, package_id)
提供了完美的索引。索引 3
package_to_message(package_id, message_id)
理想情况下,您可以在最后一步添加另一个索引。请参阅:有了这 3 个索引,并且您的表已足够清空,则两个查询都可以仅使用索引扫描。然后,即使对于大型表,最多也只需几毫秒,甚至执行时间也低于 1 毫秒。
--
有关的:
另一个选项使用计数来验证我们是否匹配所有项。请注意,您的问题具体是一个多向关系除法(无余数)的示例,而不是有余数的示例。
这是针对任何多路关系除法的更通用解决方案的变体,通过使用数组可以提高效率
对于“有余数”的相同内容,将
HAVING
子句更改为 ,HAVING count(*) >= (SELECT count(*) FROM inputData);
并将 更改LEFT JOIN
为JOIN
。另请参阅本文以及其他文章,了解有关关系部门的更多选项。