|
Как правильно построить индекс. Получение последнего значения по дате
|
|||
---|---|---|---|
#18+
Есть табличка с показаниями датчиков (самих датчиков около 20 тыс ) counter_id - идентификатор датчика val - значение val_date - дата значения Значений в табличке сотни миллионов уже В табличку постоянно валятся новые показания, табличка секционирована по месяцу даты и по данному полю индекс (локальный). Ранее надо было всегда вытаскивать таблицу значений за определённый календарный день и такая схема прекрасно работала. А сейчас вдруг появилась необходимость, если для для какого-то датчика в запрошенном дне НЕ было значения, то отражать последнее по дате значение. Вот что-то я на "последнее по дате" заткнулся немного при таком размере таблицы. Если бы всегда нужны были данные на текущий день - можно было бы где-то хранить дату последнего показания для каждого счётчика, а тут получается, что могут запросить данные за любой день и если для какого-то счётчика дата попадает в "дырку" надо именно для этого счётчика искать когда же было последнее показание. Т.е. было просто: Код: plsql 1.
Код: plaintext 1. 2. 3. 4.
А теперь мне для начала для каждого счётчика нужно получить последнюю дату (меньшую или равную указанной), в которой есть значение Код: plsql 1. 2.
Код: plaintext 1. 2. 3. 4.
Фуллскан полюбому? на трёхстах миллионах значений уже за две минуты переваливает :( Никакой путной структуры для хранения таких данных "с дырками" нет, чтобы можно было на любую дату быстро вытащить последнее значение? Пытаться насильно заполнять "дырки" последним значением ? Обидно то, что "дырки" небольшие и я заведомо знаю, что если в каком-то дне нет показания, то за последние три-четыре дня точно оно есть.... но базе этого не объяснить. -------------------------------------------------------------- Запомните, товарищи офицеры, чтобы ничего не делать, надо уметь делать все. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.06.2020, 18:30 |
|
Как правильно построить индекс. Получение последнего значения по дате
|
|||
---|---|---|---|
#18+
anvano, LAG() IGNORE NULLS? ... |
|||
:
Нравится:
Не нравится:
|
|||
08.06.2020, 19:05 |
|
Как правильно построить индекс. Получение последнего значения по дате
|
|||
---|---|---|---|
#18+
Если не напутал с синтаксисом, Код: plsql 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
08.06.2020, 19:22 |
|
Как правильно построить индекс. Получение последнего значения по дате
|
|||
---|---|---|---|
#18+
anvano А сейчас вдруг появилась необходимость, если для для какого-то датчика в запрошенном дне НЕ было значения, то отражать последнее по дате значение. Как определяете факт отсутствия значения для какого-либо датчика? Есть справочник датчиков или где? ... |
|||
:
Нравится:
Не нравится:
|
|||
08.06.2020, 19:52 |
|
Как правильно построить индекс. Получение последнего значения по дате
|
|||
---|---|---|---|
#18+
Если же в таблице вовсе нет строки на заданную дату, а не поле val_date не заполнено, то может быть, так: Код: plsql 1. 2. 3. 4. 5.
... |
|||
:
Нравится:
Не нравится:
|
|||
08.06.2020, 19:52 |
|
Как правильно построить индекс. Получение последнего значения по дате
|
|||
---|---|---|---|
#18+
anvano Никакой путной структуры для хранения таких данных "с дырками" нет, чтобы можно было на любую дату быстро вытащить последнее значение? Есть. SCD2, например, с partition key по дате завершения версии. anvano Пытаться насильно заполнять "дырки" последним значением ? Подход имеет право на жизнь, но требует внимательного рассмотрения: - Кто и когда будет формировать отсутствующие значения? - Достаточно ли часто выполняется указанный запрос по актуальному периоду, чтобы экономия на его ресурсоемкости покрыла ресурсы, необходимые для заполнения пустот? - Можно ли разнести подготовку данных и их использование по времени? anvano Обидно то, что "дырки" небольшие и я заведомо знаю, что если в каком-то дне нет показания, то за последние три-четыре дня точно оно есть.... но базе этого не объяснить. Было бы желание, а объяснить можно. Разными способами. Например, если справочника приборов нет: Код: plsql 1. 2. 3. 4. 5. 6.
... |
|||
:
Нравится:
Не нравится:
|
|||
08.06.2020, 20:04 |
|
|
start [/forum/topic.php?fid=52&msg=39967176&tid=1881176]: |
0ms |
get settings: |
8ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
140ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
45ms |
get tp. blocked users: |
1ms |
others: | 16ms |
total: | 242ms |
0 / 0 |