在Netezza中过滤掉特定年份查询的最佳做法是什么?

时间:2017-05-22 13:26:58

标签: filter netezza

我是一名SQL Server人员,刚刚开始研究Netezza,有一件事突然出现在我身上,每天都会查询按年度过滤掉的表的大小:2016,2015,2014,...

我现在使用的是下面的内容,它适用于我,但我想知道是否有更好的方法:

select count(1) 
from table 
where extract(year from datacolumn) = 2016

extract是一个内置函数,在我知道的SQL Server中,在大小超过100亿+的表上应用函数是不可想象的。

感谢您的建议。

1 个答案:

答案 0 :(得分:0)

我在查询中看到的唯一问题是where子句,它在'variable'端执行一个函数。这有效地禁用了区域映射,从而迫使netezza扫描所有数据页面,而不仅仅是那些包含那一年数据的页面。

取而代之的是:

select count(1) 
from table 
where  datecolumn between '2016-01-01' and '2016-12-31'

更通用的替代方法是创建一个“日期维度表”,表中每天有一行(以及未来几年) 这是Postgres的一个例子:https://medium.com/@duffn/creating-a-date-dimension-table-in-postgresql-af3f8e2941ac

这使您可以编写如下代码:

Select count(1) 
From table t join d_date d on t.datecolumn=d.date_actual
Where year_actual=2016

您的系统上可能没有generate_series()函数,但'select row_number()...'可以执行相同的操作。可在此处下载:https://www.ibm.com/developerworks/community/wikis/basic/anonymous/api/wiki/76c5f285-8577-4848-b1f3-167b8225e847/page/44d502dd-5a70-4db8-b8ee-6bbffcb32f00/attachment/6cb02340-a342-42e6-8953-aa01cbb10275/media/generate_series.tgz

“日期间隔”中的其他几条通知条款:

这些列最有可能成为区域地图优化的候选者。在表DDL的底部添加'组织(日期栏)'并组织您的表格。这将导致netezza将记录移动到具有相似日期的页面,查询时间会更好。

此外,您应该确保表的'distribute on'子句导致表中数据切片的偶数分布很大。查询的执行永远不会比最慢的数据片快。

我希望这会有所帮助