Форум: "Базы";
Текущий архив: 2005.01.30;
Скачать: [xml.tar.bz2];
ВнизОптимизация запроса Найти похожие ветки
← →
КаПиБаРа © (2004-12-29 08:33) [0]Такой запрос выполняется мгновенно
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)
)
Как оптимизировать второй запрос?
← →
Johnmen © (2004-12-29 09:12) [1]Не смотря на бессмысленность запроса, надо бы указывать алиасы для всех таблиц.
← →
sniknik © (2004-12-29 09:20) [2]то что первый сам с сабой это глупость или имена спутал? ;о) какой смысл? вот еще быстрее (и тоже самое)
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 поменять но это по смыслу запроса (можно получить не те данные, а можно и то же самое если обьеденение первого и второго выбирает все нужные записи а обьеденение с третьим приписавает только то что там наверняка есть (по логике данных надо смотреть))
← →
liver (2004-12-29 09:20) [3]абсолютно согласен, запос бессмысленый...
что делается и зачем не понятно...
← →
DimaK (2004-12-29 09:26) [4]> А такой очень долго (я 30 минут подождал и прекратил)
Попробуй построить индексы по полям из where второго запроса.
← →
КаПиБаРа © (2004-12-29 10:59) [5]Есть таблица
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
← →
msguns © (2004-12-29 11:26) [6]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
← →
msguns © (2004-12-29 11:27) [7]Sorry, на счет AVG погорячился. Тут надо чуть поприбамбасистее ;))
← →
msguns © (2004-12-29 11:29) [8]А записей по каждому DTTM всегда 3 или может быть другое число ?
← →
КаПиБаРа © (2004-12-29 11:40) [9]msguns © (29.12.04 11:29) [8]
Теоретически до 7000 в массиве 1 и до 2000 в массиве 2. Реально пока около 30.
← →
КаПиБаРа © (2004-12-29 11:44) [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
← →
msguns © (2004-12-29 11:46) [11]Тогда поясни для особо тупых, по какому принципу ты выбираешь для каждой DTTM только три значения из колонки "замеров" ?(VAL-может быть, я ахинейно ее обозвал, но телепат из меня фиговый)
Первая и вторая, судя по всему - максимум и минимум, а вот третья - это что ? Если записей, к примеру, 4. Или 1000 ?
← →
msguns © (2004-12-29 11:48) [12]То, что в твоем запросе NUM "для мебели", я понял. Как, впрочем, и Massiv. Ответь все же на [11]
← →
КаПиБаРа © (2004-12-29 11:59) [13]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)
)
← →
КаПиБаРа © (2004-12-29 12:04) [14]Данные записаны "последовательно" в таблице NVL1
Нужно построить таблицу со столбцами
DTTM, Val(для Num=255), Val(для Num=227), Val(для Num=230)
и вывести в нее только те строки у которых 149 <= Val(для Num=255) <= 150
← →
msguns © (2004-12-29 12:24) [15]Я все-таки не врубился ;((
Диапазон значений Num и Massiv у тебя фиксированный ? Т.е. значения поля Num всегда имеют только три варианта (255,227,230) или их может быть сколько угодно, а выбрать надо только по этим трем ? То же отностися и к Massiv.
← →
КаПиБаРа © (2004-12-29 12:32) [16]Есть 2 источника данных массив 1 и 2. В первом 7000 каналов, во втором 2000 каналов. За каждый час по каждому каналу "приходит" значение измеренной величины.
Некоторые значения я помещаю в базу для последующей обработки.
255 канал массива 2 - генерация станции.
227 генерация 1-го блока
230 генерация 2-го блока
Мне нужно вывести 4 столбца
дата/время, Суммарная генерация, генерация первого блока, генерация второго блока.
← →
КаПиБаРа © (2004-12-29 12:33) [17]только за те часы, когда суммарная генерация равна 150 +/- 1 МВт.
← →
msguns © (2004-12-29 14:31) [18]Из прведенного тобою в [5] примера я вижу, что станция у тебя строго в 1-м массиве, в то время как блоки - во втором.
Короче, я пока не врубаюсь, где тут котлеты (ключи, т.е. эти твои "каналы" и "массивы"), а где мухи (рез-ты измерений).
Если все твои комбинации ключей строго фиксированны, то, видимо, запрос должен в предикатах просто последовательно их перечислить и при этом обойтись без "многоэтажных" связок Join
Я правильно понял ?
← →
msguns © (2004-12-29 14:34) [19]Кстати, как один из вариантов решения, можно создать доп.таблицу формата вых.НД, выдачу результата по конкретному значению ключей оформить ХП, а затем 4-мя запросами заполнить ее (1-й запрос инициирует таблицу результата, занеся только значения всех ключей. Т.е. вместо одного "долгоиграющего" запроса ты получаешь несколько мгновенных.
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2005.01.30;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.057 c