Sql 使用联接和多个选择优化Oracle查询

Sql 使用联接和多个选择优化Oracle查询,sql,oracle,Sql,Oracle,我正在运行一个查询,在IDE中运行需要6-7秒,当我通过汇流插件将结果发布到wiki时需要4-5倍的时间。我对Oracle相当陌生,Over/partitionby section是我在研究堆栈溢出时学到的东西。它让我得到了我想要的结果,但还不够快 我正在努力实现的目标: 我们有一个测试存储库。每个测试一天运行多次。我需要每个测试的最新执行状态、执行日期和其他相关值。这个查询只返回4k记录,所以我认为它不应该花费这么长的时间。当在wiki上显示结果需要30秒以上时(我们需要在wiki上发布结果)

我正在运行一个查询,在IDE中运行需要6-7秒,当我通过汇流插件将结果发布到wiki时需要4-5倍的时间。我对Oracle相当陌生,Over/partitionby section是我在研究堆栈溢出时学到的东西。它让我得到了我想要的结果,但还不够快

我正在努力实现的目标: 我们有一个测试存储库。每个测试一天运行多次。我需要每个测试的最新执行状态、执行日期和其他相关值。这个查询只返回4k记录,所以我认为它不应该花费这么长的时间。当在wiki上显示结果需要30秒以上时(我们需要在wiki上发布结果),效率非常低

我希望有人能看一看,帮助我优化这个,帮助我理解解决方案是什么。将它分解并单独运行,速度问题肯定与分区/分区有关

先谢谢你

SELECT
TS_USER_11                               AS "Team",
TS_TEST_ID                               AS "Test ID",
TS_NAME                                  AS "Test Name",
TS_USER_06                               AS "Priority",

CASE  
WHEN RN_STATUS = 'Failed' OR RN_STATUS = 'Issue Found' THEN 'Ran with Issues'
WHEN RN_STATUS = 'No Run' AND RN_EXECUTION_DATE IS NOT NULL THEN 'Skipped'
WHEN (RN_STATUS = 'No Run' OR RN_STATUS = 'N/A') AND RN_EXECUTION_DATE IS NULL THEN 'Not Run'
    ELSE RN_STATUS END                       AS "Exec Status",

TS_USER_03                               AS "Type",
TO_CHAR(RN_EXECUTION_DATE, 'YYYY-MM-DD') AS "Execution Date",
RN_USER_01                               AS "Build Number"

FROM

(SELECT
  TS_NAME,
  TS_USER_11,
  TS_USER_06,
  TS_TEST_ID,
  TS_USER_03,
  RN_RUN_ID,
  RN_USER_01,
  max(RN_RUN_ID)

OVER
(
  PARTITION BY RN_TEST_CONFIG_ID ) last_run_id,
  RUN.RN_STATUS,
  RUN.RN_EXECUTION_DATE

FROM DATA_PROTECTION_HENDRIX_DB.RUN
LEFT JOIN DATA_PROTECTION_HENDRIX_DB.TEST ON RN_TEST_ID = TS_TEST_ID
LEFT JOIN DATA_PROTECTION_HENDRIX_DB.ALL_LISTS ON AL_ITEM_ID = TS_SUBJECT

WHERE (ALL_LISTS.AL_ABSOLUTE_PATH NOT LIKE 'AAAAAPAAJ%' AND ALL_LISTS.AL_ABSOLUTE_PATH NOT LIKE 'AAAAAPAAC%')  AND
     (TS_TEMPLATE IS NULL OR TS_TEMPLATE = 'N')
)

WHERE RN_RUN_ID = last_run_id

我希望你们应该有一个合适的索引来连接,也为了避免与太多的记录进行比较,我只是使用了第一个表(run)来识别所需的内容,然后与其他表连接

下面的sql可能对您有所帮助,我不确定,如果有帮助,请告诉我

谢谢 桑加马尼·埃拉尼扬


我希望你们应该有一个合适的索引来连接,也为了避免与太多的记录进行比较,我只是使用了第一个表(run)来识别所需的内容,然后与其他表连接

下面的sql可能对您有所帮助,我不确定,如果有帮助,请告诉我

谢谢 桑加马尼·埃拉尼扬


您应该在
(Run.rn\u test\u config\u id,Run.rn\u Run\u id)
(Run.rn\u Run\u id)
上有索引,这将有助于分区和后续连接

我还想看看这样调整查询是否有帮助:

SELECT  Test.ts_user_11 AS "Team", 
        Test.ts_test_id AS "Test ID",
        Test.ts_name AS "Test Name",
        TEST.ts_user_06 AS "Priority",
        CASE WHEN Run.rn_status = 'Failed' OR Run.rn_status = 'Issue Found' 
                  THEN 'Ran with Issues'
             WHEN Run.rn_status = 'No Run' AND Run.rn_execution_date IS NOT NULL 
                  THEN 'Skipped'
             WHEN (Run.rn_status = 'No Run' OR Run.rn_status = 'N/A') AND Run.rn_execution_date IS NULL 
                  THEN 'Not Run'
             ELSE Run.rn_status END AS "Exec Status",
        Test.ts_user_03 AS "Type",
        TO_CHAR(Run.rn_execution_date, 'YYYY-MM-DD') AS "Execution Date",
        Run.rn_user_01 AS "Build Number"  
FROM Data_Protection_Hendrix_DB.Run Run
-- one of the few times you can exclude the grouping condition from the results!
-- Only since rn_run_id is distinct
JOIN (SELECT MAX(rn_run_id) AS run_id
      FROM Data_Protection_Hendrix_DB.Run
      GROUP BY rn_test_config_id) Latest_Run
  ON Latest_Run.run_id = Run.rn_run_id
-- kept these as a LEFT JOIN, since that's more likely the intent.
-- I'm not sure that's what you were _getting_, though.
LEFT JOIN Data_Protection_Hendrix_DB.Test
       ON Test.ts_test_id = Run.rn_test_id
          AND Test.ts_template = 'N'
LEFT JOIN Data_Protection_Hendrix_DB.All_Lists
       ON All_Lists.al_item_id = Test.ts_subject
          AND All_Lists.al_absolute_path NOT LIKE 'AAAAAPAAJ%'
          AND All_Lists.al_absolute_path NOT LIKE 'AAAAAPAAC%'

您应该在
(Run.rn\u test\u config\u id,Run.rn\u Run\u id)
(Run.rn\u Run\u id)
上有索引,这将有助于分区和后续连接

我还想看看这样调整查询是否有帮助:

SELECT  Test.ts_user_11 AS "Team", 
        Test.ts_test_id AS "Test ID",
        Test.ts_name AS "Test Name",
        TEST.ts_user_06 AS "Priority",
        CASE WHEN Run.rn_status = 'Failed' OR Run.rn_status = 'Issue Found' 
                  THEN 'Ran with Issues'
             WHEN Run.rn_status = 'No Run' AND Run.rn_execution_date IS NOT NULL 
                  THEN 'Skipped'
             WHEN (Run.rn_status = 'No Run' OR Run.rn_status = 'N/A') AND Run.rn_execution_date IS NULL 
                  THEN 'Not Run'
             ELSE Run.rn_status END AS "Exec Status",
        Test.ts_user_03 AS "Type",
        TO_CHAR(Run.rn_execution_date, 'YYYY-MM-DD') AS "Execution Date",
        Run.rn_user_01 AS "Build Number"  
FROM Data_Protection_Hendrix_DB.Run Run
-- one of the few times you can exclude the grouping condition from the results!
-- Only since rn_run_id is distinct
JOIN (SELECT MAX(rn_run_id) AS run_id
      FROM Data_Protection_Hendrix_DB.Run
      GROUP BY rn_test_config_id) Latest_Run
  ON Latest_Run.run_id = Run.rn_run_id
-- kept these as a LEFT JOIN, since that's more likely the intent.
-- I'm not sure that's what you were _getting_, though.
LEFT JOIN Data_Protection_Hendrix_DB.Test
       ON Test.ts_test_id = Run.rn_test_id
          AND Test.ts_template = 'N'
LEFT JOIN Data_Protection_Hendrix_DB.All_Lists
       ON All_Lists.al_item_id = Test.ts_subject
          AND All_Lists.al_absolute_path NOT LIKE 'AAAAAPAAJ%'
          AND All_Lists.al_absolute_path NOT LIKE 'AAAAAPAAC%'

我知道你是说通过插件的性能是不可接受的?但你是不是也说通过IDE的6-7秒也太多了?你能分享一下查询计划吗?查询计划应该包含其他需要帮助的细节,如使用的索引、统计数据等。嗨-我想如果我能减少在IDE中的时间,这将有助于减少t通过插件输入ime。如何获取查询计划?使用DataGrip,我可以看到响应时间是:从1/6s368ms开始检索3264行(执行4s934ms,检索1s434ms)昨天我读了一些关于索引的文章,但不完全清楚如何使用它们。我也尝试过使用Oracle SQL Developer Tuning Advisor,但它没有提供任何建议或信息。我不理解你的想法。如果一个查询在IDE中需要6秒,在插件上运行需要30秒……那么额外的24秒完全是由于在数据库服务器中运行查询的外部因素。因此,如果您可以将IDE中查询的运行时间从6秒减少到2秒,则通过插件的时间将从30秒减少到26秒,而不是10秒。因此,您不是找错地方了吗?除此之外,RN_run_ID似乎是o中的主键您需要通过RN_TEST_CONFIG_ID为每个组(分区)检索具有最高RN_RUN_ID的行?在这种情况下,您可以提高速度(但只能在限制范围内!)如果不是你正在使用的分析函数方法,你会使用第一个/最后一个聚合函数:我明白你关于IDE与插件速度的观点,正如你所描述的,这是有道理的。我想如果我摆脱压力,完成这项工作,我最终会建立这种联系。我会看看聚合函数nction,看看它是否能更有效地工作,或者看看Thangamani提供的答案。感谢您花时间回复。我非常感谢。作为一名新手,我们可以阅读所有我们能阅读的内容,但有时我们仍然需要帮助,为我们指出正确的方向。我知道您说通过插件的性能是不可接受的?但您是否也说不能通过IDE的6-7秒也太多了?请分享查询计划好吗?查询计划应该包含其他需要帮助的细节,如使用的索引、统计数据等。嗨-我想如果我可以减少IDE中的时间,这将有助于通过插件减少时间。我如何获得查询计划?使用DataGrip,我可以看到nse时间为:从1开始检索3264行(执行4s934ms,获取1s434ms)昨天我读了一些关于索引的文章,但不完全清楚如何使用它们。我也尝试过使用Oracle SQL Developer Tuning Advisor,但它没有提供任何建议或信息。我不理解你的想法。如果一个查询在IDE中需要6秒,在插件上运行需要30秒……那么额外的24秒完全是由于在数据库服务器中运行查询的外部因素。因此,如果您可以将IDE中查询的运行时间从6秒减少到2秒,则通过插件的时间将从30秒减少到26秒,而不是10秒。因此,您不是找错地方了吗?除此之外,RN_run_ID似乎是o中的主键您需要通过RN_TEST_CONFIG_ID为每个组(分区)检索具有最高RN_RUN_ID的行?在这种情况下,您可以提高速度(但只能在限制范围内!)如果不是你正在使用的分析函数方法,你会使用第一个/最后一个聚合函数:我明白你关于IDE与插件速度的观点,正如你所描述的,这是有道理的。我想如果我摆脱压力,完成这项工作,我最终会建立这种联系。我会