Sql 在Oracle嵌套查询中选择值的最佳时间

Sql 在Oracle嵌套查询中选择值的最佳时间,sql,oracle,optimization,Sql,Oracle,Optimization,从优化的角度来看,我想知道什么时候最好选择一些任意数据作为列。具体而言,我有以下疑问: 我把这部分放在哪里? 在最外层查询中 我需要访问我最外层的SELECT中的segment列,因此似乎我应该仅在必要时选择它,即 SELECT ..., segment, CASE WHEN segment = 'String 1' THEN ... END, ... FROM ( SELECT 'String 1' AS segment FROM DUA

从优化的角度来看,我想知道什么时候最好选择一些任意数据作为列。具体而言,我有以下疑问:

我把这部分放在哪里? 在最外层查询中 我需要访问我最外层的
SELECT
中的
segment
列,因此似乎我应该
仅在必要时选择它,即

SELECT ...,
       segment,
       CASE WHEN segment = 'String 1' THEN ... END,
       ...
FROM (
       SELECT 'String 1' AS segment FROM DUAL
       UNION ALL
       SELECT 'String 2' AS segment FROM DUAL
       UNION ALL
       SELECT 'String 3' AS segment FROM DUAL
     ),
     (
       SELECT ...
       FROM ...
       GROUP BY ...
     )
WHERE ...
最内层查询中的VS 但是,这比在最里面的查询中选择任意字符串要好吗

SELECT ...,
       segment,
       CASE WHEN segment = 'String 1' THEN ... END,
       ...
FROM (
       SELECT ...,
              segment
       FROM (
              SELECT 'String 1' AS segment FROM DUAL
              UNION ALL
              SELECT 'String 2' AS segment FROM DUAL
              UNION ALL
              SELECT 'String 3' AS segment FROM DUAL
            ),
            ...
       GROUP BY ..., segment
     )
WHERE ...
由于最外面的查询限制了它从最里面的查询(通过
WHERE
)使用的数据,因此在最里面的查询中选择那些字符串似乎更好,因为这样数据就可以更早地缩减。关于何时选择这样的数据,是否有最佳实践指南

编辑:基于(参见他标题为“从两行到六行(从列到行轴)”的部分),我能够删除以下内容:

SELECT 'String 1' AS segment FROM DUAL
UNION ALL
SELECT 'String 2' AS segment FROM DUAL
UNION ALL
SELECT 'String 3' AS segment FROM DUAL
相反,我会:

SELECT ROWNUM rowno
FROM DUAL
CONNECT BY LEVEL <= 3

然而,这仍然不能回答我的问题:将
SELECT
ing
rowno
:最里面还是最外面的查询的内联视图放在哪里?

据我所知,如果在内部查询中不使用rownum,那么将它放在哪里应该无关紧要,因为优化器将以最佳方式使用它。这就让您决定哪个版本对您来说更具可读性。

据我所知,如果您在内部查询中不使用rownum,那么将它放在何处应该无关紧要,因为优化器将以最佳方式使用它。这就让您决定哪个版本对您更具可读性。

我对数据库的访问仅限于
选择
<代码>解释计划
失败:(1.如果您不能运行解释计划或自动跟踪,那么您就无法合理地作为开发人员工作。请与您的DBA讨论如何授予您对这些内容的权限!2.您的问题有点太笼统了。如果您的表(带有DML)包含一些示例数据和关于数据大小的线索(10行vs 1000万行)您会得到更好的答案。请向您的DBA寻求支持。我们DBA会执行调整或重写SQL查询等操作。他应该能够使用自己的知识或解释计划回答您的问题。我对数据库的访问权限仅限于
选择
解释计划
失败:(1.如果您不能运行解释计划或自动跟踪,那么您就无法合理地作为开发人员工作。请与您的DBA讨论如何授予您对这些内容的权限!2.您的问题有点太笼统了。如果您的表(带有DML)包含一些示例数据和关于数据大小的线索(10行vs 1000万行)您会得到更好的答案。请向您的DBA寻求支持。我们DBA会做一些事情,如调整或重写SQL查询。他应该能够使用自己的知识或解释计划回答您的问题。
SELECT ROWNUM rowno
FROM DUAL
CONNECT BY LEVEL <= 3
CASE WHEN rowno = 1
     THEN 'String 1'
     WHEN rowno = 2
     THEN 'String 2'
     WHEN rowno = 3
     THEN 'String 3'
END AS segment