Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3   вперед  Ctrl      все
 Re: Тормозит запрос  [new]
sergey888
Member [заблокирован]

Откуда:
Сообщений: 4298
или так

select sum(a.total) from
(SELECT (decode(df.id_srv ,:var1,d.total,0) as total
FROM doc_folder df, doc d
WHERE df.id_account = :i_id_account
AND df.id = d.id_doc_folder
) a
4 май 07, 16:13    [4101042]     Ответить | Цитировать Сообщить модератору
 Re: Тормозит запрос  [new]
tauralex
Member

Откуда:
Сообщений: 81
39831 - это DOC_IDX_DOC_FOLDER?
Да
Еще ожидания для первого случая приведите (когда все с диска читается).

а пример строки можно, что-то ничего похожего не нашел, может их нет

автор
а не пробововали поменять сам запрос?
Пробовал, закомментил строчку "AND df.id_srv <> :var1"
по времени результат тот же, а по плану стоимость выросла в 2 раза, скорее всего из-за того что при этом строк берется больше из doc

2 dba123 спасибо, буду если что пользоваться
4 май 07, 16:30    [4101219]     Ответить | Цитировать Сообщить модератору
 Re: Тормозит запрос  [new]
dba123
Guest
автор
Пробовал, закомментил строчку "AND df.id_srv <> :var1"
по времени результат тот же, а по плану стоимость выросла в 2 раза, скорее всего из-за того что при этом строк берется больше из doc

2 dba123 спасибо, буду если что пользоваться

только шрифт используйте помельче, я поторопился
не совсем понял с планами
трассировали с литералом
 AND df.id_srv <> 0
а если с переменной план такой же или меняется?
можно построить гистограмму по этой колонке
и использовать 2 селекта с литералами(там два значения всего в этой колонке?)
4 май 07, 16:41    [4101301]     Ответить | Цитировать Сообщить модератору
 Re: Тормозит запрос  [new]
tauralex
Member

Откуда:
Сообщений: 81
sergey888
или так

select sum(a.total) from
(SELECT (decode(df.id_srv ,:var1,d.total,0) as total
FROM doc_folder df, doc d
WHERE df.id_account = :i_id_account
AND df.id = d.id_doc_folder
) a

скорее, кстати, decode(df.id_srv ,:var1, 0, d.total) as total 8)
В принципе строку с id_srv я могу вообще убрать, т.к. в расширенной версии запроса делается еще один join, который отсечет эти строки, другое дело, что скорость выполнения все равно осталась той же
4 май 07, 16:41    [4101303]     Ответить | Цитировать Сообщить модератору
 Re: Тормозит запрос  [new]
tauralex
Member

Откуда:
Сообщений: 81
dba123
не совсем понял с планами
трассировали с литералом
 AND df.id_srv <> 0
а если с переменной план такой же или меняется?
можно построить гистограмму по этой колонке
и использовать 2 селекта с литералами(там два значения всего в этой колонке?)

план такой же
по поводу гистограммы - как?
в данном случае два, но запрос общий, есть и три, и 4, отсекать надо только 0 (пеню)
да вроде эта колонка не оказывает влияние на производительность судя по плану, для doc_folder берется уникальный индекс и стоимость, и мощность doc_folder небольшая по сравнению с doc
опять же даже удаление этого условия совсем не помогает
4 май 07, 16:46    [4101341]     Ответить | Цитировать Сообщить модератору
 Re: Тормозит запрос  [new]
sergey888
Member [заблокирован]

Откуда:
Сообщений: 4298
а если так попробовать?

select
(SELECT nvl(SUM(d.total), 0) FROM doc d
WHERE df.id = d.id_doc_folder) as total

FROM doc_folder df
WHERE df.id_account = :i_id_account
AND df.id_srv <> :var1
4 май 07, 17:18    [4101535]     Ответить | Цитировать Сообщить модератору
 Re: Тормозит запрос  [new]
tauralex
Member

Откуда:
Сообщений: 81
sergey888
а если так попробовать?

select
(SELECT nvl(SUM(d.total), 0) FROM doc d
WHERE df.id = d.id_doc_folder) as total

FROM doc_folder df
WHERE df.id_account = :i_id_account
AND df.id_srv <> :var1

идея очень интересная, время улучшилось до ожидаемого, но такой вариант к сожалению не заработал в процедуре pl/sql не нравится вложенный селект в выборке
4 май 07, 17:40    [4101660]     Ответить | Цитировать Сообщить модератору
 Re: Тормозит запрос  [new]
sergey888
Member [заблокирован]

Откуда:
Сообщений: 4298
tauralex
sergey888
а если так попробовать?

select
(SELECT nvl(SUM(d.total), 0) FROM doc d
WHERE df.id = d.id_doc_folder) as total

FROM doc_folder df
WHERE df.id_account = :i_id_account
AND df.id_srv <> :var1

идея очень интересная, время улучшилось до ожидаемого, но такой вариант к сожалению не заработал в процедуре pl/sql не нравится вложенный селект в выборке


Если запускается процедура, то почему нельзя использовать курсор?
4 май 07, 17:42    [4101669]     Ответить | Цитировать Сообщить модератору
 Re: Тормозит запрос  [new]
tauralex
Member

Откуда:
Сообщений: 81
Если запускается процедура, то почему нельзя использовать курсор?

каким образом? переделал запрос в виде курсора в скрипте
DECLARE
  l_sum NUMBER;
  CURSOR cur IS
    SELECT SUM((SELECT nvl(SUM(d.total), 0) FROM doc d WHERE df.id = d.id_doc_folder)) AS total
      INTO l_sum
      FROM doc_folder df
     WHERE df.id_account = 900413540
           AND df.id_srv <> 0;
BEGIN
  OPEN cur;
  FETCH cur
    INTO l_sum;
  CLOSE cur;
END;
та же ошибка
4 май 07, 19:09    [4102018]     Ответить | Цитировать Сообщить модератору
 Re: Тормозит запрос  [new]
sergey888
Member [заблокирован]

Откуда:
Сообщений: 4298
tauralex
Если запускается процедура, то почему нельзя использовать курсор?

каким образом? переделал запрос в виде курсора в скрипте
DECLARE
  l_sum NUMBER;
  CURSOR cur IS
    SELECT SUM((SELECT nvl(SUM(d.total), 0) FROM doc d WHERE df.id = d.id_doc_folder)) AS total
      INTO l_sum
      FROM doc_folder df
     WHERE df.id_account = 900413540
           AND df.id_srv <> 0;
BEGIN
  OPEN cur;
  FETCH cur
    INTO l_sum;
  CLOSE cur;
END;
та же ошибка


А что за ошибка?
7 май 07, 10:28    [4106509]     Ответить | Цитировать Сообщить модератору
 Re: Тормозит запрос  [new]
tauralex
Member

Откуда:
Сообщений: 81
а вообще, если считать, что индексы настроены правильно, статистика собрана, что может повлиять на скорость связывания таблиц, от чего может быть такая высокая мощность/кардинальность у таблиц, при том что используется индекс, какие параметры базы, в частности, можно подкрутить для решения проблемы?

запрос переписал в plsql через вложенные циклы по таблицам, так что эти места стали отрабатывать быстрее, но подобных связок используется много (да и решение не самое красивое), поэтому хотелось бы понять и устранить причины

оракл 8.1.7.15
7 май 07, 10:32    [4106538]     Ответить | Цитировать Сообщить модератору
 Re: Тормозит запрос  [new]
sergey888
Member [заблокирован]

Откуда:
Сообщений: 4298
tauralex
а вообще, если считать, что индексы настроены правильно, статистика собрана, что может повлиять на скорость связывания таблиц, от чего может быть такая высокая мощность/кардинальность у таблиц, при том что используется индекс, какие параметры базы, в частности, можно подкрутить для решения проблемы?

запрос переписал в plsql через вложенные циклы по таблицам, так что эти места стали отрабатывать быстрее, но подобных связок используется много (да и решение не самое красивое), поэтому хотелось бы понять и устранить причины

оракл 8.1.7.15


для этого надо знать проблему в целом, может есть более простое решение для всей задачи
7 май 07, 10:56    [4106721]     Ответить | Цитировать Сообщить модератору
 Re: Тормозит запрос  [new]
tauralex
Member

Откуда:
Сообщений: 81
А что за ошибка?

ora-06550 и pls-00103
во вложенном файле

К сообщению приложен файл. Размер - 0Kb
7 май 07, 10:58    [4106731]     Ответить | Цитировать Сообщить модератору
 Re: Тормозит запрос  [new]
Elic
Member

Откуда:
Сообщений: 29988
tauralex
8.1.7
ora-06550 и pls-00103
Этот PL/SQL не понимает скалярных подзапросов.
7 май 07, 11:04    [4106768]     Ответить | Цитировать Сообщить модератору
 Re: Тормозит запрос  [new]
tauralex
Member

Откуда:
Сообщений: 81
Elic
Этот PL/SQL не понимает скалярных подзапросов.

Это понятно, но версию оракла пока поднять нет возможности, и опять же это обход проблемы, а не решение, здесь нужна сумма и это решается подзапросом, а там где нужны будут несколько полей такое уже не прокатит
7 май 07, 11:20    [4106886]     Ответить | Цитировать Сообщить модератору
 Re: Тормозит запрос  [new]
sergey888
Member [заблокирован]

Откуда:
Сообщений: 4298
Я хотел увидеть весь запрос, а не сообщение об ошибке.
7 май 07, 11:36    [4107012]     Ответить | Цитировать Сообщить модератору
 Re: Тормозит запрос  [new]
tauralex
Member

Откуда:
Сообщений: 81
tauralex
Если запускается процедура, то почему нельзя использовать курсор?

каким образом? переделал запрос в виде курсора в скрипте
DECLARE
  l_sum NUMBER;
  CURSOR cur IS
    SELECT SUM((SELECT nvl(SUM(d.total), 0) FROM doc d WHERE df.id = d.id_doc_folder)) AS total
      INTO l_sum
      FROM doc_folder df
     WHERE df.id_account = 900413540
           AND df.id_srv <> 0;
BEGIN
  OPEN cur;
  FETCH cur
    INTO l_sum;
  CLOSE cur;
END;
7 май 07, 11:59    [4107204]     Ответить | Цитировать Сообщить модератору
 Re: Тормозит запрос  [new]
sergey888
Member [заблокирован]

Откуда:
Сообщений: 4298
А поче сейчас жилье в Ейске?
7 май 07, 12:01    [4107225]     Ответить | Цитировать Сообщить модератору
 Re: Тормозит запрос  [new]
alexia
Member

Откуда: Санкт-Петербург
Сообщений: 460
Добрый день.

а не подскажете, как указать оптимизатору, что в запросе нужно использовать конкретный индекс?
имеется множество индексов и оптимизатор "хватает" не тот индекс, какой хотелось бы.
спасибо.
7 май 07, 12:24    [4107392]     Ответить | Цитировать Сообщить модератору
 Re: Тормозит запрос  [new]
pravednik
Member

Откуда: Jacksonville, FL
Сообщений: 16268
Штырк

--------------------------------
Вся жизнь -ништяк, все бабы -леди,а солнце -шар дающий свет.
7 май 07, 12:27    [4107412]     Ответить | Цитировать Сообщить модератору
 Re: Тормозит запрос  [new]
tauralex
Member

Откуда:
Сообщений: 81
sergey888
А поче сейчас жилье в Ейске?

новые квартиры от 21 тыщ за кв.м. без отделки, старые не интересовался
7 май 07, 12:50    [4107561]     Ответить | Цитировать Сообщить модератору
 Re: Тормозит запрос  [new]
GenaN
Member

Откуда:
Сообщений: 12
попробуй создать такой индекс
create index DOC_IDX_TEST on DOC (ID, id_srv, id_account)
7 май 07, 15:15    [4108617]     Ответить | Цитировать Сообщить модератору
 Re: Тормозит запрос  [new]
tauralex
Member

Откуда:
Сообщений: 81
GenaN
попробуй создать такой индекс
create index DOC_IDX_TEST on DOC (ID, id_srv, id_account)

в таблице doc нет полей id_srv, id_account
7 май 07, 15:28    [4108730]     Ответить | Цитировать Сообщить модератору
 Re: Тормозит запрос  [new]
GenaN
Member

Откуда:
Сообщений: 12
Сорри, для DOC_FOLDER
7 май 07, 15:59    [4108968]     Ответить | Цитировать Сообщить модератору
 Re: Тормозит запрос  [new]
tauralex
Member

Откуда:
Сообщений: 81
он этот индекс (id, id_srv, id_account) не берет, точнее брал пока я по нему не сделал анализ, но даже тогда не было прироста скорости

интересно другое, если исходный запрос разбить на 2 независимых, то план выглядит уже приемлемо
SELECT df.ID
  FROM doc_folder df
 WHERE df.id_account = :i_id_account
       AND df.id_srv <> :var1

SELECT STATEMENT, GOAL = CHOOSE		Ñòîèìîñòü=20	Ìîùíîñòü=37		Áàéòû=481			Îïòèìèçàòîð=CHOOSE
 TABLE ACCESS BY INDEX ROWID	Èìÿ îáúåêòà=DOC_FOLDER	Ñòîèìîñòü=20	Ìîùíîñòü=37	Ýêçåìïëÿð îáúåêòà=1	Áàéòû=481			Îïòèìèçàòîð=ANALYZED
  INDEX RANGE SCAN	Èìÿ îáúåêòà=DOC_FOLDER_UNQ	Ñòîèìîñòü=3	Ìîùíîñòü=37					Îïòèìèçàòîð=ANALYZED

SELECT nvl(SUM(d.total), 0)
  FROM doc d
 WHERE d.id_doc_folder = :var1

SELECT STATEMENT, GOAL = CHOOSE		Ñòîèìîñòü=4	Ìîùíîñòü=1		Áàéòû=9			Îïòèìèçàòîð=CHOOSE
 SORT AGGREGATE			Ìîùíîñòü=1		Áàéòû=9			
  TABLE ACCESS BY INDEX ROWID	Èìÿ îáúåêòà=DOC	Ñòîèìîñòü=4	Ìîùíîñòü=1	Ýêçåìïëÿð îáúåêòà=1	Áàéòû=9			Îïòèìèçàòîð=ANALYZED
   INDEX RANGE SCAN	Èìÿ îáúåêòà=DOC_IDX_DOC_FOLDER	Ñòîèìîñòü=3	Ìîùíîñòü=1					Îïòèìèçàòîð=ANALYZED

а при связывании таблиц увеличивается мощность/кардинальность и байты
SELECT nvl(SUM(d.total), 0)
  FROM doc_folder df, doc d
 WHERE df.id_account = :i_id_account
       AND df.id_srv <> :var1
       AND df.id = d.id_doc_folder

SELECT STATEMENT, GOAL = CHOOSE		Ñòîèìîñòü=131	Ìîùíîñòü=1		Áàéòû=22			Îïòèìèçàòîð=CHOOSE
 SORT AGGREGATE			Ìîùíîñòü=1		Áàéòû=22			
  NESTED LOOPS		Ñòîèìîñòü=131	Ìîùíîñòü=1		Áàéòû=22			
   TABLE ACCESS BY INDEX ROWID	Èìÿ îáúåêòà=DOC_FOLDER	Ñòîèìîñòü=20	Ìîùíîñòü=37	Ýêçåìïëÿð îáúåêòà=1	Áàéòû=481			Îïòèìèçàòîð=ANALYZED
    INDEX RANGE SCAN	Èìÿ îáúåêòà=DOC_FOLDER_UNQ	Ñòîèìîñòü=3	Ìîùíîñòü=37					Îïòèìèçàòîð=ANALYZED
   TABLE ACCESS BY INDEX ROWID	Èìÿ îáúåêòà=DOC	Ñòîèìîñòü=3	Ìîùíîñòü=3778349	Ýêçåìïëÿð îáúåêòà=2	Áàéòû=34005141			Îïòèìèçàòîð=ANALYZED
    INDEX RANGE SCAN	Èìÿ îáúåêòà=DOC_IDX_DOC_FOLDER	Ñòîèìîñòü=2	Ìîùíîñòü=3778349					Îïòèìèçàòîð=ANALYZED
7 май 07, 16:59    [4109405]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3   вперед  Ctrl      все
Все форумы / Oracle Ответить