首页 > 解决方案 > 如果您从 Postgresql 的 Java 函数中的函数参数传递查询值,是否存在性能差异?

问题描述

我想添加索引来优化以下查询。我们从函数参数传递 orgId 和 service 的值。我想知道的是这是否会以任何方式影响性能?还是和我们直接在查询中传递值一样。

这里的模板是一个执行查询的 jdbc


        fun queryUsers(orgId: OrgId, service: Service): Set<UserId> {
        val sql = """
                SELECT DISTINCT user_id
                FROM users
                WHERE org_id = :orgId AND service = :service
                """.trimIndent()
        val userIds = mutableSetOf<UserId>()
        template.query(
                "queryUsers",
                sql,
                mapOf("orgId" to orgId.uuid(), "service" to service.toString()),
                {
                    userIds.add(UserId.fromString(it.getString("user_id")))
                })
        return userIds
    }

标签: sqlpostgresql

解决方案


不直接,直接或通过 proc 运行此查询的性能没有差异。

但是它可能会影响服务器性能(它可能真的不是问题)但是会发生这种情况,每当您直接为 orgId 和 service 的每个组合运行此查询时,sql 引擎都会创建一个新的查询计划并将其缓存以使用它。

如果您运行相同的确切查询,并且如果您在短时间内使用不同的 service 和 orgid 组合值多次运行此查询,则缓存将充满此查询的查询计划,并从缓存中清空其他查询计划并生成其他查询计划查询慢。

但是,由于它是一个非常简单的查询,并且如果您不在短时间内大量运行它,那根本不是问题

但也建议使用存储过程,避免sql注入和代码重用,更好的代码维护


推荐阅读