SQL执行时间太长。如何优化这个查询?

huangapple go评论125阅读模式
英文:

SQL takes too long. How can I optimize this query?

问题

这个查询的问题是速度太慢。我不确定如何优化它。

英文:

The issue with this query is that is too slow:

  1. SELECT
  2. *
  3. FROM
  4. (
  5. SELECT
  6. *
  7. FROM
  8. (
  9. SELECT
  10. *
  11. FROM
  12. (
  13. SELECT
  14. *
  15. FROM
  16. (
  17. SELECT
  18. *
  19. FROM
  20. (
  21. SELECT
  22. MIN(UPPER(MSG_USERS.MSU_LOGIN_NAME)) as MSU_LOGIN_NAME_SORT,
  23. MSG_USERS.MSU_USER_ID ID,
  24. MSG_USERS.MSU_LAST_LOGIN_TIME,
  25. MSG_USERS.MSU_CREATED_DATE,
  26. MSG_USERS.MSU_LOGIN_NAME,
  27. MSG_USERS.MSU_UUID,
  28. MSG_USERS.MSU_FIRST_NAME,
  29. MSG_USERS.MSU_LAST_NAME,
  30. MSG_USERS.MSU_LAST_UPDATED,
  31. MSG_USERS.MSU_CUSTOMER_UID
  32. FROM
  33. (
  34. MSG_USERS
  35. left join MSG_ACCOUNT_USERS on MAU_USER_ID = MSU_USER_ID
  36. left join MSG_ACCOUNTS on MSA_ACCOUNT_ID = MAU_ACCOUNT_ID
  37. left join MSG_TENANTS on MTE_ACCOUNT_ID = MAU_ACCOUNT_ID
  38. )
  39. WHERE
  40. (
  41. MSG_USERS.MSU_ROLE_NAME <> 'CUSTOMER_INTEGRATION'
  42. AND MSG_USERS.MSU_ROLE_NAME <> 'CUSTOMER_EXTERNAL_INTEGRATION'
  43. AND MSG_USERS.MSU_ROLE_NAME <> 'INTEGRATION_SUPERUSER'
  44. AND MSG_USERS.MSU_ROLE_NAME <> 'OAUTH2_CLIENT'
  45. )
  46. GROUP BY
  47. MSG_USERS.MSU_USER_ID,
  48. MSG_USERS.MSU_LAST_LOGIN_TIME,
  49. MSG_USERS.MSU_CREATED_DATE,
  50. MSG_USERS.MSU_LOGIN_NAME,
  51. MSG_USERS.MSU_UUID,
  52. MSG_USERS.MSU_FIRST_NAME,
  53. MSG_USERS.MSU_LAST_NAME,
  54. MSG_USERS.MSU_LAST_UPDATED,
  55. MSG_USERS.MSU_CUSTOMER_UID
  56. ORDER BY
  57. MIN(UPPER(MSG_USERS.MSU_LOGIN_NAME)) ASC
  58. )
  59. ORDER BY
  60. UPPER(MSU_LOGIN_NAME_SORT) ASC,
  61. ID ASC
  62. )
  63. WHERE
  64. ROWNUM < 7
  65. )
  66. ORDER BY
  67. UPPER(MSU_LOGIN_NAME_SORT) DESC,
  68. ID DESC
  69. )
  70. WHERE
  71. ROWNUM < 7
  72. )
  73. ORDER BY
  74. UPPER(MSU_LOGIN_NAME_SORT) ASC,
  75. ID ASC;

I am not sure how to optimize it.

答案1

得分: 3

以下是翻译好的代码部分:

  1. 原则上,你执行:
  2. 选择 ...
  3. (((( ...
  4. 按顺序
  5. 最小(大写(MSG_USERS.MSU_LOGIN_NAME)) 升序
  6. )
  7. 按顺序
  8. 大写(MSU_LOGIN_NAME_SORT) 升序,
  9. ID 升序
  10. )
  11. ROWNUM < 7
  12. )
  13. 按顺序
  14. 大写(MSU_LOGIN_NAME_SORT) 降序,
  15. ID 降序
  16. )
  17. ROWNUM < 7
  18. )
  19. 按顺序
  20. 大写(MSU_LOGIN_NAME_SORT) 升序,
  21. ID 升序;

这个疯狂的链条的目的是什么?

你在表 MSG_ACCOUNT_USERS, MSG_ACCOUNTS, MSG_TENANTS 上进行了 LEFT JOIN,但它们在你的查询中并未被使用。那么,为什么你要(左)连接它们?它们没有任何影响,我猜你可以从查询中简单地移除它们,然后你甚至不需要 GROUP BY 子句。

我假设你的查询可以简化成像这样的:

  1. 选择
  2. MSG_USERS.MSU_USER_ID ID,
  3. MSG_USERS.MSU_LAST_LOGIN_TIME,
  4. MSG_USERS.MSU_CREATED_DATE,
  5. MSG_USERS.MSU_LOGIN_NAME,
  6. MSG_USERS.MSU_UUID,
  7. MSG_USERS.MSU_FIRST_NAME,
  8. MSG_USERS.MSU_LAST_NAME,
  9. MSG_USERS.MSU_LAST_UPDATED,
  10. MSG_USERS.MSU_CUSTOMER_UID
  11. MSG_USERS
  12. MSG_USERS.MSU_ROLE_NAME 不在 ('CUSTOMER_INTEGRATION' 'CUSTOMER_EXTERNAL_INTEGRATION' 'INTEGRATION_SUPERUSER' 'OAUTH2_CLIENT') 的情况下
  13. 按顺序 ...
  14. 获取前 7 ;
英文:

In principle you do

  1. select ...
  2. from (((( ...
  3. ORDER BY
  4. MIN(UPPER(MSG_USERS.MSU_LOGIN_NAME)) ASC
  5. )
  6. ORDER BY
  7. UPPER(MSU_LOGIN_NAME_SORT) ASC,
  8. ID ASC
  9. )
  10. WHERE
  11. ROWNUM < 7
  12. )
  13. ORDER BY
  14. UPPER(MSU_LOGIN_NAME_SORT) DESC,
  15. ID DESC
  16. )
  17. WHERE
  18. ROWNUM < 7
  19. )
  20. ORDER BY
  21. UPPER(MSU_LOGIN_NAME_SORT) ASC,
  22. ID ASC;

What is the purpose of this crazy chain?

You make LEFT JOIN with tables MSG_ACCOUNT_USERS, MSG_ACCOUNTS, MSG_TENANTS but they are not used in your query. So, why do you (left) join them? They have no effect, I would guess you can simply remove them from your query and then you even don't need the GROUP BY clause.

I assume your query can be reduced to something like this:

  1. SELECT
  2. MSG_USERS.MSU_USER_ID ID,
  3. MSG_USERS.MSU_LAST_LOGIN_TIME,
  4. MSG_USERS.MSU_CREATED_DATE,
  5. MSG_USERS.MSU_LOGIN_NAME,
  6. MSG_USERS.MSU_UUID,
  7. MSG_USERS.MSU_FIRST_NAME,
  8. MSG_USERS.MSU_LAST_NAME,
  9. MSG_USERS.MSU_LAST_UPDATED,
  10. MSG_USERS.MSU_CUSTOMER_UID
  11. FROM MSG_USERS
  12. WHERE MSG_USERS.MSU_ROLE_NAME NOT IN ('CUSTOMER_INTEGRATION' 'CUSTOMER_EXTERNAL_INTEGRATION' 'INTEGRATION_SUPERUSER' 'OAUTH2_CLIENT')
  13. ORDER BY ...
  14. FETCH FIRST 7 ROWS ONLY;

huangapple
  • 本文由 发表于 2023年5月11日 15:57:57
  • 转载请务必保留本文链接:https://go.coder-hub.com/76225311.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定