Sql 使用联接和多个选择优化Oracle查询
我正在运行一个查询,在IDE中运行需要6-7秒,当我通过汇流插件将结果发布到wiki时需要4-5倍的时间。我对Oracle相当陌生,Over/partitionby section是我在研究堆栈溢出时学到的东西。它让我得到了我想要的结果,但还不够快 我正在努力实现的目标: 我们有一个测试存储库。每个测试一天运行多次。我需要每个测试的最新执行状态、执行日期和其他相关值。这个查询只返回4k记录,所以我认为它不应该花费这么长的时间。当在wiki上显示结果需要30秒以上时(我们需要在wiki上发布结果),效率非常低 我希望有人能看一看,帮助我优化这个,帮助我理解解决方案是什么。将它分解并单独运行,速度问题肯定与分区/分区有关 先谢谢你Sql 使用联接和多个选择优化Oracle查询,sql,oracle,Sql,Oracle,我正在运行一个查询,在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与插件速度的观点,正如你所描述的,这是有道理的。我想如果我摆脱压力,完成这项工作,我最终会建立这种联系。我会