запросик ....

Vobla
Дата: 09.06.2006 13:23:10
мож кто поможет с оптимизировать ... очень ненравится что вызываются 3 раза обращения к контекстному индексу ....

select * from
(
  select * from 
  (
     SELECT score(1) r, i.* FROM image i
     WHERE contains(index_state, 'car', 1) > 0
     AND fond_requisite_code = 'G'
     order by r desc
  )
  where ROWNUM <= 10
  
  union all
  
  select /*+first_rows*/ * from 
  (
    SELECT score(1) r, i.* FROM image i
    WHERE contains(index_state, 'car', 1) > 0
    and image_code not in 
    (
      select image_code from 
      (
         SELECT score(1) r, i.* FROM image i
         WHERE contains(index_state, 'car', 1) > 0
         AND fond_requisite_code = 'G'
         order by r desc
      )
      where ROWNUM <= 10
    )
    order by r desc
  )
)
where rownum <= 60
and rownum > 0
dmidek
Дата: 09.06.2006 13:32:01
На всякий случай спрошу,
у Вас image_code не уникальный ?
Vobla
Дата: 09.06.2006 13:36:46
в пределах таблицы image , image_code - уникален (первичный ключ)
givanov
Дата: 09.06.2006 13:39:03
select * from(
     SELECT score(1) r, rownum RN, i.* FROM image i
     WHERE contains(index_state, 'car', 1) > 0
     order by decode(fond_requisite_code,'G',0,1), r desc
) where RN>0 and rownum<60
?
dmidek
Дата: 09.06.2006 13:41:11
Vobla
в пределах таблицы image , image_code - уникален (первичный ключ)

Ты смотри, попал :)
Зачем NOT IN ?

select * from
(
  select * from 
  (
     SELECT score(1) r, i.* FROM image i
     WHERE contains(index_state, 'car', 1) > 0
     AND fond_requisite_code = 'G'
     order by r desc
  )
  where ROWNUM <= 10
  
  union all
  
  select * from 
  (
     SELECT score(1) r, i.* FROM image i
     WHERE contains(index_state, 'car', 1) > 0
     AND fond_requisite_code != 'G'
     order by r desc
  )
  where ROWNUM <= 10
)
и т.д.
mcureenab
Дата: 09.06.2006 13:42:05
А это для чего?

and rownum > 0
Vobla
Дата: 09.06.2006 13:44:19
givanov
select * from(
     SELECT score(1) r, rownum RN, i.* FROM image i
     WHERE contains(index_state, 'car', 1) > 0
     order by decode(fond_requisite_code,'G',0,1), r desc
) where RN>0 and rownum<60
?


не ....
нужно так:
первые 10 записей с условием fond_requisite_code='G'
дальше все остальные но без этих 10 первых ...
дальше листалка по страницам ... для примера написал с 0 по 60 ...
givanov
Дата: 09.06.2006 13:45:26
givanov
select * from
(
  select *
    from (
           SELECT score(1) r, rownum RN,
                  count(*) over (partition by fond_requisite_code order by r desc) C,
                  i.* FROM image i
             WHERE contains(index_state, 'car', 1) > 0
         )
    order by case when c <= 10 and fond_requisite_code = 'G' then 0 else 1 end, r desc
) where RN>0 and rownum<60
?
mcureenab
Дата: 09.06.2006 13:51:22
Vobla
первые 10 записей с условием fond_requisite_code='G'
дальше все остальные но без этих 10 первых ...


И в чём суть? Всё равно запрос вернёт и первые 10 и все остальные в едином потоке. А листалка по страницам rownum > X, где X>0 вообще работать не будет. Это вам не MySQL.
Vobla
Дата: 09.06.2006 13:52:25
givanov
givanov
select * from
(
  select *
    from (
           SELECT score(1) r, rownum RN,
                  count(*) over (partition by fond_requisite_code order by r desc) C,
                  i.* FROM image i
             WHERE contains(index_state, 'car', 1) > 0
         )
    order by case when c <= 10 and fond_requisite_code = 'G' then 0 else 1 end, r desc
) where RN>0 and rownum<60
?


ORA-00904: "R" - недопустимый идентификатор.