Сложный запрос занимает 30 секунд без полного сканирования таблицы - PullRequest
2 голосов
/ 03 апреля 2011

Я использую MySQL 5.1 на 32-битной машине, я использую критерии Hibernate для генерации запроса ниже; по какой-то причине я не понимаю, что для выполнения требуется 30 секунд, хотя в соответствии с тем, что говорит «объяснение», полное сканирование таблицы не выполняется.

В деталях у нас есть акции, акции_группы, индикаторы, индикатор_определения (плюс другие не очень важные таблицы, такие как страна, биржа ...). Таблица запасов содержит около 18000 строк, таблица групп - около 3000 строк, а таблица индикаторов - чуть более 710 000 строк. Во всех таблицах используются автоматически генерируемые столбцы идентификаторов, и я создал дополнительный индекс в таблице показателей, состоящей из (id, stock_id и definition_id). Если я удаляю индикаторы из запроса, который он выполняет за 0,030 с, что я и ожидал, так что я предполагаю, что там должно быть что-то не так, но мои знания баз данных несколько ограничены, и я застрял в поиске решение.

Любая помощь будет высоко ценится,

Заранее спасибо,

Xabier.

Запрос:

explain select
    this_.id as id232_12_,
    this_.created_on as created2_232_12_,
    this_.updated_on as updated3_232_12_,
    this_.version as version232_12_,
    this_.autoupdate as autoupdate232_12_,
    this_.bloomberg as bloomberg232_12_,
    this_.currency_id as currency19_232_12_,
    this_.cusip as cusip232_12_,
    this_.disabled as disabled232_12_,
    this_.exchange_id as exchange20_232_12_,
    this_.isin as isin232_12_,
    this_.name as name232_12_,
    this_.price_composition as price11_232_12_,
    this_.region_id as region21_232_12_,
    this_.reuters as reuters232_12_,
    this_.sedol as sedol232_12_,
    this_.status_message_last_update as status14_232_12_,
    this_.status_message_severity as status15_232_12_,
    this_.status_message_text as status16_232_12_,
    this_.ticker as ticker232_12_,
    this_.trading_days_id as trading22_232_12_,
    this_.type as type232_12_,
    currency4_.id as id220_0_,
    currency4_.created_on as created2_220_0_,
    currency4_.updated_on as updated3_220_0_,
    currency4_.version as version220_0_,
    currency4_.code as code220_0_,
    currency4_.long_name as long6_220_0_,
    currency4_.short_name as short7_220_0_,
    currency4_.symbol as symbol220_0_,
    groups5_.stock_id as stock1_14_,
    groups_als1_.id as group2_14_,
    groups_als1_.id as id223_1_,
    groups_als1_.created_on as created3_223_1_,
    groups_als1_.updated_on as updated4_223_1_,
    groups_als1_.version as version223_1_,
    groups_als1_.active as active223_1_,
    groups_als1_.alt_name as alt7_223_1_,
    groups_als1_.code as code223_1_,
    groups_als1_.locked as locked223_1_,
    groups_als1_.name as name223_1_,
    groups_als1_.parent_id as parent12_223_1_,
    groups_als1_.position as position223_1_,
    groups_als1_.primary_index_id as primary13_223_1_,
    groups_als1_.type_id as type14_223_1_,
    groups_als1_.kind as kind223_1_,
    parent_als2_.id as id223_2_,
    parent_als2_.created_on as created3_223_2_,
    parent_als2_.updated_on as updated4_223_2_,
    parent_als2_.version as version223_2_,
    parent_als2_.active as active223_2_,
    parent_als2_.alt_name as alt7_223_2_,
    parent_als2_.code as code223_2_,
    parent_als2_.locked as locked223_2_,
    parent_als2_.name as name223_2_,
    parent_als2_.parent_id as parent12_223_2_,
    parent_als2_.position as position223_2_,
    parent_als2_.primary_index_id as primary13_223_2_,
    parent_als2_.type_id as type14_223_2_,
    parent_als2_.kind as kind223_2_,
    stock8_.id as id232_3_,
    stock8_.created_on as created2_232_3_,
    stock8_.updated_on as updated3_232_3_,
    stock8_.version as version232_3_,
    stock8_.autoupdate as autoupdate232_3_,
    stock8_.bloomberg as bloomberg232_3_,
    stock8_.currency_id as currency19_232_3_,
    stock8_.cusip as cusip232_3_,
    stock8_.disabled as disabled232_3_,
    stock8_.exchange_id as exchange20_232_3_,
    stock8_.isin as isin232_3_,
    stock8_.name as name232_3_,
    stock8_.price_composition as price11_232_3_,
    stock8_.region_id as region21_232_3_,
    stock8_.reuters as reuters232_3_,
    stock8_.sedol as sedol232_3_,
    stock8_.status_message_last_update as status14_232_3_,
    stock8_.status_message_severity as status15_232_3_,
    stock8_.status_message_text as status16_232_3_,
    stock8_.ticker as ticker232_3_,
    stock8_.trading_days_id as trading22_232_3_,
    stock8_.type as type232_3_,
    grouptype9_.id as id224_4_,
    grouptype9_.created_on as created2_224_4_,
    grouptype9_.updated_on as updated3_224_4_,
    grouptype9_.version as version224_4_,
    grouptype9_.name as name224_4_,
    components10_.virtual_group_id as virtual2_14_,
    components10_.group_id as group1_14_,
    components10_.group_id as group1_225_5_,
    components10_.virtual_group_id as virtual2_225_5_,
    components10_.operator as operator225_5_,
    components10_.operator_name as operator4_225_5_,
    components10_.sequence as sequence225_5_,
    indicators11_.stock_id as stock23_15_,
    indicators11_.id as id15_,
    indicators11_.id as id226_6_,
    indicators11_.created_on as created3_226_6_,
    indicators11_.updated_on as updated4_226_6_,
    indicators11_.version as version226_6_,
    indicators11_.definition_id as definition22_226_6_,
    indicators11_.stock_id as stock23_226_6_,
    indicators11_.dbl_delta1 as dbl6_226_6_,
    indicators11_.dbl_value1 as dbl7_226_6_,
    indicators11_.bool_delta1 as bool8_226_6_,
    indicators11_.bool_value1 as bool9_226_6_,
    indicators11_.bool_delta2 as bool10_226_6_,
    indicators11_.bool_value2 as bool11_226_6_,
    indicators11_.int_delta1 as int12_226_6_,
    indicators11_.int_value1 as int13_226_6_,
    indicators11_.dbl_delta2 as dbl14_226_6_,
    indicators11_.dbl_value2 as dbl15_226_6_,
    indicators11_.dbl_delta3 as dbl16_226_6_,
    indicators11_.dbl_value3 as dbl17_226_6_,
    indicators11_.date_set as date18_226_6_,
    indicators11_.relative_id as relative24_226_6_,
    indicators11_.is_support as is19_226_6_,
    indicators11_.int_delta2 as int20_226_6_,
    indicators11_.int_value2 as int21_226_6_,
    indicators11_.type as type226_6_,
    indicatord12_.id as id227_7_,
    indicatord12_.created_on as created2_227_7_,
    indicatord12_.updated_on as updated3_227_7_,
    indicatord12_.version as version227_7_,
    indicatord12_.code as code227_7_,
    indicatord12_.descrip as descrip227_7_,
    indicatord12_.format as format227_7_,
    indicatord12_.name as name227_7_,
    indicatord12_.numberformat as numberfo9_227_7_,
    stock13_.id as id232_8_,
    stock13_.created_on as created2_232_8_,
    stock13_.updated_on as updated3_232_8_,
    stock13_.version as version232_8_,
    stock13_.autoupdate as autoupdate232_8_,
    stock13_.bloomberg as bloomberg232_8_,
    stock13_.currency_id as currency19_232_8_,
    stock13_.cusip as cusip232_8_,
    stock13_.disabled as disabled232_8_,
    stock13_.exchange_id as exchange20_232_8_,
    stock13_.isin as isin232_8_,
    stock13_.name as name232_8_,
    stock13_.price_composition as price11_232_8_,
    stock13_.region_id as region21_232_8_,
    stock13_.reuters as reuters232_8_,
    stock13_.sedol as sedol232_8_,
    stock13_.status_message_last_update as status14_232_8_,
    stock13_.status_message_severity as status15_232_8_,
    stock13_.status_message_text as status16_232_8_,
    stock13_.ticker as ticker232_8_,
    stock13_.trading_days_id as trading22_232_8_,
    stock13_.type as type232_8_,
    stockregio14_.id as id218_9_,
    stockregio14_.created_on as created3_218_9_,
    stockregio14_.updated_on as updated4_218_9_,
    stockregio14_.version as version218_9_,
    stockregio14_.code as code218_9_,
    stockregio14_.name as name218_9_,
    stockregio14_.group_id as group9_218_9_,
    stockregio14_.type as type218_9_,
    group15_.id as id223_10_,
    group15_.created_on as created3_223_10_,
    group15_.updated_on as updated4_223_10_,
    group15_.version as version223_10_,
    group15_.active as active223_10_,
    group15_.alt_name as alt7_223_10_,
    group15_.code as code223_10_,
    group15_.locked as locked223_10_,
    group15_.name as name223_10_,
    group15_.parent_id as parent12_223_10_,
    group15_.position as position223_10_,
    group15_.primary_index_id as primary13_223_10_,
    group15_.type_id as type14_223_10_,
    group15_.kind as kind223_10_,
    tradingday16_.id as id233_11_,
    tradingday16_.created_on as created2_233_11_,
    tradingday16_.updated_on as updated3_233_11_,
    tradingday16_.version as version233_11_,
    tradingday16_.traded_on_friday as traded5_233_11_,
    tradingday16_.traded_on_monday as traded6_233_11_,
    tradingday16_.traded_on_saturday as traded7_233_11_,
    tradingday16_.traded_on_sunday as traded8_233_11_,
    tradingday16_.traded_on_thursday as traded9_233_11_,
    tradingday16_.traded_on_tuesday as traded10_233_11_,
    tradingday16_.traded_on_wednesday as traded11_233_11_ 
from
    stocks this_ 
left outer join
    currencies currency4_ 
        on this_.currency_id=currency4_.id 
inner join
    stocks_groups groups5_ 
        on this_.id=groups5_.stock_id 
inner join
    groups groups_als1_ 
        on groups5_.group_id=groups_als1_.id 
inner join
    groups parent_als2_ 
        on groups_als1_.parent_id=parent_als2_.id 
left outer join
    stocks stock8_ 
        on groups_als1_.primary_index_id=stock8_.id 
left outer join
    group_types grouptype9_ 
        on groups_als1_.type_id=grouptype9_.id 
left outer join
    virtual_groups_components components10_ 
        on groups_als1_.id=components10_.virtual_group_id 
left outer join
    indicators indicators11_ 
        on this_.id=indicators11_.stock_id 
left outer join
    indicator_definitions indicatord12_ 
        on indicators11_.definition_id=indicatord12_.id 
left outer join
    stocks stock13_ 
        on indicators11_.relative_id=stock13_.id 
inner join
    regions stockregio14_
        on this_.region_id=stockregio14_.id 
left outer join
    groups group15_ 
        on stockregio14_.group_id=group15_.id 
inner join
    stock_trading_days tradingday16_ 
        on this_.trading_days_id=tradingday16_.id
where
    (
        groups_als1_.id in (
            208, 193, 224, 1745, 216, 1746, 1793, 218, 1747, 223, 204, 203, 209, 217, 1547, 1326, 127, 1744, 210, 212, 202, 1325, 2051, 215, 185, 1720, 197, 1721, 205, 1749, 194, 211, 195, 206, 1323, 184, 213, 220, 201, 207, 219, 1748, 196, 1071, 200
        )
    ) 
order by
    parent_als2_.position asc,
    groups_als1_.position asc,
    this_.name asc;

Я вставляю результаты объяснения как csv, потому что не знаю другого способа представить его в более простом для работы формате.

Вывод из объяснения:

"id","select_type","table","type","possible_keys","key","key_len","ref","rows","Extra"
1,"SIMPLE","groups_als1_","range","PRIMARY,FKB63DD9D428E54565","PRIMARY","8","",45,"Using where; Using temporary; Using filesort"
1,"SIMPLE","parent_als2_","eq_ref","PRIMARY","PRIMARY","8","pr2.groups_als1_.parent_id",1,""
1,"SIMPLE","stock8_","eq_ref","PRIMARY","PRIMARY","8","pr2.groups_als1_.primary_index_id",1,""
1,"SIMPLE","grouptype9_","eq_ref","PRIMARY","PRIMARY","8","pr2.groups_als1_.type_id",1,""
1,"SIMPLE","components10_","ref","FK91F4CE2D598958ED","FK91F4CE2D598958ED","8","pr2.groups_als1_.id",1,""
1,"SIMPLE","groups5_","ref","PRIMARY,FKA35A80369A4E438E,FKA35A8036A0A8A367,FKA35A8036CBAD0B70","FKA35A8036CBAD0B70","8","pr2.groups_als1_.id",4,"Using index"
1,"SIMPLE","tradingday16_","ALL","PRIMARY","","","",2,"Using join buffer"
1,"SIMPLE","this_","eq_ref","PRIMARY,FKCAD3EC1D1A5585AA,FKCAD3EC1DE15DC635","PRIMARY","8","pr2.groups5_.stock_id",1,"Using where"
1,"SIMPLE","currency4_","eq_ref","PRIMARY","PRIMARY","8","pr2.this_.currency_id",1,""
1,"SIMPLE","stockregio14_","eq_ref","PRIMARY","PRIMARY","8","pr2.this_.region_id",1,""
1,"SIMPLE","group15_","eq_ref","PRIMARY","PRIMARY","8","pr2.stockregio14_.group_id",1,""
1,"SIMPLE","indicators11_","ref","FKDC680444A0A8A367","FKDC680444A0A8A367","9","pr2.groups5_.stock_id",21,""
1,"SIMPLE","indicatord12_","eq_ref","PRIMARY","PRIMARY","8","pr2.indicators11_.definition_id",1,""
1,"SIMPLE","stock13_","eq_ref","PRIMARY","PRIMARY","8","pr2.indicators11_.relative_id",1,""

Ответы [ 5 ]

1 голос
/ 04 апреля 2011

Я могу только ПРИНЯТЬ, что в каждом столбце таблицы "автоинкремент" "ID" есть индекс соответственно. Кроме того, я хотел бы убедиться, что таблица Stock_Groups имеет индекс для Group_ID ... На virtual_groups_components, индекс на virtual_group_id Индикаторы ON, индекс по stock_id

Кроме того, поскольку у вас так много комбинаций соединений, оптимизатор запросов, возможно, слишком много думает о том, какую таблицу СЛЕДУЕТ использовать в первую очередь, и получит неверный результат. Я отсортировал таблицы и переместил вашу таблицу «Группы» (версия с псевдонимом 1) в верхнюю часть, поскольку она является основой вашего предложения WHERE. Кроме того, я добавил пункт «STRAIGHT_JOIN», который сообщает компилятору, чтобы он выполнял запрос в указанном точном порядке ... следовательно, сначала будет запрашиваться версия «groups_als1_», применяемая с помощью where, для получения наименьшего набора записей, который вы можно ожидать, что затем присоединиться ко всем другим поисковым таблицам, чтобы получить ваш результат ... Очевидно, замените мой заполнитель "AllYourFields". Я был бы заинтересован в результатах. Я делал это раньше с помощью gov't data mining из более чем 14 миллионов записей с 15+ таблицами поиска и принимал запрос от сбоев после 30+ часов до менее чем 2 часов (да, получение и сортировка ВСЕХ записей).

SELECT STRAIGHT_JOIN 
      PrimaryQuery.*,

      currency4_.id as id220_0_,
      currency4_.created_on as created2_220_0_,
      currency4_.updated_on as updated3_220_0_,
      currency4_.version as version220_0_,
      currency4_.code as code220_0_,
      currency4_.long_name as long6_220_0_,
      currency4_.short_name as short7_220_0_,
      currency4_.symbol as symbol220_0_,

      indicators11_.stock_id as stock23_15_,
      indicators11_.id as id15_,
      indicators11_.id as id226_6_,
      indicators11_.created_on as created3_226_6_,
      indicators11_.updated_on as updated4_226_6_,
      indicators11_.version as version226_6_,
      indicators11_.definition_id as definition22_226_6_,
      indicators11_.stock_id as stock23_226_6_,
      indicators11_.dbl_delta1 as dbl6_226_6_,
      indicators11_.dbl_value1 as dbl7_226_6_,
      indicators11_.bool_delta1 as bool8_226_6_,
      indicators11_.bool_value1 as bool9_226_6_,
      indicators11_.bool_delta2 as bool10_226_6_,
      indicators11_.bool_value2 as bool11_226_6_,
      indicators11_.int_delta1 as int12_226_6_,
      indicators11_.int_value1 as int13_226_6_,
      indicators11_.dbl_delta2 as dbl14_226_6_,
      indicators11_.dbl_value2 as dbl15_226_6_,
      indicators11_.dbl_delta3 as dbl16_226_6_,
      indicators11_.dbl_value3 as dbl17_226_6_,
      indicators11_.date_set as date18_226_6_,
      indicators11_.relative_id as relative24_226_6_,
      indicators11_.is_support as is19_226_6_,
      indicators11_.int_delta2 as int20_226_6_,
      indicators11_.int_value2 as int21_226_6_,
      indicators11_.type as type226_6_,

      indicatord12_.id as id227_7_,
      indicatord12_.created_on as created2_227_7_,
      indicatord12_.updated_on as updated3_227_7_,
      indicatord12_.version as version227_7_,
      indicatord12_.code as code227_7_,
      indicatord12_.descrip as descrip227_7_,
      indicatord12_.format as format227_7_,
      indicatord12_.name as name227_7_,
      indicatord12_.numberformat as numberfo9_227_7_,

      stock13_.id as id232_8_,
      stock13_.created_on as created2_232_8_,
      stock13_.updated_on as updated3_232_8_,
      stock13_.version as version232_8_,
      stock13_.autoupdate as autoupdate232_8_,
      stock13_.bloomberg as bloomberg232_8_,
      stock13_.currency_id as currency19_232_8_,
      stock13_.cusip as cusip232_8_,
      stock13_.disabled as disabled232_8_,
      stock13_.exchange_id as exchange20_232_8_,
      stock13_.isin as isin232_8_,
      stock13_.name as name232_8_,
      stock13_.price_composition as price11_232_8_,
      stock13_.region_id as region21_232_8_,
      stock13_.reuters as reuters232_8_,
      stock13_.sedol as sedol232_8_,
      stock13_.status_message_last_update as status14_232_8_,
      stock13_.status_message_severity as status15_232_8_,
      stock13_.status_message_text as status16_232_8_,
      stock13_.ticker as ticker232_8_,
      stock13_.trading_days_id as trading22_232_8_,
      stock13_.type as type232_8_,

      group15_.id as id223_10_,
      group15_.created_on as created3_223_10_,
      group15_.updated_on as updated4_223_10_,
      group15_.version as version223_10_,
      group15_.active as active223_10_,
      group15_.alt_name as alt7_223_10_,
      group15_.code as code223_10_,
      group15_.locked as locked223_10_,
      group15_.name as name223_10_,
      group15_.parent_id as parent12_223_10_,
      group15_.position as position223_10_,
      group15_.primary_index_id as primary13_223_10_,
      group15_.type_id as type14_223_10_,
      group15_.kind as kind223_10_

   FROM
      ( SELECT STRAIGHT_JOIN 
                groups_als1_.id as group2_14_,
                groups_als1_.id as id223_1_,
                groups_als1_.created_on as created3_223_1_,
                groups_als1_.updated_on as updated4_223_1_,
                groups_als1_.version as version223_1_,
                groups_als1_.active as active223_1_,
                groups_als1_.alt_name as alt7_223_1_,
                groups_als1_.code as code223_1_,
                groups_als1_.locked as locked223_1_,
                groups_als1_.name as name223_1_,
                groups_als1_.parent_id as parent12_223_1_,
                groups_als1_.position as position223_1_,
                groups_als1_.primary_index_id as primary13_223_1_,
                groups_als1_.type_id as type14_223_1_,
                groups_als1_.kind as kind223_1_,

                parent_als2_.id as id223_2_,
                parent_als2_.created_on as created3_223_2_,
                parent_als2_.updated_on as updated4_223_2_,
                parent_als2_.version as version223_2_,
                parent_als2_.active as active223_2_,
                parent_als2_.alt_name as alt7_223_2_,
                parent_als2_.code as code223_2_,
                parent_als2_.locked as locked223_2_,
                parent_als2_.name as name223_2_,
                parent_als2_.parent_id as parent12_223_2_,
                parent_als2_.position as position223_2_,
                parent_als2_.primary_index_id as primary13_223_2_,
                parent_als2_.type_id as type14_223_2_,
                parent_als2_.kind as kind223_2_,

                groups5_.stock_id as stock1_14_,

                this_.id as id232_12_,
                this_.created_on as created2_232_12_,
                this_.updated_on as updated3_232_12_,
                this_.version as version232_12_,
                this_.autoupdate as autoupdate232_12_,
                this_.bloomberg as bloomberg232_12_,
                this_.currency_id as currency19_232_12_,
                this_.cusip as cusip232_12_,
                this_.disabled as disabled232_12_,
                this_.exchange_id as exchange20_232_12_,
                this_.isin as isin232_12_,
                this_.name as name232_12_,
                this_.price_composition as price11_232_12_,
                this_.region_id as region21_232_12_,
                this_.reuters as reuters232_12_,
                this_.sedol as sedol232_12_,
                this_.status_message_last_update as status14_232_12_,
                this_.status_message_severity as status15_232_12_,
                this_.status_message_text as status16_232_12_,
                this_.ticker as ticker232_12_,
                this_.trading_days_id as trading22_232_12_,
                this_.type as type232_12_,

                stockregio14_.id as id218_9_,
                stockregio14_.created_on as created3_218_9_,
                stockregio14_.updated_on as updated4_218_9_,
                stockregio14_.version as version218_9_,
                stockregio14_.code as code218_9_,
                stockregio14_.name as name218_9_,
                stockregio14_.group_id as group9_218_9_,
                stockregio14_.type as type218_9_,

                tradingday16_.id as id233_11_,
                tradingday16_.created_on as created2_233_11_,
                tradingday16_.updated_on as updated3_233_11_,
                tradingday16_.version as version233_11_,
                tradingday16_.traded_on_friday as traded5_233_11_,
                tradingday16_.traded_on_monday as traded6_233_11_,
                tradingday16_.traded_on_saturday as traded7_233_11_,
                tradingday16_.traded_on_sunday as traded8_233_11_,
                tradingday16_.traded_on_thursday as traded9_233_11_,
                tradingday16_.traded_on_tuesday as traded10_233_11_,
                tradingday16_.traded_on_wednesday as traded11_233_11_,

                stock8_.id as id232_3_,
                stock8_.created_on as created2_232_3_,
                stock8_.updated_on as updated3_232_3_,
                stock8_.version as version232_3_,
                stock8_.autoupdate as autoupdate232_3_,
                stock8_.bloomberg as bloomberg232_3_,
                stock8_.currency_id as currency19_232_3_,
                stock8_.cusip as cusip232_3_,
                stock8_.disabled as disabled232_3_,
                stock8_.exchange_id as exchange20_232_3_,
                stock8_.isin as isin232_3_,
                stock8_.name as name232_3_,
                stock8_.price_composition as price11_232_3_,
                stock8_.region_id as region21_232_3_,
                stock8_.reuters as reuters232_3_,
                stock8_.sedol as sedol232_3_,
                stock8_.status_message_last_update as status14_232_3_,
                stock8_.status_message_severity as status15_232_3_,
                stock8_.status_message_text as status16_232_3_,
                stock8_.ticker as ticker232_3_,
                stock8_.trading_days_id as trading22_232_3_,
                stock8_.type as type232_3_,

                grouptype9_.id as id224_4_,
                grouptype9_.created_on as created2_224_4_,
                grouptype9_.updated_on as updated3_224_4_,
                grouptype9_.version as version224_4_,
                grouptype9_.name as name224_4_,

                components10_.virtual_group_id as virtual2_14_,
                components10_.group_id as group1_14_,
                components10_.group_id as group1_225_5_,
                components10_.virtual_group_id as virtual2_225_5_,
                components10_.operator as operator225_5_,
                components10_.operator_name as operator4_225_5_,
                components10_.sequence as sequence225_5_

            from
                groups groups_als1_ 
                    join groups parent_als2_ 
                        on groups_als1_.parent_id = parent_als2_.id 

                    join stocks_groups groups5_ 
                        on groups_als1_.id = groups5_.group_id

                    join stocks this_
                        on groups5_.stock_id = this_.id

                    join regions stockregio14_
                        on this_.region_id = stockregio14_.id 

                    join stock_trading_days tradingday16_ 
                        on this_.trading_days_id = tradingday16_.id

                    left outer join stocks stock8_ 
                        on groups_als1_.primary_index_id = stock8_.id 

                    left outer join group_types grouptype9_ 
                        on groups_als1_.type_id=grouptype9_.id 

                    left outer join virtual_groups_components components10_ 
                        on groups_als1_.id=components10_.virtual_group_id 

            where
                groups_als1_.id in ( 208, 193, 224, 1745, 216, 1746, 
                     1793, 218, 1747, 223, 204, 203, 209, 217, 1547, 
                     1326, 127, 1744, 210, 212, 202, 1325, 2051, 215, 
                     185, 1720, 197, 1721, 205, 1749, 194, 211, 195, 
                     206, 1323, 184, 213, 220, 201, 207, 219, 1748, 
                     196, 1071, 200 )
            order by
                parent_als2_.position asc,
                groups_als1_.position asc,
                this_.name asc; ) PrimaryQuery

        left outer join currencies currency4_ 
            on PrimaryQuery.currency19_232_12_ = currency4_.id 

        left outer join indicators indicators11_ 
            on PrimaryQuery.id232_12_ = indicators11_.stock_id 

            left outer join indicator_definitions indicatord12_ 
                on indicators11_.definition_id = indicatord12_.id 

            left outer join stocks stock13_ 
                on indicators11_.relative_id = stock13_.id 

        join regions stockregio14_
            on PrimaryQuery.region21_232_12_ = stockregio14_.id 

            left outer join groups group15_ 
                on stockregio14_.group_id = group15_.id 

        left outer join stocks stock8_ 
            on PrimaryQuery.primary13_223_1_ = stock8_.id 
1 голос
/ 03 апреля 2011

ОК, это довольно большой запрос, однако, он будет зависеть от индексов в каждой таблице, и если вы перенесете предложение where в соединение таблицы als1, это должно помочь, так как в настоящее время вы делаете матьвсе соединения, а затем прямо в конце со словами «О, и я хочу только этот бит»

Не могли бы вы подтвердить, что все поля идентификаторов имеют индексы?

0 голосов
/ 03 апреля 2011

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

Если ваш выбор возвращает большую часть таблицы, он должен использовать полное сканирование таблицы. Из того, что вы показали, я не могу сказать, применимо ли это в вашем случае, и я не знаю, можете ли вы контролировать стратегию соединения / выбора, используемую mysql. (как с оракулом)

--- обновить после фактического просмотра оператора sql ---

  • Есть много внешних соединений. Убедитесь, что они действительно необходимы, то есть соответствующие атрибуты гибернации фактически обнуляются. Некоторые звучат так, будто они на самом деле не обнуляются

  • группы объединяются три раза в микс. Вы могли бы лучше не присоединяться к ним (по крайней мере, не ко всем трем), а полагаться на ленивую загрузку + кэш первого уровня hibernate.

  • То же самое может относиться к акциям

  • , если я правильно понял, есть набор индикаторов, принадлежащих каждой акции. Я не знаю, есть ли что-то вроде кластеризованной таблицы в MySQL, как в Oracle. Это может помочь, хотя может вызвать проблемы еще где.

  • Еще одна вещь, которую вы должны проверить, это частота попаданий в кеш внутри базы данных. Опять же, я не знаю mysql, но, возможно, он просто исчерпывает пространство кеша, поэтому ему приходится загружать вещи в память снова и снова. Может помочь дополнительная основная память и соответствующая конфигурация базы данных.

0 голосов
/ 03 апреля 2011

Так как здесь много операций JOIN, и вы думаете, что проблема связана с индикаторами, я советую вам попытаться удалить одно за другим каждое соединение, связанное с индикаторами:

-Удалить только join indicator_definitions:

left outer join
    indicator_definitions indicatord12_ 
        on indicators11_.definition_id=indicatord12_.id 

-Удалить только join stocks stock13_:

left outer join
    stocks stock13_ 
        on indicators11_.relative_id=stock13_.id 

-Снять оба:

left outer join
    indicator_definitions indicatord12_ 
        on indicators11_.definition_id=indicatord12_.id 
left outer join
    stocks stock13_ 
        on indicators11_.relative_id=stock13_.id 

И вопрос: все ли LEFT JOIN необходимы? Можно ли обратить некоторых к INNER JOIN с?

0 голосов
/ 03 апреля 2011

Попробуйте вместо этого указать условие WHERE в качестве условия JOIN.

Редактировать: я не знаю, сможете ли вы заставить Hibernate сделать это

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