|
|
|
Индекс во вложенных запросах
|
|||
|---|---|---|---|
|
#18+
Забыл добавить, в MS SQL 2008 этот же запрос выполняется на этих же данных за секунды ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.10.2015, 23:53:16 |
|
||
|
Индекс во вложенных запросах
|
|||
|---|---|---|---|
|
#18+
Вот ведь, так старался, что запутался) Доброго времени суток, форумчане) Помогите с запросом, пожалуйста. Есть таблица Cross содержащая более 50 миллионов записей Структура у нее такая: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. И есть вот такой запрос: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. И этот вот самый запрос мало того что выполняется порядка минуты, так еще и процессор на серваке сжирает на время выполнения. План выполнения запроса показал, что вложенные запросы Level1_11, Level1_12, Level1_21, Level1_22 выполняются без использования индексов. Т.е. перебираются все 50 миллионов записей. Собственно вот результат: idselect_typetabletypepossible_keyskeykey_lenrefrowsExtra1PRIMARY<derived2>ALLNULLNULLNULLNULL19385Using temporary2DERIVED<derived3>ALLNULLNULLNULLNULL106913DERIVED<derived4>ALLNULLNULLNULLNULL423DERIVEDLevel2_11refIX_do_search_art_syn_Art,IX_do_search_art_syn_Mfc,IX_do_search_art_syn_ArtMfcIX_do_search_art_syn_ArtMfc104CrossL_11.ArtCanonical,CrossL_11.MfcNameCanonical54DERIVEDLevel1_11ALLNULLNULLNULLNULL53942279Using where5UNCACHEABLE UNION<derived6>ALLNULLNULLNULLNULL425UNCACHEABLE UNIONLevel2_12refIX_do_search_art_syn_ArtCan,IX_do_search_art_syn_MfcCab,IX_do_search_art_syn_ArtMfcCanIX_do_search_art_syn_ArtMfcCan104CrossR_11.ArtCanonical,CrossR_11.MfcNameCanonical106DERIVEDLevel1_12ALLNULLNULLNULLNULL53942279Using whereNULLUNION RESULT<union3,5>ALLNULLNULLNULLNULLNULL7UNCACHEABLE UNION<derived8>ALLNULLNULLNULLNULL86948DERIVED<derived9>ALLNULLNULLNULLNULL1538DERIVEDLevel2_21refIX_do_search_art_syn_Art,IX_do_search_art_syn_Mfc,IX_do_search_art_syn_ArtMfcIX_do_search_art_syn_ArtMfc104CrossL_21.Art,CrossL_21.MfcName59DERIVEDLevel1_21ALLNULLNULLNULLNULL53942279Using where10UNCACHEABLE UNION<derived11>ALLNULLNULLNULLNULL15310UNCACHEABLE UNIONLevel2_22refIX_do_search_art_syn_ArtCan,IX_do_search_art_syn_MfcCab,IX_do_search_art_syn_ArtMfcCanIX_do_search_art_syn_ArtMfcCan104CrossR_21.Art,CrossR_21.MfcName1011DERIVEDLevel1_22ALLNULLNULLNULLNULL53942279Using whereNULLUNION RESULT<union8,10>ALLNULLNULLNULLNULLNULLNULLUNION RESULT<union2,7>ALLNULLNULLNULLNULLNULL А теперь вопрос. Почему не используются индексы в вложенных запросах и как можно исправить ситуацию? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.10.2015, 23:55:14 |
|
||
|
Индекс во вложенных запросах
|
|||
|---|---|---|---|
|
#18+
pitnn, попробуйте повторить без использования @art, @br. просто подставьте текстовые значения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.10.2015, 00:23:19 |
|
||
|
Индекс во вложенных запросах
|
|||
|---|---|---|---|
|
#18+
javajdbc, Это ничего не даст. Переменные позже появились, изначально были текстовые значения, но неудобно было их менять каждый раз, поэтому вывел в переменные. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.10.2015, 00:27:58 |
|
||
|
Индекс во вложенных запросах
|
|||
|---|---|---|---|
|
#18+
pitnn Код: sql 1. 2. Это как? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.10.2015, 00:40:13 |
|
||
|
Индекс во вложенных запросах
|
|||
|---|---|---|---|
|
#18+
pitnn, ...ну к чему ломатся как красна девица... ...проверить to 3 секунды... ...вообше что-то действительно не то... оптимизатор не видит даже POSSIBLE KEYS... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.10.2015, 00:52:17 |
|
||
|
Индекс во вложенных запросах
|
|||
|---|---|---|---|
|
#18+
javajdbc..вообше что-то действительно не то... оптимизатор не видит даже POSSIBLE KEYS...+1 интересно, он не видит их только внутри большого запроса? pitnn, если проexplainить отдельно какой-нибудь из подзапросов, ключи видно? ...кстати, индекс (art,mfcname,artcanonical,mfcnamecanonical) мог бы использоваться как покрывающий, если ничего не путаю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.10.2015, 06:11:15 |
|
||
|
Индекс во вложенных запросах
|
|||
|---|---|---|---|
|
#18+
miksoft, Это я смотрел как работает отдельно вложенный запрос, забыл удалить просто ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.10.2015, 08:55:24 |
|
||
|
Индекс во вложенных запросах
|
|||
|---|---|---|---|
|
#18+
javajdbcpitnn, ...ну к чему ломатся как красна девица... ...проверить to 3 секунды... ...вообше что-то действительно не то... оптимизатор не видит даже POSSIBLE KEYS... Ахалай-махалай, действительно, подставил вместо переменных значения и ситуация резко улучшилась. Результат Explain-а: idselect_typetabletypepossible_keyskeykey_lenrefrowsExtra1PRIMARY<derived2>ALLNULLNULLNULLNULL19385Using temporary2DERIVED<derived3>ALLNULLNULLNULLNULL106913DERIVED<derived4>ALLNULLNULLNULLNULL423DERIVEDLevel2_11refIX_do_search_art_syn_Art,IX_do_search_art_syn_Mfc,IX_do_search_art_syn_ArtMfcIX_do_search_art_syn_ArtMfc104CrossL_11.ArtCanonical,CrossL_11.MfcNameCanonical54DERIVEDLevel1_11refIX_do_search_art_syn_Art,IX_do_search_art_syn_Mfc,IX_do_search_art_syn_ArtMfcIX_do_search_art_syn_ArtMfc10432Using where5UNION<derived6>ALLNULLNULLNULLNULL425UNIONLevel2_12refIX_do_search_art_syn_ArtCan,IX_do_search_art_syn_MfcCab,IX_do_search_art_syn_ArtMfcCanIX_do_search_art_syn_ArtMfcCan104CrossR_11.ArtCanonical,CrossR_11.MfcNameCanonical106DERIVEDLevel1_12refIX_do_search_art_syn_Art,IX_do_search_art_syn_Mfc,IX_do_search_art_syn_ArtMfcIX_do_search_art_syn_ArtMfc10432Using whereNULLUNION RESULT<union3,5>ALLNULLNULLNULLNULLNULL7UNION<derived8>ALLNULLNULLNULLNULL86948DERIVED<derived9>ALLNULLNULLNULLNULL1538DERIVEDLevel2_21refIX_do_search_art_syn_Art,IX_do_search_art_syn_Mfc,IX_do_search_art_syn_ArtMfcIX_do_search_art_syn_ArtMfc104CrossL_21.Art,CrossL_21.MfcName59DERIVEDLevel1_21refIX_do_search_art_syn_ArtCan,IX_do_search_art_syn_MfcCab,IX_do_search_art_syn_ArtMfcCanIX_do_search_art_syn_ArtMfcCan10498Using where10UNION<derived11>ALLNULLNULLNULLNULL15310UNIONLevel2_22refIX_do_search_art_syn_ArtCan,IX_do_search_art_syn_MfcCab,IX_do_search_art_syn_ArtMfcCanIX_do_search_art_syn_ArtMfcCan104CrossR_21.Art,CrossR_21.MfcName1011DERIVEDLevel1_22refIX_do_search_art_syn_ArtCan,IX_do_search_art_syn_MfcCab,IX_do_search_art_syn_ArtMfcCanIX_do_search_art_syn_ArtMfcCan10498Using whereNULLUNION RESULT<union8,10>ALLNULLNULLNULLNULLNULLNULLUNION RESULT<union2,7>ALLNULLNULLNULLNULLNULL У меня такие предположения на этот счет: когда добавлялся основной объем данных в таблицу индексы не обновились (интересно, могло такое быть?). Вчера удалил все индексы и создал их заново и стало лучше. По большому счету тему можно закрывать, но буду рад каким-либо рекомендациям относительно оптимизации данного запроса) Всем спасибо за участие. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.10.2015, 09:46:05 |
|
||
|
Индекс во вложенных запросах
|
|||
|---|---|---|---|
|
#18+
pitnnВчера удалил все индексы и создал их заново и стало лучше.Если уверены, что не показалось, то в будущем имеет смысл периодически выполнять команду OPTIMIZE TABLE для всех таблиц. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.10.2015, 09:55:42 |
|
||
|
Индекс во вложенных запросах
|
|||
|---|---|---|---|
|
#18+
pitnnУ меня такие предположения на этот счет: когда добавлялся основной объем данных в таблицу индексы не обновились (интересно, могло такое быть?).Статистика могла криво собраться, иногда такое бывает. К сожалению, не лечится в принципе ничем кроме её пересбора (analyze table, и не факт, что в очередной раз соберётся правильно). Ну или явного указания индексов в хинтах. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.10.2015, 10:37:27 |
|
||
|
Индекс во вложенных запросах
|
|||
|---|---|---|---|
|
#18+
А в целом как вы оцениваете запрос, насколько корректно он составлен? Я хотел было вынести вложенные запросы во временные таблицы, чтобы не четыре раза вызывался, а два. Но что-то у меня не сложилось с временными таблицами. Не на столько я знаток мускульных запросов, я больше по 1С) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.10.2015, 10:52:58 |
|
||
|
Индекс во вложенных запросах
|
|||
|---|---|---|---|
|
#18+
pitnnЯ хотел было вынести вложенные запросы во временные таблицы, чтобы не четыре раза вызывался, а дваНу, записей там немного выбирается, причём индекс используется, да и друг с другом они не джойнятся, так что смысла имхо в этом нет. pitnnА в целом как вы оцениваете запрос, насколько корректно он составлен?Запрос может быть составлен либо корректно, т.е. выдавать верные данные, либо некорректно, т.е. выдавать неверные. Соответственно корректность запроса могут оценивать только те, кто знает, что он должен выдавать, а мы этого не знаем :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.10.2015, 11:40:07 |
|
||
|
Индекс во вложенных запросах
|
|||
|---|---|---|---|
|
#18+
pitnnАЗапрос может быть составлен либо корректно, т.е. выдавать верные данные, либо некорректно, т.е. выдавать неверные. Соответственно корректность запроса могут оценивать только те, кто знает, что он должен выдавать, а мы этого не знаем :) С точки зрения выдачи результата, да согласен) Я имел ввиду корректность с точки зрения построителя. Можно запрос составить криво и он будет выполняться долго, а можно составить оптимально и он будет выполняться быстро при одинаковых результатах ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.10.2015, 13:24:49 |
|
||
|
Индекс во вложенных запросах
|
|||
|---|---|---|---|
|
#18+
pitnn Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. А теперь вопрос. Почему не используются индексы в вложенных запросах и как можно исправить ситуацию? Я лично запрос ниасилил. Куча подзапросов, куча UNION ALL, чтобы потом гордо написать DISTINCT... Левелы какие-то ... Херь какая-то. Перепиши это всё без финального DISTINCT, без подзапросов во FROM и желательно не повторяя 4 раза одинаковый или почти одинаковый (под)запрос. Думай башкой, а не чем другим. Если сделаешь, я полагаю, всё будет ОК. нужные индексы у тебя есть (индексы лишние я бы на твоём месте почикал) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.10.2015, 13:51:24 |
|
||
|
Индекс во вложенных запросах
|
|||
|---|---|---|---|
|
#18+
MasterZiv, запрос составлен оптимально для перебора (на данной структуре) всех возможных связок (до третьего колена) начиная с двух входных позиций (Имя и ИмяКаноникал). Визуально упрошение возможно если использовать OR, но это, скорее всего, исключит поиск по индексам. Возможно имеет смысл создать большую универсальную таблицу связок со всеми возможными линками (до заданого колена/вложености). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.10.2015, 14:18:55 |
|
||
|
Индекс во вложенных запросах
|
|||
|---|---|---|---|
|
#18+
запрос составлен оптимально для перебора (на данной структуре) всех возможных связок (до третьего колена) начиная с двух входных позиций (Имя и ИмяКаноникал). Сомневаюсь. Визуально упрошение возможно если использовать OR, но это, скорее всего, исключит поиск по индексам. Отнюдь. (в смысле -- не исключит) Возможно имеет смысл создать большую универсальную таблицу связок со всеми возможными линками Хорошая мысль, правильная. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.10.2015, 15:24:58 |
|
||
|
Индекс во вложенных запросах
|
|||
|---|---|---|---|
|
#18+
MasterZivзапрос составлен оптимально для перебора (на данной структуре) всех возможных связок (до третьего колена) начиная с двух входных позиций (Имя и ИмяКаноникал). Сомневаюсь. Визуально упрошение возможно если использовать OR, но это, скорее всего, исключит поиск по индексам. Отнюдь. (в смысле -- не исключит) Возможно имеет смысл создать большую универсальную таблицу связок со всеми возможными линками Хорошая мысль, правильная. >> Сомневаюсь. Сомневатся полезно. но в какой-то момент следует проверить самому... >> Отнюдь. (в смысле -- не исключит) При Сталине такого не было! (С). OR не дружил с индексами до послдних несколько лет... вроде только недавно подружился... мы не знаем весию ТСа. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.10.2015, 18:21:23 |
|
||
|
|

start [/forum/topic.php?fid=47&msg=39090780&tid=1832560]: |
0ms |
get settings: |
4ms |
get forum list: |
14ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
40ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
40ms |
get tp. blocked users: |
1ms |
| others: | 194ms |
| total: | 307ms |

| 0 / 0 |
