Plsql 使用“将日期转换为varchar”;例如;在pl/sql中

Plsql 使用“将日期转换为varchar”;例如;在pl/sql中,plsql,Plsql,我需要在一年内搜索数百万个数据,这些数据作为一个参数发送给一个方法。这一年来得很快 这就是我正在处理的问题 SELECT X,Y FROM A WHERE mch_code = 'KN' AND contract = '15KTN' AND to_char(cre_date, 'YYYY') = year_; cre_uuu日期的类型为date,year_uuu的类型为carchar。 执行此查询时,大约需要25分钟才能完成处理 是否有人知道快速执行的不同

我需要在一年内搜索数百万个数据,这些数据作为一个参数发送给一个方法。这一年来得很快

这就是我正在处理的问题

  SELECT X,Y
  FROM   A
  WHERE  mch_code = 'KN'
  AND    contract = '15KTN'
  AND    to_char(cre_date, 'YYYY') = year_;
cre_uuu日期的类型为date,year_uuu的类型为carchar。 执行此查询时,大约需要25分钟才能完成处理

是否有人知道快速执行的不同方法

请帮忙

这没有成功

SELECT X,Y
FROM   A
WHERE  mch_code = 'KN'
AND    contract = '15KTN'
AND    cre_date LIKE '%2013';
原因可能是“cre_date”和“%2013”属于不同的类型

您可以尝试使用以下函数:

SELECT X,Y
  FROM A
 WHERE mch_code = 'KN'
   AND contract = '15KTN'
   AND EXTRACT(YEAR FROM cre_date) = year_;
您可以尝试以下功能:

SELECT X,Y
  FROM A
 WHERE mch_code = 'KN'
   AND contract = '15KTN'
   AND EXTRACT(YEAR FROM cre_date) = year_;
如果(mch_代码、合同、cre_日期)列上有索引,则可以通过执行以下操作来提高性能:

select x, y
from   a
where  mch_code = 'KN'
and    contract = '15KTN'
and    cre_date >= to_date('01/01/'||year_, 'dd/mm/yyyy')
and    cre_date <  add_months(to_date('01/01/'||year_, 'dd/mm/yyyy'), 12);
这将使查询:

select x, y
from   a
where  mch_code = 'KN'
and    contract = '15KTN'
and    cre_date >= v_year_dt
and    cre_date <  add_months(v_year_dt, 12);
选择x,y
从
其中mch_代码='KN'
和合同='15KTN'
和cre_date>=v_year_dt
和cre_日期<添加月数(v_年dt,12);
如果这三列上没有索引,则可以创建基于函数的索引(mch_code、contract、to_char(cre_date,'yyyy')),这将有助于加快查询速度,具体取决于希望选择的行的百分比。如果您将x和y列添加到索引中,从而完全不需要表访问,则可能会有更大的帮助

或者,您可以考虑在cre_date、monthly或yearly上对表进行分区。

如果(mch_code、contract、cre_date)列上有索引,您可以通过执行以下操作来提高性能:

select x, y
from   a
where  mch_code = 'KN'
and    contract = '15KTN'
and    cre_date >= to_date('01/01/'||year_, 'dd/mm/yyyy')
and    cre_date <  add_months(to_date('01/01/'||year_, 'dd/mm/yyyy'), 12);
这将使查询:

select x, y
from   a
where  mch_code = 'KN'
and    contract = '15KTN'
and    cre_date >= v_year_dt
and    cre_date <  add_months(v_year_dt, 12);
选择x,y
从
其中mch_代码='KN'
和合同='15KTN'
和cre_date>=v_year_dt
和cre_日期<添加月数(v_年dt,12);
如果这三列上没有索引,则可以创建基于函数的索引(mch_code、contract、to_char(cre_date,'yyyy')),这将有助于加快查询速度,具体取决于希望选择的行的百分比。如果您将x和y列添加到索引中,从而完全不需要表访问,则可能会有更大的帮助


或者,您可以考虑在cre_date、monthly或yearly上对表进行分区。

查询速度慢的原因是您正在对表中每一行的一列应用一个函数。让我们换一种方式试试:

SELECT X,Y
  FROM   A
  WHERE  mch_code = 'KN' AND
         contract = '15KTN' AND
        CRE_DATE BETWEEN TO_DATE('01/01/' || year_, 'DD/MM/YYYY')
                      AND TO_DATE('01/01/' || year_, 'DD/MM/YYYY') + INTERVAL '1' YEAR;
这样就不需要对表中的每一行应用函数,并且应该允许使用CRE_DATE上的任何索引


祝您好运。

查询速度慢的原因是您正在对表中每一行的一列应用一个函数。让我们换一种方式试试:

SELECT X,Y
  FROM   A
  WHERE  mch_code = 'KN' AND
         contract = '15KTN' AND
        CRE_DATE BETWEEN TO_DATE('01/01/' || year_, 'DD/MM/YYYY')
                      AND TO_DATE('01/01/' || year_, 'DD/MM/YYYY') + INTERVAL '1' YEAR;
这样就不需要对表中的每一行应用函数,并且应该允许使用CRE_DATE上的任何索引


祝你好运。

你好,萨米尔。。谢谢你的回复。。。但我仍然看不到有什么大的性能改进(1.在这种情况下,为了提高性能,您可以在
cre_date
列上仅为年份创建功能索引,并获得后续的性能增益。2.或者,您可以在
cre_date
列上创建一个普通的B树索引,并提供一个日期范围标准来获取所需的结果。这也应该更快。您可以吗给我一个例子,如何只使用cre_日期创建基于年份的索引这里有一个例子:“在A(摘录(从cre_日期算起的年份))上创建索引ix_fnc_creyear;”嗨,Sameer..谢谢你的回答…但我仍然看不到有什么大的性能改进….:(1.在这种情况下,为了提高性能,您可以在
cre_date
列上仅为年份创建功能索引,并获得后续的性能增益。2.或者,您可以在
cre_date
列上创建一个普通的B树索引,并提供一个日期范围标准来获取所需的结果。这也应该更快。您可以吗请给出一个示例,说明如何仅使用cre_日期创建基于年份的索引这里有一个示例:“在A(摘录(从cre_日期算起的年份))上创建索引ix_fnc_creyear;”