Удалить избыточный вызов функции для столбца и счетчика столбца - PullRequest
1 голос
/ 24 июня 2010

Проблема

В следующем запросе plr_stations вызывается дважды:

  1. один раз, чтобы ограничить предложение WHERE
  2. один раз для подсчета количества возвращаемых результатов.

Код напоминает:

  SELECT
 m.*,
 s.*,
 (
  SELECT
    count(1)
  FROM
    climate.plr_stations('48.5146','-123.4447')
 ) AS count_stations
  FROM 
 climate.station s,
 climate.measurement m,
 (
  SELECT
    id
  FROM
    climate.plr_stations('48.5146','-123.4447')
 ) stations
  WHERE
    s.applicable AND
    s.id = stations.id AND
    m.station_id = s.id AND ...

Результаты этого запроса затем агрегируются по датеquery.

Решения

Заполните временную таблицу или переменную массива результатами вызова функции.

Update # 1

ФункцияВызов случайным образом выберет выборку станций, если внутри сферического многоугольника определено слишком много станций, определенных параметрами для вызова функции.

Update # 2

Агрегирование запроса даты, которое запускает полный запросвыглядит следующим образом:

        SELECT 
          extract(YEAR FROM m.taken) AS year_taken,
          avg(m.amount) AS amount,
          count(m.amount) AS count_measurements,
          md.count_stations,
          min(md.elevation) AS elevation_min,
          max(md.elevation) AS elevation_max
        FROM
          climate.measurement m, (
          SELECT
            m.*,
            s.*, ...

Вопрос

Как еще можно устранить избыточный вызов?

Спасибо.

1 Ответ

2 голосов
/ 24 июня 2010

Сомнительно, что это сложило бы это, учитывая, что оно не должно быть помечено как НЕМЕРНОЕ (если я понимаю намерение как таковое).

Что-то в этом духе должно работать ... в зависимости от ваших требований ...

with R_stations as (
SELECT
     id,   
     count(1) over () c
      FROM
        climate.plr_stations('48.5146','-123.4447')
)
     SELECT
     m.*,
     s.*,
     stations.c count_stations
      FROM 
     climate.station s,
     climate.measurement m,
     R_stations stations
      WHERE
        s.applicable AND
        s.id = stations.id AND
        m.station_id = s.id AND ...

Но, учитывая вашу агрегацию, может быть проще сделать это ...

 SELECT
 m.*,
 s.*,
 stations.c count_stations
  FROM 
 climate.station s,
 climate.measurement m,
 (SELECT
 id,   
 count(1) over () c
  FROM
    climate.plr_stations('48.5146','-123.4447')

) stations
      WHERE
        s.applicable AND
        s.id = stations.id AND
        m.station_id = s.id AND ...
...