Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.01.30;
Скачать: CL | DM;

Вниз

Оптимизация запроса   Найти похожие ветки 

 
КаПиБаРа ©   (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;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.041 c
1-1105898520
Dmitry_04
2005-01-16 21:02
2005.01.30
Как мне определить какой стиль шрифта в Label-е?


6-1100588695
ИМХО
2004-11-16 10:04
2005.01.30
как работать с ящиками UNIX?


1-1106117795
Гость
2005-01-19 09:56
2005.01.30
daysBetween


1-1105614904
вратарь
2005-01-13 14:15
2005.01.30
Шифрование


14-1105295198
OneFragLeft
2005-01-09 21:26
2005.01.30
Спрятать окно программы