![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Оптимизация запроса [D6, FB1.5]
КаПиБаРа © (2004-12-29 08:33:00)Такой запрос выполняется мгновенно
SELECT NVL1.DTTM, NVL1.VAL, NVL11.VAL
FROM NVL1 NVL11
INNER JOIN NVL1 ON (NVL11.DTTM = NVL1.DTTM)
WHERE
(
(NVL1.DTTM BETWEEN '01.01.2004' and '01.02.2004')
and
(NVL1.NUM = 255)
and
(NVL1.MASSIV = 2)
and
(NVL1.VAL BETWEEN 149 and 151)
and
(NVL11.NUM = 227)
and
(NVL11.MASSIV = 1)
)
А такой очень долго (я 30 минут подождал и прекратил)
SELECT NVL1.DTTM, NVL1.VAL, NVL11.VAL
FROM NVL1
INNER JOIN NVL1 NVL11 ON (NVL1.DTTM = NVL11.DTTM)
INNER JOIN NVL1 NVL12 ON (NVL11.DTTM = NVL12.DTTM)
WHERE
(
(NVL1.DTTM BETWEEN '01.01.2004' and '01.02.2004')
and
(NVL1.NUM = 255)
and
(NVL1.MASSIV = 2)
and
(NVL1.VAL BETWEEN 149 and 151)
and
(NVL11.NUM = 227)
and
(NVL11.MASSIV = 1)
and
(NVL12.NUM = 230)
and
(NVL12.MASSIV = 1)
)
Как оптимизировать второй запрос?
msguns (2004-12-29 14:34:00) [1]Кстати, как один из вариантов решения, можно создать доп.таблицу формата вых.НД, выдачу результата по конкретному значению ключей оформить ХП, а затем 4-мя запросами заполнить ее (1-й запрос инициирует таблицу результата, занеся только значения всех ключей. Т.е. вместо одного "долгоиграющего" запроса ты получаешь несколько мгновенных.
msguns (2004-12-29 14:31:00) [2]Из прведенного тобою в [5] примера я вижу, что станция у тебя строго в 1-м массиве, в то время как блоки - во втором.
Короче, я пока не врубаюсь, где тут котлеты (ключи, т.е. эти твои "каналы" и "массивы"), а где мухи (рез-ты измерений).
Если все твои комбинации ключей строго фиксированны, то, видимо, запрос должен в предикатах просто последовательно их перечислить и при этом обойтись без "многоэтажных" связок Join
Я правильно понял ?
КаПиБаРа (2004-12-29 12:33:00) [3]только за те часы, когда суммарная генерация равна 150 +/- 1 МВт.
КаПиБаРа (2004-12-29 12:32:00) [4]Есть 2 источника данных массив 1 и 2. В первом 7000 каналов, во втором 2000 каналов. За каждый час по каждому каналу "приходит" значение измеренной величины.
Некоторые значения я помещаю в базу для последующей обработки.
255 канал массива 2 - генерация станции.
227 генерация 1-го блока
230 генерация 2-го блока
Мне нужно вывести 4 столбца
дата/время, Суммарная генерация, генерация первого блока, генерация второго блока.
msguns (2004-12-29 12:24:00) [5]Я все-таки не врубился ;((
Диапазон значений Num и Massiv у тебя фиксированный ? Т.е. значения поля Num всегда имеют только три варианта (255,227,230) или их может быть сколько угодно, а выбрать надо только по этим трем ? То же отностися и к Massiv.
КаПиБаРа (2004-12-29 12:04:00) [6]Данные записаны "последовательно" в таблице NVL1
Нужно построить таблицу со столбцами
DTTM, Val(для Num=255), Val(для Num=227), Val(для Num=230)
и вывести в нее только те строки у которых 149 <= Val(для Num=255) <= 150
КаПиБаРа (2004-12-29 11:59:00) [7]msguns © (29.12.04 11:46) [11]
Первичным индексом является DTTM+NUM+Massiv
> Тогда поясни для особо тупых, по какому принципу ты
> выбираешь для каждой DTTM только три значения из
> колонки "замеров
По такому
WHERE
(
(NVL1.DTTM BETWEEN '01.01.2004' and '01.02.2004')
and
(NVL1.NUM = 255)
and
(NVL1.MASSIV = 2)
and
(NVL1.VAL BETWEEN 149 and 151)
and
(NVL11.NUM = 227)
and
(NVL11.MASSIV = 1)
and
(NVL12.NUM = 230)
and
(NVL12.MASSIV = 1)
)
msguns (2004-12-29 11:48:00) [8]То, что в твоем запросе NUM "для мебели", я понял. Как, впрочем, и Massiv. Ответь все же на [11]
msguns (2004-12-29 11:46:00) [9]Тогда поясни для особо тупых, по какому принципу ты выбираешь для каждой DTTM только тризначения из колонки "замеров" ?(VAL-может быть, я ахинейно ее обозвал, но телепат из меня фиговый)
Первая и вторая, судя по всему - максимум и минимум, а вот третья - это что ? Если записей, к примеру, 4. Или 1000 ?
КаПиБаРа (2004-12-29 11:44:00) [10]msguns © (29.12.04 11:26) [6]
Num 227 и Num 230 не зависимы.
т.е. может быть
DTTM NUM Massiv VAL
1.01.2004 03:00 227 1 35
1.01.2004 03:00 230 1 30
КаПиБаРа (2004-12-29 11:40:00) [11]msguns © (29.12.04 11:29) [8]
Теоретически до 7000 в массиве 1 и до 2000 в массиве 2. Реально пока около 30.
msguns (2004-12-29 11:29:00) [12]А записей по каждому DTTM всегда 3 или может быть другое число ?
msguns (2004-12-29 11:27:00) [13]Sorry, на счет AVG погорячился. Тут надо чуть поприбамбасистее ;))
msguns (2004-12-29 11:26:00) [14]SELECT DTMM, MAX(VAL) MAXVAL, MIN(VAL) MINVAL, AVG(VAL) AVGVAL
FROM NVL1
WHERE DTTM BETWEEN '01.01.2004' and '01.02.2004'
GROUP BY DTMM
КаПиБаРа (2004-12-29 10:59:00) [15]Есть таблица
NVL1
DTTM NUM Massiv VAL
1.01.2004 00:00 255 2 134
1.01.2004 00:00 227 1 27
1.01.2004 00:00 230 1 34
1.01.2004 01:00 255 2 149
1.01.2004 01:00 227 1 31
1.01.2004 01:00 230 1 37
1.01.2004 02:00 255 2 151
1.01.2004 02:00 227 1 32
1.01.2004 02:00 230 1 36
Нужно получить
1.01.2004 01:00 149 31 37
1.01.2004 02:00 151 32 36
DimaK (2004-12-29 09:26:00) [16]> А такой очень долго (я 30 минут подождал и прекратил)
Попробуй построить индексы по полям из where второго запроса.
liver (2004-12-29 09:20:00) [17]абсолютно согласен, запос бессмысленый...
что делается и зачем не понятно...
sniknik (2004-12-29 09:20:00) [18]то что первый сам с сабой это глупость или имена спутал? ;о) какой смысл? вот еще быстрее (и тоже самое)
SELECT NVL1.DTTM, NVL1.VAL, NVL1.VAL AS Val1
FROM NVL1
WHERE
(
(NVL1.DTTM BETWEEN '01.01.2004' and '01.02.2004')
and
(NVL1.NUM = 255)
and
(NVL1.MASSIV = 2)
and
(NVL1.VAL BETWEEN 149 and 151)
and
(NVL1.NUM = 227)
and
(NVL1.MASSIV = 1)
)
а если в условии
NVL1.DTTM BETWEEN '01.01.2004' and '01.02.2004'
поставить NVL2?
(просто что делается первым? обьеденение или выборка(и из какой таблици первой)... если выборка и там мало данных то поможет)
индекс на DTTM есть? добавь это точно ускорит. (что обьеденение что выборка на индексированом делается быстрее, вернее при обьеденении если индекса нет то создается временный, а это время...)
ну и декартово произведение трех табдиц будет намного больше чем двух... (т.е. в любом случае будет медленнее)
можно еще INNER джойн на LEFT поменять но это по смыслу запроса (можно получить не те данные, а можно и то же самое если обьеденение первого и второго выбирает все нужные записи а обьеденение с третьим приписавает только то что там наверняка есть (по логике данных надо смотреть))
Johnmen (2004-12-29 09:12:00) [19]Не смотря на бессмысленность запроса, надо бы указывать алиасы для всех таблиц.