Где пункт не работает с представлением ClickHouse - PullRequest
0 голосов
/ 28 февраля 2020

Я пытаюсь создать представление для исходной таблицы, а затем выбрать данные для указанного диапазона отметок времени c из представления и поместить его в таблицу назначения.

У нас есть исходная таблица:

1 Миллион строк помещается в исходную таблицу, которая соответствует данным с 1 января по 31 января.

    CREATE TABLE IF NOT EXISTS source(
      CELL          String,
      TIMESTAMP     DateTime,
      COUNTER1      Float32,
      COUNTER2      Float32,
      COUNTER3      Float32,
      COUNTER4      Float32,
      COUNTER5      Float32,
      COUNTER6      Float32,
      InsertionTime DateTime DEFAULT now(),      /* Insertion Time */
      QHour         DateTime DEFAULT toStartOfFifteenMinutes(TIMESTAMP)
    ) ENGINE=ReplacingMergeTree()
    PARTITION BY toYYYYMM(TIMESTAMP)
    ORDER BY (QHour, TIMESTAMP, CELL)
    SETTINGS index_granularity = 31768

Теперь мы создали представление исходной таблицы.

    CREATE VIEW IF NOT EXISTS myView
      AS SELECT
        CELL,
        QHour,
        toStartOfFifteenMinutes(TIMESTAMP)      AS ViewQHour,
        100 * sum(COUNTER1) / sum(COUNTER2)     AS KPI1
      FROM ( 
        SELECT
            CELL,
            TIMESTAMP,
            any(QHour) as QHour
            argMax(COUNTER1, InsertionTime)     AS COUNTER1,
            argMax(COUNTER2, InsertionTime)     AS COUNTER2
        FROM ThreeGCell
        GROUP BY TIMESTAMP, CELL, QHour)
    GROUP BY ViewQHour, CELL
    ORDER BY ViewQHour, CELL

Теперь в представлении мне нужно выбрать данные за период времени из представления: с 1 января по 10 января.

SELECT * 
FROM myView 
WHERE QHour >= toDateTime('2020-01-01 00:00:00') AND QHour <= toDateTime('2020-01-10 00:00:00')

Но запрос выбора в представлении добавляет все 1 миллион строк к целевой таблице, которая представляет собой данные за весь январь, в то время как я ищу данные за указанный период c только с 1 января по 10 января.

У меня есть следующие вопросы:

  1. Можем ли мы изменить запрос в представлении, чтобы обрабатывать только указанный период времени c?
  2. Можем ли мы сгенерировать представление на последнем наборе данных, помещенном в исходную таблицу на лету? Я имею в виду, что мы имеем только отфильтрованный набор данных из исходной таблицы и используем отфильтрованные данные в представлении? Могут ли такие фильтры быть изменены для использования разных временных диапазонов? Например, у нас есть данные с 1 января по 10 января в представлении. Затем во втором прогоне у нас есть данные с 11 января по 20 января в представлении.

1 Ответ

0 голосов
/ 28 февраля 2020
CREATE VIEW IF NOT EXISTS myView
....
ORDER BY ViewQHour, CELL

Большинство баз данных запрещают создавать представление с ORDER BY, к сожалению, CH этого не делает. В первоначальном дизайне было ошибкой позволять создавать такие представления.

ORDER BY отменяет нажатие на предикат, потому что в некоторых случаях оно искажает результаты (оптимизатор все еще очень слаб и не понимает случаев с runningDiff () и сосед ().

https://github.com/ClickHouse/ClickHouse/issues/9425#issuecomment -592658368

...