我有一个返回一组“记录”的查询。结果总是来自同一个表,并且应该始终是唯一的。它有一组内部连接,用于将行过滤到适当的子集。查询返回大约10列。但是,我发现它返回的是重复的行,所以我向查询添加了select distinct,这解决了重复问题,但存在严重的性能问题。
我的理解是,在这种情况下,select distinct on (records.id), id...将返回相同的结果,因为所有重复项都将具有相同的主键,并且似乎快了大约两倍。
我的其他测试表明,group by records.id甚至再次更快,而且似乎做了同样的事情?
这三种方法总是返回相同的一组单表记录,我说的对吗?
另外,有没有一种简单的方法来比较不同方法的结果,以确保集被返回?
下面是我的问题:
SELECT DISTINCT records.*
FROM records
INNER JOIN records parents on parents.path @> records.path
INNER JOIN record_types ON record_types.id = records.record_type_id
INNER JOIN user_roles ON user_roles.record_id = parents.id AND user_roles.user_id = _user_id
INNER JOIN memberships ON memberships.role_id = user_roles.role_id
INNER JOIN roles ON roles.id = memberships.role_id
INNER JOIN groups ON memberships.group_id = groups.id AND
groups.id = record_types.view_group_id任何单独的记录都可以有“父”记录的树。这是使用ltree插件完成的。实际上,我们正在查看用户是否具有定义为当前记录或任何父级记录的“查看组”的组中的角色。查询实际上是一个函数,传入的是_user_id。
发布于 2020-05-03 01:43:42
因为您只从records中进行选择,所以您的不需要 DISTINCT;记录已经是不同的(我假设)。
因此,您遇到的重复项可能是由所有joins引起的,例如,如果多个角色或组成员与您的一条记录匹配,则相同的record将与这些引用中的每个组合。
SELECT *
FROM records r
WHERE EXISTS (
SELECT *
FROM records pa on pa.path @> r.path
JOIN record_types typ ON typ.id = r.record_type_id
JOIN user_roles ur ON ur.record_id = pa.id AND ur.user_id = _user_id
JOIN memberships mem ON mem.role_id = ur.role_id
JOIN roles ON roles.id = mem.role_id
JOIN groups gr ON mem.group_id = gr.id AND gr.id = typ.view_group_id
)
;https://stackoverflow.com/questions/61562900
复制相似问题