字体
第(3/6)页
关灯
   存书签 书架管理 返回目录


    表”(例如是另一个查询的结果),则上述查询语句建议的执行路径非常合适。

    只要每个数据项的历史信息数量都较少,以in() 列表或子查询取代内层查询中的scomvalue,

    会使整个查询执行更高效。也可以用in 子句取代“相等xìng条件”,在多数情况下没有什么不同;

    但偶有例外,例如,如果用户输错了item_id,采用in()时会返回未发现数据,而采用“相等xìng条

    件”时会返回错误数据。

    使用OLAP函数

    我们在自连接(self-join)情况下,使用了诸如row_number()等OLAP函数,它们在查询“特定日

    期某数据项的值”时也同样有用甚至高效。(但记住,OLAP函数会带来非关系的处理模式(注5)。)

    注意

    OLAP 函数属于SQL 的非关系层。这类函数的作用是:在查询中做最后(或几乎是最后)处

    理。因为它们在过滤已完成后对结果集进行处理。

    运用row_number()等函数,可以通过日期排序判断数据的“新旧程度(degree of freshness)”(也

    就是距离现在有多久):

    select row_number( ) over (partition by item_id

    order by record_date desc) as freshness,

    whatever

    from hist_data

    where item_id = scomvalue

    and record_date <= reference_date

    选取最新数据,只需保留freshness 值为1 的记录:

    select x.

    from (select row_number( ) over (partition by item_id

    order by record_date desc) as freshness,

    whatever

    from hist_data

    where item_id = scomvalue

    and record_date <= reference_date) as x

    where x.freshness = 1

    理论上,使用OLAP 函数方法和子查询几乎没有差异。实际上,OLAP 函数只访问一次表,

    即使需要为此而进行排序cāo作也不例外。OLAP函数对表不需要做额外的访问,甚至在使用主键

    快速存取时也是如此。因此,采用OLAP 函数速度会比较快(尽管只是快一点点)。

    少量数据项、大量历史数据

    Many Historical Values Per Item

    当存在大量历史数据时,情况有所不同—— 例如,监控系统中采集“度量值”的频率很高。这

    里的困难在于,必须根据对极大量的数据进行排序,才能找到特定日期或最接近特定日期的值。

    排序是代价很高的cāo作:如果我们应用第4章的原则,降低非关系层厚度的唯一方法,就是在关

    系层多做一些工作,增加过滤条件的数量。此时,针对所需数据更精确地归类日期(或时间)
上一页 目录 下一页