Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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.07 c
14-1105318117
Alex_Petr
2005-01-10 03:48
2005.01.30
Устал за ;$1600 пить в одиночку


14-1105247343
Сергей Г
2005-01-09 08:09
2005.01.30
Стоимость програмного продукта


3-1103808932
jenbond
2004-12-23 16:35
2005.01.30
решение проблемы с gds32.dll


6-1100692418
Dmitry V. Averuanov
2004-11-17 14:53
2005.01.30
Изменить Gateway


3-1104231699
Dysan
2004-12-28 14:01
2005.01.30
не работает запрос при использовании параметров в ADO





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский