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 如何使TD避免使用单放大器?_Sql_Performance_Query Optimization_Teradata_Spool - Fatal编程技术网

Sql 如何使TD避免使用单放大器?

Sql 如何使TD避免使用单放大器?,sql,performance,query-optimization,teradata,spool,Sql,Performance,Query Optimization,Teradata,Spool,我有这样的疑问: select * from view -- not very simple logic where report_date between date'2016-01-01' and date'2016-12-31'; 然后我采取大时间间隔: 运输署选择这类计划: 3) We do an all-AMPs RETRIEVE step from Spool 25 (Last Use) by way of an all-rows scan with a condition

我有这样的疑问:

select * from view -- not very simple logic
where report_date between date'2016-01-01' and date'2016-12-31';
然后我采取大时间间隔:

运输署选择这类计划:

3) We do an all-AMPs RETRIEVE step from Spool 25 (Last Use) by way of
     an all-rows scan with a condition of ("(REPORT_DT >= DATE
     '2016-01-01') AND (REPORT_DT <= DATE '2016-12-31')") into Spool 36
     (all_amps) (compressed columns allowed) fanned out into 3 hash
由于假脱机问题,1秒查询失败。如何强制teradata使用第一个计划

upd1:

没有双重演员阵容,只是从一个日期格式转换为另一个日期格式 另一个 这两个计划都使用了重新分配,除了指出的地方外,我没有任何不同之处。 TD高估了行数,最多2-3次我在评论中给出了错误的信息 在DEV中,我们拥有几乎相同数量的信息和统计数据。但是DEV服务器的amp和节点数量要低2倍,此外,每个amp的功能明显较弱。然而,开发人员中的TD开始决定在更短的时间间隔内使用第一个好的计划。我们如何才能在这一点上愚弄PROD server?
我做到了!要使其发挥作用,只需欺骗TD两次

查询的思想是获取表,然后将其与Sys\u Calendar进行乘积连接,然后应用行号和一些逻辑。丢弃统计数据可能会奏效,但TD可能会使用抽样和兑现,这最终会影响你的工作。这就是我在视图中应用expand+子查询的原因:

...
FROM   (    SEL cdate as cdate FROM (SELECT   DISTINCT      BEGIN      (tp) (NAMED cdate) 
    FROM           Sys_Calendar.CALDATES
    EXPAND       ON PERIOD (date '2014-01-01', current_date + 1) AS tp
    BY INTERVAL '1' DAY FOR PERIOD (date '2014-01-01',  current_date  + 1)
    ) A)  cldr
...
在那之后,我可以使用where子句申请我想要的时间和期限


新计划比好计划快15倍

最有可能是因为您的标准prd3_1_db_dmmonmis.t_greg_work_calendar.gregor_dt=DATE'2016-08-08将您的数据限制在单个放大器上。您显示的这两个解释步骤彼此完全无关。@安德鲁:这是TD15.10中的一个新功能,在优化之前可能会被解析为一个唯一值列表。奇怪的是,第二个查询遇到了假脱机问题,可能会为以后的步骤解释更改。您可能试图通过添加一些不必要的强制转换(如CastCastreport_date)作为时间戳作为日期来混淆优化器,但如果完全错误,请检查估计的行数。@dnoeth:那么上面的查询可能会对中间的每个不同日期进行一系列单个amp检索?我们在14号,所以我不能尝试。@Andrew:是的,正确。你真的需要先在2014-01-01和今天之间的日历*天中创建73414*1165天,然后再应用不同的行吗?如果你把它简化成。。。从Sys_Calendar.Calendar中选择Begin tp Named cdate,其中Calendar_date=date'2014-01-01'扩展到PERIOD Calendar_date,当前_date+1为tp cldr…@dnoeth似乎是这样。对于我的解决方案-TD认为这将增加55k行,而您的-只有1行。
...
FROM   (    SEL cdate as cdate FROM (SELECT   DISTINCT      BEGIN      (tp) (NAMED cdate) 
    FROM           Sys_Calendar.CALDATES
    EXPAND       ON PERIOD (date '2014-01-01', current_date + 1) AS tp
    BY INTERVAL '1' DAY FOR PERIOD (date '2014-01-01',  current_date  + 1)
    ) A)  cldr
...