Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL中绝对没有围绕tstamp的函数?每小时历史数据查询_Sql_Performance_Oracle_Timestamp - Fatal编程技术网

SQL中绝对没有围绕tstamp的函数?每小时历史数据查询

SQL中绝对没有围绕tstamp的函数?每小时历史数据查询,sql,performance,oracle,timestamp,Sql,Performance,Oracle,Timestamp,我需要获取特定工作时间的数据,从一周的某一天返回到10周。我工作的数据库是Oracle。我对时间戳字段提出了以下条件: TO_CHAR(hy.tstamp,'HH24')='10' AND hy.tstamp > sysdate - 70 AND mod(extract ( day from sysdate-1) - extract ( day from hy.tstamp), 7) =0 有人告诉我,出于性能原因,tstamp周围绝对没有函数?。如果不在时间戳字段上进行操作,您

我需要获取特定工作时间的数据,从一周的某一天返回到10周。我工作的数据库是Oracle。我对时间戳字段提出了以下条件:

TO_CHAR(hy.tstamp,'HH24')='10' 
AND hy.tstamp > sysdate - 70  
AND mod(extract ( day from sysdate-1) - extract ( day from hy.tstamp), 7) =0 

有人告诉我,出于性能原因,tstamp周围绝对没有函数?。如果不在时间戳字段上进行操作,您将如何指定条件?

这听起来像是抱怨性能的人从未听说过基于函数的索引

Create index char_hy_stamp on my_table(to_char(hy.tstamp,'HH24'));

这应该避免完整的表格扫描,这无疑是您的解释计划的一部分。一旦您的sqlfiddle运行正常,我们就可以从那里开始了。

如果您加入一个可接受范围的表,您可以过滤掉没有函数或函数索引的时间片。您可以像下面这样动态创建一个表。注意,您需要函数来创建表,但之后不需要它们:

SELECT
  TRUNC(SYSDATE + 6) - (7 * LEVEL) + INTERVAL '10' HOUR AS StartAt,
  TRUNC(SYSDATE + 6) - (7 * LEVEL) + INTERVAL '11' HOUR AS EndAt
FROM DUAL
CONNECT BY LEVEL <= 10
现在,只需将其加入到查询中即可获得所需的时间片,并注意不需要函数:

WITH TimeRanges AS (
  SELECT
    TRUNC(SYSDATE + 6) - (7 * LEVEL) + INTERVAL '10' HOUR AS StartAt,
    TRUNC(SYSDATE + 6) - (7 * LEVEL) + INTERVAL '11' HOUR AS EndAt
  FROM DUAL
  CONNECT BY LEVEL <= 10
)
SELECT
  ... whatever ...
FROM your_table hy
INNER JOIN TimeRanges ON
  hy.tstamp >= TimeRanges.StartAt AND
  hy.tstamp < TimeRanges.EndAt

如果您的DB人员理解,对时间戳函数进行过滤会降低性能,除非如Woot4Moo所指出的那样,他们实现函数索引,那么他们就会理解用于创建时间片表的函数不会影响较大的查询。

谁是某人?你不能让人们喋喋不休,而不让他们解释自己的理由。让我看看我是否理解。您正在询问如何在不获取/处理时间戳数据的情况下获取和处理时间戳数据?请向我们提供sqlfiddle,我想我知道您看到的问题。WootMoo:我的同事是具有DB专业知识的高级成员。我更像是一名应用程序开发人员。他对我提出的问题说“不不不”,我现在只做原型设计和分析。他很沉着,不确定他是否会接受你提供的解决方案。大卫·斯塔基:是的,我想要你说的解决方案。啊,最好的一种。有趣的是,他没有提出基于函数的索引。试试看,给我们一把小提琴,这将帮助我们帮助你。
WITH TimeRanges AS (
  SELECT
    TRUNC(SYSDATE + 6) - (7 * LEVEL) + INTERVAL '10' HOUR AS StartAt,
    TRUNC(SYSDATE + 6) - (7 * LEVEL) + INTERVAL '11' HOUR AS EndAt
  FROM DUAL
  CONNECT BY LEVEL <= 10
)
SELECT
  ... whatever ...
FROM your_table hy
INNER JOIN TimeRanges ON
  hy.tstamp >= TimeRanges.StartAt AND
  hy.tstamp < TimeRanges.EndAt