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

Откуда: Tulcea
Сообщений: 494
Доброго времени суток.
Подскажите пожалуйста, где может быть ошибка ...
Есть вот такой запрос
  select i.invoice_dept as dept_id, it.opr_date, 0 as offer_id, s.stock_id, nvl(s.lot_num, to_char(po.purchase_num)) as lot_num, 0 as stock_to, 0 as stock_from,
         0 as stage_type, 0 as deliv_type, it.deliv_id, 0 as shipped_id, 0 as release_id, 0 as fractionation_id, 0 as inventory_id, 0 as briquetting_id,
         it.budget_id, it.prod_id,
         it.qty*((soc.service_qty/tt.service_total)/(select count(t.stock_id) from stock t where t.storage_id=so.storage_id and t.purchase_row_id=soc.purchase_row_id)) as qty,
         it.amount*((soc.service_qty/tt.service_total)/(select count(t.stock_id) from stock t where t.storage_id=so.storage_id and t.purchase_row_id=soc.purchase_row_id)) as amount,
         it.invoice_id as invoiceid, -81 as status
  from invoice i, invoice_content it, service_order_content soc, service_order_trn sot, service_order so, prod p, prod_grade pg,
       purchase_order_trn pot, stock s, purchase_order po,
       (select m.id, m.service_row_id, sum(m.service_qty) as service_total
        from (select distinct it.id, soc.service_row_id, soc.purchase_row_id, decode(soc.service_qty,0, soc.invoice_qty, soc.service_qty) as service_qty
              from invoice i, invoice_content it, service_order_content soc, service_order_trn sot, service_order so, purchase_order_trn pot, prod p, prod_grade pg, stock s
              where i.invoice_type=8 and it.invoice_id=i.invoice_id and it.purchase_id>0 and it.service_row_id>0
                and soc.service_row_id=it.service_row_id
                and sot.service_row_id=soc.service_row_id
                and pot.id=soc.purchase_row_id and pot.order_id=it.purchase_id
                and p.prod_id=pot.prod_id
                and pg.grade_id=p.prod_grade and pg.grade_id=it.grade_id
                and so.service_id=sot.service_id and so.storage_id>0
                and s.storage_id=so.storage_id and s.purchase_row_id=soc.purchase_row_id and nvl(s.stock_id,0)>0) m
        group by m.id, m.service_row_id) tt
  where i.invoice_dept>0 and i.invoice_kind=1 and i.invoice_voided=0 and i.invoice_type=8 and i.status=1
    and it.invoice_id=i.invoice_id and it.purchase_id>0
    and i.invoice_id not in (select invoice_id from finance.stock_cost_trn)
    and it.id=nvl(tt.id, 0) and it.service_row_id=nvl(tt.service_row_id, 0)
    and soc.service_row_id=it.service_row_id
    and sot.service_row_id=soc.service_row_id
    and so.service_id=sot.service_id
    and so.storage_id>0
    and pot.id=soc.purchase_row_id and pot.order_id=it.purchase_id and po.order_id=pot.order_id
    and p.prod_id=pot.prod_id and pg.grade_id=p.prod_grade and pg.grade_id=it.grade_id
    and s.storage_id=so.storage_id and s.purchase_row_id=soc.purchase_row_id and nvl(s.stock_id,0)>0


Выполняется отлично, быстро и надежно. 8-10 сек.

Но если сделать 2 изменения запрос виснет.

1. Если убрать все из результирующих полей кроме i.invoice_id - запрос умирает. После 10 мин выполнения я его обрываю.
2. Если добавить в index в таблице invoice_content еще поля для индексирования (сейчас там только invoice_id, если добавить еще id, purchase_id, service_row_id) - результат тот же самый, запрос зависает.

Подскажите почему так происходит? Что можно изменить? Возможные причины, спасибо.


------------------------------------------------------------
Veni. Vidi. Vici.
13 дек 16, 15:47    [19998155]     Ответить | Цитировать Сообщить модератору
 Re: Запрос тормозит  [new]
dmdmdm
Member

Откуда: Нижний Новгород
Сообщений: 1647
Как насчет плана?
13 дек 16, 15:50    [19998170]     Ответить | Цитировать Сообщить модератору
 Re: Запрос тормозит  [new]
env
Member

Откуда: Россия, Москва
Сообщений: 6749
Грунов,

explain plan for ...
13 дек 16, 15:51    [19998177]     Ответить | Цитировать Сообщить модератору
 Re: Запрос тормозит  [new]
Грунов
Member

Откуда: Tulcea
Сообщений: 494
План получается такой вот ...
Description Object owner Object name Cost Cardinality Bytes Access predicates
SELECT STATEMENT GOAL = ALL_ROWS 11845 1 123
HASH JOIN ANTI NA 11845 1 123 I."INVOICE_ID"="INVOICE_ID"
NESTED LOOPS
NESTED LOOPS 3191 1 120
HASH JOIN 3190 1 100 S."STORAGE_ID"="SO"."STORAGE_ID" AND "S"."PURCHASE_ROW_ID"="SOC"."PURCHASE_ROW_ID"
NESTED LOOPS
NESTED LOOPS 3053 1 87
NESTED LOOPS 3052 1 79
NESTED LOOPS 3051 1 71
NESTED LOOPS 3051 67
NESTED LOOPS 1493 1 52
HASH JOIN 1493 2333 102652 POT."ORDER_ID"="IT"."PURCHASE_ID" AND "PG"."GRADE_ID"="IT"."GRADE_ID"
HASH JOIN 83 4741 109043 P."PROD_ID"="POT"."PROD_ID"
HASH JOIN 15 1180 12980 PG."GRADE_ID"="P"."PROD_GRADE"
INDEX FULL SCAN SETTING PK_GRADE 1 98 392
TABLE ACCESS FULL SETTING PROD 13 1244 8708
TABLE ACCESS FULL STORE PURCHASE_ORDER_TRN 68 4958 59496
TABLE ACCESS FULL FINANCE INVOICE_CONTENT 1407 225352 4732392
INDEX UNIQUE SCAN STORE PK_SERVICE_CONTENT 0 1 8 SOC."SERVICE_ROW_ID"="IT"."SERVICE_ROW_ID" AND "POT"."ID"="SOC"."PURCHASE_ROW_ID"
VIEW PUSHED PREDICATE FINANCE 1558 1 15
SORT GROUP BY 1558 1 17
VIEW FINANCE 1558 1 17
SORT UNIQUE 1558 1 98
HASH JOIN 1557 1 98 S."STORAGE_ID"="SO"."STORAGE_ID" AND "S"."PURCHASE_ROW_ID"="SOC"."PURCHASE_ROW_ID"
NESTED LOOPS
NESTED LOOPS 1419 1 85
NESTED LOOPS 1418 1 77
NESTED LOOPS 1417 1 69
NESTED LOOPS 1416 1 61
NESTED LOOPS 1414 1 54
HASH JOIN 1413 1 50 SOC."SERVICE_ROW_ID"="IT"."SERVICE_ROW_ID" AND "POT"."ORDER_ID"="IT"."PURCHASE_ID"
NESTED LOOPS
NESTED LOOPS 5 2 58
TABLE ACCESS BY INDEX ROWID STORE SERVICE_ORDER_CONTENT 3 2 34
INDEX RANGE SCAN STORE PK_SERVICE_CONTENT 2 2 SOC."SERVICE_ROW_ID"="IT"."SERVICE_ROW_ID"
INDEX UNIQUE SCAN STORE IND_ID 0 1 POT."ID"="SOC"."PURCHASE_ROW_ID"
TABLE ACCESS BY INDEX ROWID STORE PURCHASE_ORDER_TRN 1 1 12
TABLE ACCESS FULL FINANCE INVOICE_CONTENT 1407 30165 633465
INDEX FULL SCAN SETTING PK_GRADE 1 1 4 PG."GRADE_ID"="IT"."GRADE_ID"
TABLE ACCESS BY INDEX ROWID SETTING PROD 2 1 7
INDEX RANGE SCAN SETTING PK_PROD 1 1 P."PROD_ID"="POT"."PROD_ID"
TABLE ACCESS BY INDEX ROWID FINANCE INVOICE 1 1 8
INDEX UNIQUE SCAN FINANCE PK_INVOICE 0 1 IT."INVOICE_ID"="I"."INVOICE_ID"
TABLE ACCESS BY INDEX ROWID STORE SERVICE_ORDER_TRN 1 1 8
INDEX UNIQUE SCAN STORE PK_SERVICE_TRN_1 0 1 SOT."SERVICE_ROW_ID"="SOC"."SERVICE_ROW_ID"
INDEX UNIQUE SCAN STORE PK_SERVICE_ORDER 0 1 SO."SERVICE_ID"="SOT"."SERVICE_ID"
TABLE ACCESS BY INDEX ROWID STORE SERVICE_ORDER 1 1 8
TABLE ACCESS FULL STORE STOCK 137 24175 314275
INDEX UNIQUE SCAN STORE PK_PO 0 1 4 PO."ORDER_ID"="POT"."ORDER_ID"
TABLE ACCESS BY INDEX ROWID STORE SERVICE_ORDER_TRN 1 1 8
INDEX UNIQUE SCAN STORE PK_SERVICE_TRN_1 0 1 SOT."SERVICE_ROW_ID"="SOC"."SERVICE_ROW_ID"
INDEX UNIQUE SCAN STORE PK_SERVICE_ORDER 0 1 SO."SERVICE_ID"="SOT"."SERVICE_ID"
TABLE ACCESS BY INDEX ROWID STORE SERVICE_ORDER 1 1 8
TABLE ACCESS FULL STORE STOCK 137 24175 314275
INDEX UNIQUE SCAN FINANCE PK_INVOICE 0 1 IT."INVOICE_ID"="I"."INVOICE_ID"
TABLE ACCESS BY INDEX ROWID FINANCE INVOICE 1 1 20
TABLE ACCESS FULL FINANCE STOCK_COST_TRN 8637 2242280 6726840
13 дек 16, 16:11    [19998317]     Ответить | Цитировать Сообщить модератору
 Re: Запрос тормозит  [new]
env
Member

Откуда: Россия, Москва
Сообщений: 6749
Грунов,

А в двух других вариантах?
13 дек 16, 16:17    [19998347]     Ответить | Цитировать Сообщить модератору
 Re: Запрос тормозит  [new]
Elic
Member

Откуда:
Сообщений: 29991
Грунов
План получается такой вот ...
Такой читай сам.
13 дек 16, 16:18    [19998351]     Ответить | Цитировать Сообщить модератору
 Re: Запрос тормозит  [new]
Грунов
Member

Откуда: Tulcea
Сообщений: 494
env
Грунов,

А в двух других вариантах?


Это в варианте когда в результирующих полях только 1 поле.

Сейчас для нормального варианта сделаю.
13 дек 16, 16:19    [19998361]     Ответить | Цитировать Сообщить модератору
 Re: Запрос тормозит  [new]
Грунов
Member

Откуда: Tulcea
Сообщений: 494
Elic
Грунов
План получается такой вот ...
Такой читай сам.


А как его сюда выложить чтобы был читабельным
13 дек 16, 16:19    [19998366]     Ответить | Цитировать Сообщить модератору
 Re: Запрос тормозит  [new]
Грунов
Member

Откуда: Tulcea
Сообщений: 494
Грунов
Elic
пропущено...
Такой читай сам.


А как его сюда выложить чтобы был читабельным


Скриншотом?
13 дек 16, 16:20    [19998370]     Ответить | Цитировать Сообщить модератору
 Re: Запрос тормозит  [new]
Грунов
Member

Откуда: Tulcea
Сообщений: 494
Первая часть плана для запроса который выполняется быстро. Основной запрос.

К сообщению приложен файл. Размер - 50Kb
13 дек 16, 16:30    [19998408]     Ответить | Цитировать Сообщить модератору
 Re: Запрос тормозит  [new]
Грунов
Member

Откуда: Tulcea
Сообщений: 494


К сообщению приложен файл. Размер - 32Kb
13 дек 16, 16:31    [19998413]     Ответить | Цитировать Сообщить модератору
 Re: Запрос тормозит  [new]
Грунов
Member

Откуда: Tulcea
Сообщений: 494
Извините ошибся ... Это как раз тот который зависает. Который я до этого вылаживал в виде таблицы.
13 дек 16, 16:32    [19998424]     Ответить | Цитировать Сообщить модератору
 Re: Запрос тормозит  [new]
Грунов
Member

Откуда: Tulcea
Сообщений: 494
Вот план исходного запроса.

К сообщению приложен файл. Размер - 48Kb
13 дек 16, 16:34    [19998441]     Ответить | Цитировать Сообщить модератору
 Re: Запрос тормозит  [new]
Грунов
Member

Откуда: Tulcea
Сообщений: 494


К сообщению приложен файл. Размер - 38Kb
13 дек 16, 16:35    [19998443]     Ответить | Цитировать Сообщить модератору
 Re: Запрос тормозит  [new]
д0kХ
Guest
Грунов
Доброго времени суток.
Подскажите пожалуйста, где может быть ошибка ...
Есть вот такой запрос
  select i.invoice_dept as dept_id, it.opr_date, 0 as offer_id, s.stock_id, nvl(s.lot_num, to_char(po.purchase_num)) as lot_num, 0 as stock_to, 0 as stock_from,
         0 as stage_type, 0 as deliv_type, it.deliv_id, 0 as shipped_id, 0 as release_id, 0 as fractionation_id, 0 as inventory_id, 0 as briquetting_id,
         it.budget_id, it.prod_id,
         it.qty*((soc.service_qty/tt.service_total)/(select count(t.stock_id) from stock t where t.storage_id=so.storage_id and t.purchase_row_id=soc.purchase_row_id)) as qty,
         it.amount*((soc.service_qty/tt.service_total)/(select count(t.stock_id) from stock t where t.storage_id=so.storage_id and t.purchase_row_id=soc.purchase_row_id)) as amount,
         it.invoice_id as invoiceid, -81 as status
  from invoice i, invoice_content it, service_order_content soc, service_order_trn sot, service_order so, prod p, prod_grade pg,
       purchase_order_trn pot, stock s, purchase_order po,
       (select m.id, m.service_row_id, sum(m.service_qty) as service_total
        from (select distinct it.id, soc.service_row_id, soc.purchase_row_id, decode(soc.service_qty,0, soc.invoice_qty, soc.service_qty) as service_qty
              from invoice i, invoice_content it, service_order_content soc, service_order_trn sot, service_order so, purchase_order_trn pot, prod p, prod_grade pg, stock s
              where i.invoice_type=8 and it.invoice_id=i.invoice_id and it.purchase_id>0 and it.service_row_id>0
                and soc.service_row_id=it.service_row_id
                and sot.service_row_id=soc.service_row_id
                and pot.id=soc.purchase_row_id and pot.order_id=it.purchase_id
                and p.prod_id=pot.prod_id
                and pg.grade_id=p.prod_grade and pg.grade_id=it.grade_id
                and so.service_id=sot.service_id and so.storage_id>0
                and s.storage_id=so.storage_id and s.purchase_row_id=soc.purchase_row_id and nvl(s.stock_id,0)>0) m
        group by m.id, m.service_row_id) tt
  where i.invoice_dept>0 and i.invoice_kind=1 and i.invoice_voided=0 and i.invoice_type=8 and i.status=1
    and it.invoice_id=i.invoice_id and it.purchase_id>0
    and i.invoice_id not in (select invoice_id from finance.stock_cost_trn)
    and it.id=nvl(tt.id, 0) and it.service_row_id=nvl(tt.service_row_id, 0)
    and soc.service_row_id=it.service_row_id
    and sot.service_row_id=soc.service_row_id
    and so.service_id=sot.service_id
    and so.storage_id>0
    and pot.id=soc.purchase_row_id and pot.order_id=it.purchase_id and po.order_id=pot.order_id
    and p.prod_id=pot.prod_id and pg.grade_id=p.prod_grade and pg.grade_id=it.grade_id
    and s.storage_id=so.storage_id and s.purchase_row_id=soc.purchase_row_id and nvl(s.stock_id,0)>0


Выполняется отлично, быстро и надежно. 8-10 сек.

Но если сделать 2 изменения запрос виснет.

1. Если убрать все из результирующих полей кроме i.invoice_id - запрос умирает. После 10 мин выполнения я его обрываю.
2. Если добавить в index в таблице invoice_content еще поля для индексирования (сейчас там только invoice_id, если добавить еще id, purchase_id, service_row_id) - результат тот же самый, запрос зависает.

Подскажите почему так происходит? Что можно изменить? Возможные причины, спасибо.


------------------------------------------------------------
Veni. Vidi. Vici.


По пункту 1 - в вас в оригинальном запросе it.invoice_id, а не i.invoice_id
По пункту 2 - собрать статистику.

И еще, по вопросу организации учета нот в консерватории риторический вопрос :
почему в условиях объеденения таблиц нет алиаса tt ?
13 дек 16, 18:00    [19998958]     Ответить | Цитировать Сообщить модератору
 Re: Запрос тормозит  [new]
Грунов
Member

Откуда: Tulcea
Сообщений: 494
д0kХ
По пункту 1 - в вас в оригинальном запросе it.invoice_id, а не i.invoice_id
По пункту 2 - собрать статистику.

И еще, по вопросу организации учета нот в консерватории риторический вопрос :
почему в условиях объеденения таблиц нет алиаса tt ?


1 - если ставить it.invoice_id или i.invoice_id разницы нет.

2 - соберу, спасибо ...

3. and it.id=nvl(tt.id, 0) and it.service_row_id=nvl(tt.service_row_id, 0) ---- вот же связка ...
13 дек 16, 18:04    [19998973]     Ответить | Цитировать Сообщить модератору
 Re: Запрос тормозит  [new]
д0kХ
Guest
Грунов
д0kХ
По пункту 1 - в вас в оригинальном запросе it.invoice_id, а не i.invoice_id
По пункту 2 - собрать статистику.

И еще, по вопросу организации учета нот в консерватории риторический вопрос :
почему в условиях объеденения таблиц нет алиаса tt ?


1 - если ставить it.invoice_id или i.invoice_id разницы нет.

2 - соберу, спасибо ...

3. and it.id=nvl(tt.id, 0) and it.service_row_id=nvl(tt.service_row_id, 0) ---- вот же связка ...


Я про это спрашиваю
......
from ...... ,
       (select m.id, m.service_row_id, sum(m.service_qty) as service_total
        from (select distinct it.id, soc.service_row_id, soc.purchase_row_id, decode(soc.service_qty,0, soc.invoice_qty, soc.service_qty) as service_qty
              from invoice i, invoice_content it, service_order_content soc, service_order_trn sot, service_order so, purchase_order_trn pot, prod p, prod_grade pg, stock s
              where i.invoice_type=8 and it.invoice_id=i.invoice_id and it.purchase_id>0 and it.service_row_id>0
                and soc.service_row_id=it.service_row_id
                and sot.service_row_id=soc.service_row_id
                and pot.id=soc.purchase_row_id and pot.order_id=it.purchase_id
                and p.prod_id=pot.prod_id
                and pg.grade_id=p.prod_grade and pg.grade_id=it.grade_id
                and so.service_id=sot.service_id and so.storage_id>0
                and s.storage_id=so.storage_id and s.purchase_row_id=soc.purchase_row_id and nvl(s.stock_id,0)>0) m
        group by m.id, m.service_row_id) tt
where......

tt после where я не нашел .
13 дек 16, 18:17    [19999014]     Ответить | Цитировать Сообщить модератору
 Re: Запрос тормозит  [new]
д0kХ
Guest
Грунов
д0kХ
По пункту 1 - в вас в оригинальном запросе it.invoice_id, а не i.invoice_id
По пункту 2 - собрать статистику.

И еще, по вопросу организации учета нот в консерватории риторический вопрос :
почему в условиях объеденения таблиц нет алиаса tt ?


1 - если ставить it.invoice_id или i.invoice_id разницы нет.



для вас нет, а для оптимизатора есть

invoice i, invoice_content it
разные таблицы.
13 дек 16, 18:20    [19999021]     Ответить | Цитировать Сообщить модератору
 Re: Запрос тормозит  [new]
Грунов
Member

Откуда: Tulcea
Сообщений: 494
д0kХ
tt после where я не нашел .


4 строчка ...
13 дек 16, 18:40    [19999090]     Ответить | Цитировать Сообщить модератору
 Re: Запрос тормозит  [new]
д0kХ
Guest
Грунов
д0kХ
tt после where я не нашел .


4 строчка ...


где тут 4 строчка :

автор
1. Если убрать все из результирующих полей кроме i.invoice_id - запрос умирает. После 10 мин выполнения я его обрываю.

?
13 дек 16, 18:58    [19999160]     Ответить | Цитировать Сообщить модератору
 Re: Запрос тормозит  [new]
Грунов
Member

Откуда: Tulcea
Сообщений: 494
д0kХ,

1-- where i.invoice_dept>0 and i.invoice_kind=1 and i.invoice_voided=0 and i.invoice_type=8 and i.status=1
2-- and it.invoice_id=i.invoice_id and it.purchase_id>0
3-- and i.invoice_id not in (select invoice_id from finance.stock_cost_trn)
4-- and it.id=nvl(tt.id, 0) and it.service_row_id=nvl(tt.service_row_id, 0)
13 дек 16, 19:00    [19999168]     Ответить | Цитировать Сообщить модератору
 Re: Запрос тормозит  [new]
Грунов
Member

Откуда: Tulcea
Сообщений: 494
д0kХ
Грунов
пропущено...


4 строчка ...


где тут 4 строчка :

автор
1. Если убрать все из результирующих полей кроме i.invoice_id - запрос умирает. После 10 мин выполнения я его обрываю.

?


1-- where i.invoice_dept>0 and i.invoice_kind=1 and i.invoice_voided=0 and i.invoice_type=8 and i.status=1
2-- and it.invoice_id=i.invoice_id and it.purchase_id>0
3-- and i.invoice_id not in (select invoice_id from finance.stock_cost_trn)
4-- and it.id=nvl(tt.id, 0) and it.service_row_id=nvl(tt.service_row_id, 0)


оставить вот так
  select i.invoice_id
  from ...
13 дек 16, 19:21    [19999230]     Ответить | Цитировать Сообщить модератору
 Re: Запрос тормозит  [new]
д0kХ
Guest
Грунов
д0kХ,

1-- where i.invoice_dept>0 and i.invoice_kind=1 and i.invoice_voided=0 and i.invoice_type=8 and i.status=1
2-- and it.invoice_id=i.invoice_id and it.purchase_id>0
3-- and i.invoice_id not in (select invoice_id from finance.stock_cost_trn)
4-- and it.id=nvl(tt.id, 0) and it.service_row_id=nvl(tt.service_row_id, 0)


не вижу tt, но вижу внезапно прилетающую Ora-01427
извините я устал, советую вам переписать эту простыню.
13 дек 16, 19:43    [19999291]     Ответить | Цитировать Сообщить модератору
 Re: Запрос тормозит  [new]
Грунов
Member

Откуда: Tulcea
Сообщений: 494
д0kХ
Грунов
д0kХ,

1-- where i.invoice_dept>0 and i.invoice_kind=1 and i.invoice_voided=0 and i.invoice_type=8 and i.status=1
2-- and it.invoice_id=i.invoice_id and it.purchase_id>0
3-- and i.invoice_id not in (select invoice_id from finance.stock_cost_trn)
4-- and it.id=nvl(tt.id, 0) and it.service_row_id=nvl(tt.service_row_id, 0)


не вижу tt, но вижу внезапно прилетающую Ora-01427
извините я устал, советую вам переписать эту простыню.


Спасибо, за совет. Впринципе как раз этим и занимаемся ...
Просто хотелось бы понять причину замерзания запроса на будущее ...
13 дек 16, 19:55    [19999347]     Ответить | Цитировать Сообщить модератору
 Re: Запрос тормозит  [new]
д0kХ
Guest
Грунов
д0kХ
пропущено...


не вижу tt, но вижу внезапно прилетающую Ora-01427
извините я устал, советую вам переписать эту простыню.


Спасибо, за совет. Впринципе как раз этим и занимаемся ...
Просто хотелось бы понять причину замерзания запроса на будущее ...


Я думаю, что причина замерзания в неявном коррелированном подзапросе,
в 4 и 5 строчках отсуствие которых, срывают оптимизатору крышу на
tt без явного условия объединения в on или where .
Для начала, убрав поля из алиаса tt из списка полей , уберите алиас tt
из from.
13 дек 16, 20:08    [19999374]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Oracle Ответить