繁体   English   中英

使用 Oracle 中的 NULLable 列优化查询

[英]Optimize query with NULLable column in Oracle

有没有办法优化以下查询? 它返回正确的记录,但执行时间超过一分钟。

select STATUS, SUBNO, TRUNC(TRSF_DATE) TRSF_DATE
from
(
    select STATUS, SUBNO, TRUNC(TRSF_DATE) TRSF_DATE
    from tbl        where 
       trsf_date is not null and
       contrno in ('8', '8A', '8B', '8C', '8D', '8E', '8PH3A', '8PH3B', '8PH3C', '8PHD')
)
where trsf_date = to_date('5/21/2011', 'mm/dd/yyyy')**

要求是在以下情况下返回记录:

  1. 控制输入 ('8','8A','8B','8C','8D','8E','8PH3A','8PH3B','8PH3C','8PHD')
  2. trsf_date = 某个特定日期

请注意, trsf_date 列是 NULLable ,我必须在 WHERE 子句中使用trsf_date 这就是为什么我使用内部查询首先获取 NOT NULL 行,然后从中获取 select 行。 否则查询将卡住并且不返回任何行。

DBMS 在遵守 ANSI 时将 NULL 视为unknown 这意味着像Column = /value/这样的表达式将自动排除 NULL,而无需其他条件。 所以下面的简化查询应该可以完成这项工作:

SELECT
   STATUS,
   SUBNO,
   TRUNC(TRSF_DATE) TRSF_DATE
FROM crm_user_info
WHERE
   TRSF_DATE = To_Date('5/21/2011', 'mm/dd/yyyy')
   AND CONTRNO IN ('8', '8A', '8B', '8C', '8D', '8E', '8PH3A', '8PH3B', '8PH3C', '8PHD')

为了加快速度,您可以在TRSF_DATECONTRNO列上放置索引。

您不需要内部查询。 您可以将 WHERE 条件组合到 1 个查询中:

select STATUS, SUBNO, TRUNC(TRSF_DATE) TRSF_DATE
    from crm_user_info
    where 
       trsf_date is not null and
       trsf_date = to_date('5/21/2011', 'mm/dd/yyyy') and
       contrno in ('8', '8A', '8B', '8C', '8D', '8E', '8PH3A', '8PH3B', '8PH3C', '8PHD')

此外,为了加快查询速度,您可以在 SQL 服务器中WITH(NOLOCK)等查询提示:

select STATUS, SUBNO, TRUNC(TRSF_DATE) TRSF_DATE
        from crm_user_info WITH(NOLOCK)
select STATUS, SUBNO, TRSF_DATE
from crm_user_info
where isnull(trsf_date,'01/Jan/1753') = '07/Jun/2011'
and contrno in ('8', '8A', '8B', '8C', '8D', '8E', '8PH3A', '8PH3B', '8PH3C', '8PHD') 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM