Oracle SQL: один выбор занимает много времени, другой выбор быстро - PullRequest
1 голос
/ 20 февраля 2012

У меня есть два выбора на одном экране.Один выбор будет отфильтрован с помощью первичного ключа, другой выбор будет отфильтрован по неуникальному индексу.Используемый вид сложен.Для выбора с помощью первичного ключа требуется около 15 секунд.Для выбора с неуникальным индексом требуется 0,5 секунды.

Почему запрос, использующий первичный ключ, настолько медленный?

Я использую "EXPLAIN PLAN FOR", чтобы создать план выполнения дляи то и другое.

План выполнения для быстрого выбора: Быстрый выбор

План выполнения для быстрого выбора: Медленный выбор

--Pseudocode
create table TableA
(
   ID number,  --(Primary Key)
   ProjectID number, --(Not unique index)
   TableB_id number, --(Foreign Key to Table TableB)
   TableC_id number, --(Foreign Key to Table TableC)
   TableD_id number  --(Foreign Key to Table TableD)
);



Create view viewX
as
Select 
      ID as TableB_ID, 
      0 as TableC_ID, 
      0 as TableD_ID, 
      Value1, 
      Value2
   from TableB
union all
Select 
      0 as TableB_ID, 
      ID as TableC_ID, 
      0 as TableD_ID, 
      Value1, 
      value2
   from TableC
union all
Select 
      0 as TableB_ID, 
      0 as TableC_ID, 
      id as TableD_ID, 
      value1, 
      value2
   from viewz;



Create view viewA
as
Select 
       t.id, 
       t.ProjectID, 
       x.TableB_ID, 
       x.TableC_ID, 
       x.TableD_ID
   from TableA t
   inner join viewX x
   on t.TableB_ID = x.TableB_ID and
      t.TableC_ID = x.TableC_ID and
      t.TableD_ID = x.TableD_ID;

--this select needs o,5 seconds
Select *
   from ViewA 
   where ProjectID = 2220;


--this select needs 15 seconds
Select *
   from viewA
   where id = 5440;

Выбор в TableA и ViewX по отдельности быстр.

--this select needs 0,5 seconds
select *
   from TableA
   where id = 5440;

Result: ID = 5440, ProjektID = 2220, TableB_ID = 123, TableC_ID = 5325, TableD_ID = 7654

--this select needs 0,3 seconds
Select *
   viewX x
   where TableB_ID = 123 and
         TableC_ID = 5325 and
         TableD_ID = 7654;

Спасибо за вашу поддержку

1 Ответ

1 голос
/ 21 февраля 2012

Я бы сказал, что это потому, что оптимизатор разложит выборку по отношению к представлению для выбора по базовым таблицам. Во втором случае вы объединяете не все строки других таблиц, а только строки, соответствующие условию where для этой таблицы, поэтому второй запрос выполняется быстрее, поскольку он должен проходить через меньшее количество строк.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...