SQL确定多列是否具有非零值的最快方法

时间:2016-07-05 09:54:13

标签: mysql sql database

背景: 我有一张表,目前每天365天,每天从大约100个站点接收一行数据。网站数量每月增加约13个网站。我正在寻找一个长期的解决方案。

结构是:

id:int
site:int
created:datetime
dept_a:decimal(12,2)
dept_b:decimal(12,2)
...
dept_y:decimal(12,2)
dept_z:decimal(12,2)

问题:

我想知道每个网站的每个 dept_x 列中是否有非零条目。

服务器超时为30秒,虽然我目前的解决方案是

if(sum(dept_x)>0,1,0) as dept_x_used, if(sum(dept_y)>0,1,0) as dept_y_used, ... 

目前有效,并且工作得很快,我正在构建的系统需要支持更多站点,并仍然搜索dept_x是否曾经非零。

我担心的是,随着搜索的数据量不断增加,以及每日新数据量的增加。

如果可能的话,从一开始就做正确的选择会更好,但是当它变得太慢时,必须稍后再回来修复它。

我也愿意采用其他方法来处理这种情况,例如一个单独的表,用于存储与列具有非零值相关的信息。

一些示例数据:

1, 1, 2016-03-01, 53.00, 0.00, 0.00, 0.00, 30.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, ...
2, 7, 2016-03-01, 26.00, 15.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, ...
3, 6, 2016-03-01, 0.00, 0.00, 0.00, 0.00, 23.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, ...
4, 2, 2016-03-01, 14.00, 6.00, 0.00, 0.00, 13.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, ...
5, 2, 2016-03-02, 55.00, 0.00, 32.00, 0.00, 18.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, ...
6, 4, 2016-03-02, 3.00, 0.00, 4.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, ...

在这种情况下,输出将类似于

site dept_a_used dept_b_used dept_c_used dept_d_used dept_e_used
1    1           0           0           0           1
2    1           1           1           0           1
4    1           0           1           0           0
6    0           0           0           0           1
7    1           0           0           0           0

目的是确定之前是否曾在某个站点上使用过部门代码,以便我们可以验证月度报告是否包含所有曾使用过的部门。我们所有其他报告都有一个描述符,例如“所有部门的月度报告”或“SELECTED部门的月度报告”,但是这个报告没有区分,我们无法控制生成报告,我们只能检查它们并报告他们是否包含正确的部门。

1 个答案:

答案 0 :(得分:0)

首先,我不是编程和英语方面的专家,但我可能对你有所了解。

为什么不在您的数据行中存储信息,说明“此行已被检查”=> 1或“此行尚未检查”=> 0

如果您不必重新检查已经进行过一次检查的行,则可以执行此操作,然后仅对新col上包含“0”信息的行进行验证。这样,数据量将小于检查每一行。

我希望我理解你的问题,它可以帮到你。

阿诺