首页 > 解决方案 > 在 where 子句的左侧如何使用合并函数?

问题描述

我有以下要优化的查询

                SELECT DISTINCT
                  ues.user_id,
                  ues.user_type,
                  ues.owner
                FROM user_entitled_service ues
                LEFT JOIN user_resource_group urg
                    ON urg.org_id = ues.org_id AND urg.user_id = ues.user_id AND urg.service = ues.service
                INNER JOIN user_assignment ua
                    ON ua.org_id = ues.org_id AND ua.user_id = ues.user_id AND ua.service = ues.service
                WHERE ues.org_id = :orgId AND ues.service = CAST(:service AS service)
                    AND COALESCE(urg.resource_group_id, '') = :resourceGroupId
                    AND NOT EXISTS (
                        SELECT org_id, user_id, service, cluster_id
                        FROM user_discover_state
                        WHERE status = '${UserDiscoverStatus.found}'
                          AND org_id = ues.org_id AND user_id = ues.user_id AND service = ues.service)

我希望能够在 resource_group_id 上使用索引,但由于它使用合并函数,因此不能在那里使用索引。我不清楚的是为什么在左侧使用合并,我见过的大多数查询都在右侧使用它,这更有意义,因为我们正在将列(键)与值匹配,它是如何在右侧使用时有效吗?我们可以将它用于索引吗?

标签: sqlpostgresql

解决方案


在不知道您的确切数据和查询逻辑的情况下,我无法直接评论COALESCE. 我能做的是重写逻辑,使其变得可分析(即可以使用索引):

AND COALESCE(urg.resource_group_id, '') = :resourceGroupId

这变成:

AND urg.resource_group_id = :resourceGroupId OR
    urg.resource_group_id IS NULL AND :resourceGroupId = ''

推荐阅读