|
|
|
Медленно работает запрос.
|
|||
|---|---|---|---|
|
#18+
MasterZiv, как бы надо определиться. Если запрос Код: sql 1. 2. 3. возвращает эти 23 000 записей, то собственно далее уже копать некуда. Индекс по VisitIn используется, JOIN-ы тоже по индексам. А далее проблема только в большом кол-ве записей. Быстрее их не прочитаешь. (чтобы увидеть реальную скорость их чтения, рекомендую запрос выполнять в утилите mysql). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2013, 19:05:02 |
|
||
|
Медленно работает запрос.
|
|||
|---|---|---|---|
|
#18+
ScareCrow, 23 тысячи - это находили все клиенты во всех 30 филиалах за месяц. А мне надо выбрать сколько находил один человек за месяц в этих самых филиалах и какие на него были расходы. Вот и получается 57 записей. Просто с их мягко выражаясь дурацкой системой, этот человек в разных филиалах имеет разные ClientID, и определяется он по TRPID. Поэтому в WHERE у меня стоит C.TRPID ='70010'. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2013, 22:04:39 |
|
||
|
Медленно работает запрос.
|
|||
|---|---|---|---|
|
#18+
Может, тогда стоит попробовать секционированные таблицы [ http://dev.mysql.com/doc/refman/5.1/en/partitioning-overview.html ]. Конечно, _нужные_ данные он всё равно будет поднимать с диска, а вот _ненужные_ сможет пропускать секциями... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2013, 22:05:34 |
|
||
|
Медленно работает запрос.
|
|||
|---|---|---|---|
|
#18+
KorniПоэтому в WHERE у меня стоит C.TRPID ='70010'.Ну так уберите лишние LEFT-ы. Тогда MySQL сможет эффективно использовать это условие для фильтра, если по нему индекс есть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2013, 22:07:11 |
|
||
|
Медленно работает запрос.
|
|||
|---|---|---|---|
|
#18+
BagaBagaМожет, тогда стоит попробовать секционированные таблицы [ http://dev.mysql.com/doc/refman/5.1/en/partitioning-overview.html ]. Конечно, _нужные_ данные он всё равно будет поднимать с диска, а вот _ненужные_ сможет пропускать секциями...Не смешите, с такими копеечными данными никакие секции не нужны. Было бы порядков на несколько побольше, тогда - да, можно было бы подумать на эту тему... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2013, 22:08:48 |
|
||
|
Медленно работает запрос.
|
|||
|---|---|---|---|
|
#18+
MasterZiv, MasterZivНе лучше. У вас фильтр по визитам. но у меня же есть и фильтр по клиентам TRPID = 70010? или я чего-то уж совсем не понимаю? Может я изначально неправильно запрос писала. Мне надо сделать выборку всех посещений и расходов, если таковые были при посещении, клиентов с заданным значением TRPID за заданный период времени. Наиболее часто этот период времени равен одному месяцу. Я так понимаю при таком раскладе я все равно упираюсь в 23000 записей. Если оптимизатор сам разруливает из чего лучше сначала выбирать из клиентов или визитов. MasterZiv(чтобы увидеть реальную скорость их чтения, рекомендую запрос выполнять в утилите mysql). а что за утилита такая? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2013, 22:14:59 |
|
||
|
Медленно работает запрос.
|
|||
|---|---|---|---|
|
#18+
miksoft, тогда не понятно, откуда 40 сек. Точнее - понятно (explain видел) , что этот запрос нужно переписывать (а то генерится гиганстская выборка). Но без схемы и понятия "что требуется" гадать на кофейной гуще я не берусь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2013, 22:15:16 |
|
||
|
Медленно работает запрос.
|
|||
|---|---|---|---|
|
#18+
miksoftKorniПоэтому в WHERE у меня стоит C.TRPID ='70010'.Ну так уберите лишние LEFT-ы. Тогда MySQL сможет эффективно использовать это условие для фильтра, если по нему индекс есть. Объясните тупой, а какие лефты лишние. Сейчас запрос выглядит так Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. С Branches я так понимаю тоже можно просто сделать JOIN. Да даже и не суть, можно и без него обойтись. Не думаю, что он уж очень тормозит процесс. А что вы подразумеваете под копеечными данными - это 23 000 после фильтра или что-то иное? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2013, 22:22:59 |
|
||
|
Медленно работает запрос.
|
|||
|---|---|---|---|
|
#18+
Про скобки тоже уже говорили... Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. Попробуйте так. Если опять много - показывайте план и имеющиеся индексы (а лучше структуру таблиц целиком). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2013, 22:30:47 |
|
||
|
Медленно работает запрос.
|
|||
|---|---|---|---|
|
#18+
Еще разок продублирую последний запрос, для удобства чтения. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. И сама задача Мне надо сделать выборку всех посещений Visits и расходов ClientsMarketingExp, если таковые были при посещении, клиентов с заданным значением TRPID (по сути это один клиент, только в разных филиалах он зарегистрирован по разному) за заданный период времени. Наиболее часто этот период времени равен одному месяцу. Филиалы работают off-line и потом просто скидывают часть данных на MySQL сервер для последующей обработки ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2013, 22:32:14 |
|
||
|
Медленно работает запрос.
|
|||
|---|---|---|---|
|
#18+
miksoft, спасибо, завтра попробую и доложусь о результатах ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2013, 22:33:41 |
|
||
|
Медленно работает запрос.
|
|||
|---|---|---|---|
|
#18+
Kornimiksoft, спасибо, завтра попробую и доложусь о результатахТолько, на всякий случай, возьмите мою версию запроса. Хотя по идее, разницы быть не должно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2013, 22:36:51 |
|
||
|
Медленно работает запрос.
|
|||
|---|---|---|---|
|
#18+
KorniScareCrow, 23 тысячи - это находили все клиенты во всех 30 филиалах за месяц. А мне надо выбрать сколько находил один человек за месяц в этих самых филиалах и какие на него были расходы. Вот и получается 57 записей. Просто с их мягко выражаясь дурацкой системой, этот человек в разных филиалах имеет разные ClientID, и определяется он по TRPID. Поэтому в WHERE у меня стоит C.TRPID ='70010'. обожаю когда люди вместо ответа на прямой и конкретный вопрос разговаривают с голосами в голове. повторяю вопрос - чем отфильтровывется еще 22943 записи? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2013, 23:09:59 |
|
||
|
Медленно работает запрос.
|
|||
|---|---|---|---|
|
#18+
BagaBagaМожет, тогда стоит попробовать секционированные таблицы [ http://dev.mysql.com/doc/refman/5.1/en/partitioning-overview.html ]. Конечно, _нужные_ данные он всё равно будет поднимать с диска, а вот _ненужные_ сможет пропускать секциями... Ты издиваешься что ли ? Зачем ей при таких мизерных объёмах партицирование ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2013, 23:32:05 |
|
||
|
Медленно работает запрос.
|
|||
|---|---|---|---|
|
#18+
KorniMasterZiv, MasterZivНе лучше. У вас фильтр по визитам. но у меня же есть и фильтр по клиентам TRPID = 70010? или я чего-то уж совсем не понимаю? Он из другой таблицы. И тогда индекс нужен составной, по VisitIn и клиенту (TRPID). KorniМожет я изначально неправильно запрос писала. Мне надо сделать выборку всех посещений и расходов, если таковые были при посещении, клиентов с заданным значением TRPID за заданный период времени. Наиболее часто этот период времени равен одному месяцу. Я так понимаю при таком раскладе я все равно упираюсь в 23000 записей. Если оптимизатор сам разруливает из чего лучше сначала выбирать из клиентов или визитов. MasterZiv(чтобы увидеть реальную скорость их чтения, рекомендую запрос выполнять в утилите mysql). а что за утилита такая? Тут проблема в том, что условие размазано по двум таблицам. Но может и можно свести в одну. я погляжу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2013, 23:35:53 |
|
||
|
Медленно работает запрос.
|
|||
|---|---|---|---|
|
#18+
Korni, вот глядите, ваш запрос без волнующих подробностей: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. Условие C.TRPID ='70010' and V.VisitIn BETWEEN '2013-10-01' AND '2013-10-30' вместе селективно, отбирает мало записей. А по отдельности они C.TRPID ='70010' и V.VisitIn BETWEEN '2013-10-01' AND '2013-10-30' -- малоселективны. Это типичный случай, как я её называю, распределённой селективности. Термин конечно дурацкий, но суть в том, что СУБД приходится обрабатывать много записей, чтобы почти все отсеить и получить на выходе мало. Были бы эти поля в одной таблице -- можно было бы построить составной индекс , и запрос бы летал. а в таком виде: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. надо строить индекс в Visits по (VisitIn, ClientID, BranchID) тогда если по условию C.TRPID ='70010' отбирается одна запись, есть шанс, что тоже будет быстро. Можно для надёжности переписать FROM немного ( если оптимизатор сам не догадается протолкнуть таблицу Clients C наверх) : (но это не обязательно и не гарантирует успешний план) Код: sql 1. 2. 3. 4. У вас кстати V.BranchID<>1 и JOIN Clients C ON V.ClientID=C.ClientID AND V.BranchID=C.BranchID Так что можно сразу это условие написать на таблицу Clients, С.BranchID<>1 (оптимизатор по идее может и сам догадаться, но запрос-то тоже логичным должен быть) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2013, 23:48:35 |
|
||
|
Медленно работает запрос.
|
|||
|---|---|---|---|
|
#18+
ScareCrowKorniScareCrow, 23 тысячи - это находили все клиенты во всех 30 филиалах за месяц. А мне надо выбрать сколько находил один человек за месяц в этих самых филиалах и какие на него были расходы. Вот и получается 57 записей. Просто с их мягко выражаясь дурацкой системой, этот человек в разных филиалах имеет разные ClientID, и определяется он по TRPID. Поэтому в WHERE у меня стоит C.TRPID ='70010'. обожаю когда люди вместо ответа на прямой и конкретный вопрос разговаривают с голосами в голове. повторяю вопрос - чем отфильтровывется еще 22943 записи? По-моему уже было ясно, что условием C.TRPID ='70010' и последующим условием V.ClientID=C.ClientID AND V.BranchID=C.BranchID Если нет, пусть топикстартер скажет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2013, 23:50:34 |
|
||
|
Медленно работает запрос.
|
|||
|---|---|---|---|
|
#18+
MasterZivBagaBagaМожет, тогда стоит попробовать секционированные таблицы [ http://dev.mysql.com/doc/refman/5.1/en/partitioning-overview.html ]. Конечно, _нужные_ данные он всё равно будет поднимать с диска, а вот _ненужные_ сможет пропускать секциями... Ты издиваешься что ли ? Зачем ей при таких мизерных объёмах партицирование ? Ни в коем случае. Тогда точно можно не гадать, "а был ли мальчик" а есть ли индекс. Хотя и из пушки по воробьям. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.11.2013, 09:31:50 |
|
||
|
Медленно работает запрос.
|
|||
|---|---|---|---|
|
#18+
BagaBagaТогда точно можно не гадать, "а был ли мальчик" а есть ли индексСоздать индекс будет наверняка быстрее, чем долбать партиции. И гадать тоже не нужно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.11.2013, 11:05:45 |
|
||
|
Медленно работает запрос.
|
|||
|---|---|---|---|
|
#18+
MasterZivScareCrowпропущено... обожаю когда люди вместо ответа на прямой и конкретный вопрос разговаривают с голосами в голове. повторяю вопрос - чем отфильтровывется еще 22943 записи? По-моему уже было ясно, что условием C.TRPID ='70010' и последующим условием V.ClientID=C.ClientID AND V.BranchID=C.BranchID Если нет, пусть топикстартер скажет. Да-да, MasterZiv прав, именно этим условием и отсеивается. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.11.2013, 12:11:44 |
|
||
|
Медленно работает запрос.
|
|||
|---|---|---|---|
|
#18+
MasterZiv, перепробовала я сегодня все варианты. Меняла визиты с клиентами местами, и переносила условие V.BranchID<>1 в условие джойна. меняла его на С.BranchID<>1, т.к. по сути это одно и тоже (мне надо отсеять визиты клиента из его основного филиала). Результат тот же 40 секунд +- 2 секунды. Индекс по VisitIN_ClientID_BranchID тоже создала. На скорость работы не повлияло. Вы писали, что если по условию C.TRPID ='70010' отбирается одна запись, то это может помочь. Но там отбирается 13 записей. Правда это самый запущенный случай. Обычно это 2-3 записи. Видимо поэтому индекс не помог. Может на скорость влиять старость и дряблость моего компьютера, все-таки 2 GHz, это даже не вчерашний день :( ? Попробую, что у клиента получится в результате всех улучшений. Правда, там тоже свои подводные камни :( Я так понимаю следующим шагом мне надо создать в таблице визитов поле TRPID, но при этом в таблице клиентов оно тоже сохраняется. И тогда в запросе у меня отсеется таблица клиентов. Плюс создать индекс по полям VisitIN, TRPID, BranchID. Тогда скорость должна еще повысится. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.11.2013, 12:39:05 |
|
||
|
Медленно работает запрос.
|
|||
|---|---|---|---|
|
#18+
miksoftЕсли опять много - показывайте план и имеющиеся индексы (а лучше структуру таблиц целиком). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.11.2013, 12:47:44 |
|
||
|
Медленно работает запрос.
|
|||
|---|---|---|---|
|
#18+
miksoft, вот explain моего запроса запрос имеет вид Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. структура таблиц Код: 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. 84. 85. 86. 87. 88. 89. 90. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.11.2013, 13:09:48 |
|
||
|
Медленно работает запрос.
|
|||
|---|---|---|---|
|
#18+
Korni, Попробуйте добавить индекс `clients` (`TRPID`). После этого сделайте ANALYZE TABLE `clients` и проверьте работу запроса еще раз. Если опять плохо - опять показывайте план. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.11.2013, 13:21:23 |
|
||
|
Медленно работает запрос.
|
|||
|---|---|---|---|
|
#18+
miksoft, все сделала, результат 12 секунд!!! вот план, он изменился Теперь на первое место вышла таблица клиентов. В общем-то по логике так и должно было быть. И из таблицы визитов обрабатывается на порядок меньше записей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.11.2013, 13:44:55 |
|
||
|
|

start [/forum/topic.php?fid=47&msg=38470573&tid=1835687]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
54ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
61ms |
get tp. blocked users: |
1ms |
| others: | 218ms |
| total: | 376ms |

| 0 / 0 |
