You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WSO2 Identity Server 5.11.0密码授权查询慢、CPU过高求助

解决WSO2 Identity Server 5.11.0密码授权查询性能差、CPU占用高的问题

针对你升级后遇到的密码授权流程中MSSQL查询性能问题,结合大表数据量的情况,给出以下实用优化方案:

1. 优化UM_USER_ATTRIBUTE表的索引

当前查询的核心是从4500万条数据的UM_USER_ATTRIBUTE中快速筛选出符合条件的记录,现有索引大概率无法覆盖所有查询条件,导致全表扫描或低效索引扫描。建议创建复合覆盖索引:

CREATE NONCLUSTERED INDEX IX_UM_USER_ATTRIBUTE_Tenant_Profile_Attr ON UM_USER_ATTRIBUTE 
(
    UM_TENANT_ID,
    UM_PROFILE_ID,
    UM_ATTR_NAME,
    UM_ATTR_VALUE
)
INCLUDE (UM_USER_ID); -- 包含关联所需的UM_USER_ID,避免回表查询

这个索引能让数据库直接通过索引定位到符合租户、配置文件、属性名和属性值的记录,无需扫描全表,大幅降低CPU开销。

2. 移除不必要的DISTINCT

先验证查询是否真的需要DISTINCT:执行以下语句检查是否存在重复的UM_USER_ID结果:

SELECT u.UM_USER_ID, COUNT(*) AS cnt
FROM UM_USER u
INNER JOIN UM_USER_ATTRIBUTE ua 
    ON u.UM_ID = ua.UM_USER_ID
WHERE ua.UM_TENANT_ID = -1234
  AND ua.UM_PROFILE_ID = 'DEFAULT'
  AND ua.UM_ATTR_NAME = 'uid'
  AND ua.UM_ATTR_VALUE = 'whatever@something.com'
  AND u.UM_TENANT_ID = -1234
GROUP BY u.UM_USER_ID
HAVING COUNT(*) > 1;

如果没有返回结果,说明每个用户对应的uid属性是唯一的,DISTINCT完全多余——它会强制数据库进行排序去重,这是高CPU占用的主要原因之一,直接去掉即可。

3. 调整查询逻辑,先过滤大表再关联

将查询拆分为子查询,先从大表UM_USER_ATTRIBUTE中筛选出目标UM_USER_ID,再关联小表UM_USER,减少关联的数据量:

SELECT u.UM_USER_ID
FROM UM_USER u
INNER JOIN (
    SELECT UM_USER_ID
    FROM UM_USER_ATTRIBUTE
    WHERE UM_TENANT_ID = -1234
      AND UM_PROFILE_ID = 'DEFAULT'
      AND UM_ATTR_NAME = 'uid'
      AND UM_ATTR_VALUE = 'whatever@something.com'
) ua ON u.UM_ID = ua.UM_USER_ID
WHERE u.UM_TENANT_ID = -1234;

这种写法让数据库优先处理大表的过滤,得到少量符合条件的UM_USER_ID后再关联UM_USER,避免大表全量关联带来的CPU消耗。

4. 检查MSSQL执行计划定位瓶颈

在SSMS中打开执行计划(快捷键Ctrl+M),运行原查询,查看是否存在以下问题:

  • 全表扫描(Table Scan):说明索引未生效,检查索引是否创建正确、统计信息是否过期(可执行UPDATE STATISTICS UM_USER_ATTRIBUTE更新统计)
  • 排序操作(Sort):大概率是DISTINCT导致,去掉后可消除
  • 键查找/行标识符查找(Key Lookup/RID Lookup):说明索引未包含所需字段,用INCLUDE子句补充即可

5. 开启WSO2 IS用户信息缓存

密码授权流程中如果频繁查询用户信息,开启缓存能大幅减少数据库请求。修改WSO2 IS的repository/conf/user-mgt.xml配置:

<UserStoreManager class="org.wso2.carbon.user.core.jdbc.JDBCUserStoreManager">
    <!-- 开启缓存 -->
    <Property name="CacheEnabled">true</Property>
    <!-- 调整缓存过期时间,根据实际业务设置 -->
    <Property name="CacheTimeout">1800</Property>
    <!-- 其他配置... -->
</UserStoreManager>

缓存会将用户信息存储在内存中,避免重复查询数据库,直接降低CPU负载。

内容的提问来源于stack exchange,提问作者user22872069

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 02:57:39