Помогите сформулировать правильное видение ситуации...

artemisin
Дата: 01.08.2005 13:06:52
Запрос:
  SQL Statement from editor:
   
   
  SELECT     *
            FROM doc_config
           WHERE LEVEL > 1
      CONNECT BY PRIOR doc_config_id = owner_id
      START WITH doc_config_id = :i_doc_config_id
  ------------------------------------------------------------
    
  Statement Id=4   Type=INDEX
  Cost=0  TimeStamp=01-08-05::13::05:06
  
    SELECT STATEMENT  CHOOSE
    FILTER
           (9)  CONNECT BY WITH FILTERING
               (4)  NESTED LOOPS
                   (2)  UNIQUE INDEX UNIQUE SCAN M_TBDOC3.PK_DOC_CONFIG  [Not Analyzed]
                   (3)  TABLE ACCESS BY USER ROWID M_TBDOC3.DOC_CONFIG  [Not Analyzed] 
                        Tablespace: TST1
               (8)  NESTED LOOPS
                   (6)  BUFFER SORT
                       (5)  CONNECT BY PUMP
                   (7)  TABLE ACCESS FULL M_TBDOC3.DOC_CONFIG  [Not Analyzed] 
                        Tablespace: TST1
При выполнении деервянного запроса никак нельзя избежать полного сканирования таблицы?
(7) TABLE ACCESS FULL M_TBDOC3.DOC_CONFIG [Not Analyzed] ?
возможно ли использование индекса?
и адекватно ли использование индекса?
alex-ls
Дата: 01.08.2005 13:21:03
А что Вы хотите выбрать конкретно, без *. Сколько строк в таблице? Какой процент попадает в выборку?
Elic
Дата: 01.08.2005 13:28:42
artemisin
      CONNECT BY PRIOR doc_config_id = owner_id
возможно ли использование индекса?
А есть ли индекс?!
artemisin
Дата: 01.08.2005 15:20:58
Соответсвующий индекс есть.
Я так понимаю, что ограничивающим фактором при деревянном запросе в моем случае будет конструкция START WITH. Предполагаю, что отталкиваясь от корневого элемента, оптимизатор мог бы использовать для поиска осталных элементов индекс. Но он предпочитает полный просмотр.
Объясните, в какой момент моя логика начинает отличаться от логики оптимимзатора?
Собственно вот индекс
CREATE UNIQUE INDEX pk_doc_config ON doc_config
  (
    doc_config_id                   ASC
  )
/
alex-ls
Дата: 01.08.2005 15:33:33
artemisin
Объясните, в какой момент моя логика начинает отличаться от логики оптимимзатора?

Повторяю для непонятливых:
alex-ls

А что Вы хотите выбрать конкретно, без *. Сколько строк в таблице? Какой процент попадает в выборку?
artemisin
Дата: 01.08.2005 16:09:15
Кажется догнал...
сейчас в таблице не более 100 записей - ожидается больше пару порядков.
в выборку попадает около 50% таблицы.
прочитал соответсвующее место у Кайта.
Так понимаю, что оптимизатор предпочитает полный просмотр табюлицы, поскольку он займет меньше операций чтения, нежели такой же проход по индексу?
alex-ls
Дата: 01.08.2005 16:44:26
artemisin
Кажется догнал...

Видишь как быстро сообразил после того, как я два раза вопрос задал
Barkovsky
Дата: 01.08.2005 16:45:14
неа)
у вас статистика не собрана, так что никаких предпочтений. оптимизатор ходит строем.
alex-ls
Дата: 01.08.2005 16:49:30
Barkovsky
неа)
у вас статистика не собрана, так что никаких предпочтений. оптимизатор ходит строем.

Не уверен, что если не собрана статистика, то оптимизатор выберет просмотр таблицы. А вот если выбирается 50 строк из 100 то явно индекс использоваться не будет.
Barkovsky
Дата: 01.08.2005 17:01:56
alex-ls
Не уверен, что если не собрана статистика, то оптимизатор выберет просмотр таблицы.

это сложная конструкция для меня, не понял) отвечу в стиле)

уверен, что если не собрана статистика, то оптимизатор даже не заморочаивается на предмет распределения данных.