我有一个时间序列数据表,我需要找到在给定时间段内包含至少一个非空值的所有列.到目前为止,我使用以下查询:
select max(field1),max(field2),max(field3),... from series where t_stamp between x and y
然后,如果结果包含非空值,则检查结果的每个字段.
该表有大约70列,一个时间段可以包含> 100k条目.
我想知道是否有更快的方法来做到这一点(仅使用标准的sql).
编辑:不幸的是,重构表设计不是我的选择.
EXISTS操作可能会更快,因为它可以在找到符合条件的任何行(相对于您正在使用的MAX)时立即停止搜索.这取决于您的数据以及SQL服务器的智能程度.如果您的大多数列具有高速率的非空数据,则此方法将快速查找行并且应该快速运行.如果您的列大多是NULL值,那么您的方法可能会更快.我会给他们两个镜头,看看它们是如何优化的以及它们如何运行.另请注意,如果数据分布发生显着变化,性能可能会随时间而变化.
另外,我只在MS SQL Server上测试过这个.我不需要在一年多的时间内编写严格的ANSI兼容SQL代码,所以我不确定这是完全通用的.
SELECT CASE WHEN EXISTS (SELECT * FROM Series WHERE t_stamp BETWEEN @x AND @y AND field1 IS NOT NULL) THEN 1 ELSE 0 END AS field1, CASE WHEN EXISTS (SELECT * FROM Series WHERE t_stamp BETWEEN @x AND @y AND field2 IS NOT NULL) THEN 1 ELSE 0 END AS field2, ...
编辑:只是为了澄清,MAX方法可能更快,因为它可以通过数据单次传递来确定这些值.从理论上讲,这里的方法也可以,并且可能少于完整传递,但是优化器可能无法识别所有子查询都是相关的,因此它可能会为每个子查询执行单独的传递.这仍然可能更快,但正如我所说,这取决于你的数据.