|
|
|
Оптимизация sql запроса
|
|||
|---|---|---|---|
|
#18+
Здравствуйте. Я периодически получают статистику из базы мониторига по всем сетевым интерфесам, для того чтобы понять которые из них за всю историю ни разу не были в "апе", вот таким запросом Код: sql 1. 2. 3. 4. 5. 6. 7. если MIN(hu.value) = 2 тогда интерфейс ни разу не был в "апе" У меня такой запрос выполняется около 20 часов. Можно ли как-то оптимизировать запрос, чтобы он выполнялся быстрее(в таблице history_uint около 250 млн записей)? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.10.2014, 16:16:48 |
|
||
|
Оптимизация sql запроса
|
|||
|---|---|---|---|
|
#18+
uniken1, 1. не стесняйтесь придавать запросам читаемый вид SELECT id.hostid, MIN(hu.value) , id.key_ FROM `history_uint` AS hu JOIN ( SELECT `itemid`,`hostid`,`key_` FROM `items` where `key_` LIKE "ifOperStatus[GigabitEthernet%]" ) AS id WHERE hu.itemid = id.itemid GROUP BY hu.itemid ORDER By id.hostid, id.key_ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.10.2014, 16:32:00 |
|
||
|
Оптимизация sql запроса
|
|||
|---|---|---|---|
|
#18+
2. для оптимизации лучше разобратся по отдельности без ИНТО ФИЛЕ. 3. Можно отдельно попытатся оптимизаировать SELECT `itemid`,`hostid`,`key_` FROM `items` where `key_` LIKE "ifOperStatus[GigabitEthernet%]" 4. Можно переписать оптимизировать запрос без подселекта. 5. Для начала почитайте про, и выполните EXPLAIN для всего запроса (без ИНТО ФИЛЕ) и отдельно для подзапроса. Если сможете переписать без подселекта, дайте и его ЕХПЛАИН. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.10.2014, 16:38:16 |
|
||
|
Оптимизация sql запроса
|
|||
|---|---|---|---|
|
#18+
1) Измените LIKE на INSTR, и максимально укоротите строку поиска. 2) Сколько записей возвращает подзапрос Код: sql 1. 2. 3. Сколько записей возвращает запрос Код: sql 1. 2. 3. И сколько записей в итоговом результате. 3) Нафига нужна конечная сортировка? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.10.2014, 17:04:42 |
|
||
|
Оптимизация sql запроса
|
|||
|---|---|---|---|
|
#18+
тут сразу встаёт вопрос с точки зрения логики. есть 10000 сетевых интерфейсов... есть 10 млн записей логов. мы за 20 часов получили 100 интерфейсов с айди скажем 1,2,3 .... ,100 которые за всю историю ни разу небыли в апе. вопрос... через две недели, каковы шансы, что интерфейс с айди 200 ниразу небыл в апе за всю историю??? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.10.2014, 17:35:32 |
|
||
|
Оптимизация sql запроса
|
|||
|---|---|---|---|
|
#18+
javajdbc4. Можно переписать оптимизировать запрос без подселекта. Я не знаю как это сделать. javajdbc5. Для начала почитайте про, и выполните EXPLAIN для всего запроса (без ИНТО ФИЛЕ) и отдельно для подзапроса. Если сможете переписать без подселекта, дайте и его ЕХПЛАИН. Для подселекта можно сделать, а для полного запроса запущу, но ждать придется сутки. Код: plaintext 1. 2. 3. 4. 5. 6. 7. Akina1) Измените LIKE на INSTR, и максимально укоротите строку поиска. Попробую. Akina2) Сколько записей возвращает подзапрос Код: plaintext 1. 2. 3. 4. 5. 6. 7. AkinaСколько записей возвращает запрос Расчетно около 35 млн. записей. Akina3) Нафига нужна конечная сортировка? Это правда, сортировка тут не нужна alex564657498765453через две недели, каковы шансы, что интерфейс с айди 200 ниразу небыл в апе за всю историю??? Для этого и делается запрос с некоторой периодичностью. А на счет за всю историю, тут надо пояснить. База разбита ежедневным партиционированием. Партиции старше 30 дней удаляются. Поэтому автоматически "за всю историю"="за последние 30 дней" Из того что я сам пробовал понять что тормозит, то запрос Код: sql 1. 2. 3. Выполняется 19 часов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2014, 08:19:26 |
|
||
|
Оптимизация sql запроса
|
|||
|---|---|---|---|
|
#18+
javajdbc5. Для начала почитайте про, и выполните EXPLAIN для всего запроса А запрос быстро выполнился Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2014, 08:34:39 |
|
||
|
Оптимизация sql запроса
|
|||
|---|---|---|---|
|
#18+
uniken1, Что-то так никто и не заметил... Код: plaintext 1. Код: plaintext Т.е. группируем мы по Item, а хотим видеть Host и Key ? В нормальных вменяемых запросах выделенные куски должны совпадать . У тебя они разные. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2014, 10:30:49 |
|
||
|
Оптимизация sql запроса
|
|||
|---|---|---|---|
|
#18+
MasterZivuniken1, Что-то так никто и не заметил... Код: plaintext 1. Код: plaintext Т.е. группируем мы по Item, а хотим видеть Host и Key ? В нормальных вменяемых запросах выделенные куски должны совпадать . У тебя они разные. Не совсем понял, а что не так? В выводе результата мне не нужен параметр по которому идет группировка... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2014, 11:04:31 |
|
||
|
Оптимизация sql запроса
|
|||
|---|---|---|---|
|
#18+
uniken1а что не так? 13173672 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2014, 11:26:49 |
|
||
|
Оптимизация sql запроса
|
|||
|---|---|---|---|
|
#18+
uniken1MasterZivuniken1, Что-то так никто и не заметил... Код: plaintext 1. Код: plaintext Т.е. группируем мы по Item, а хотим видеть Host и Key ? В нормальных вменяемых запросах выделенные куски должны совпадать . У тебя они разные. Не совсем понял, а что не так? В выводе результата мне не нужен параметр по которому идет группировка... "Не так" -- логика запроса идиотская. Что он тебе будет возвращать -- совершенно не понятно. Если тебя это устраивает, можешь и дальше заниматься оптимизацией запроса, который возвращает хрень. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2014, 13:24:40 |
|
||
|
Оптимизация sql запроса
|
|||
|---|---|---|---|
|
#18+
MasterZiv"Не так" -- логика запроса идиотская. Что он тебе будет возвращать -- совершенно не понятно. Если тебя это устраивает, можешь и дальше заниматься оптимизацией запроса, который возвращает хрень. Я не понял почему. Можете объяснить на примере? Этот запрос возвращает точно правильные данные, так как я по его результатам "глазками" проверяют соответствующие порты на коммутаторах, и никогда не верных данных не было. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2014, 14:18:52 |
|
||
|
Оптимизация sql запроса
|
|||
|---|---|---|---|
|
#18+
uniken1Я не понял почему. Можете объяснить на примере? Патамучта... uniken1 Код: sql 1. 2. 3. 4. Допустим, в данных после джойна, но до групбай, есть вот такие строки hostidkey_111122 После групбай этих записей в выходном наборе будет hostid=1? это очевидно, а вот что должно, по твоему мнению, быть в key_ ? 11? 22? И, главное, почему... Думай. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2014, 14:25:23 |
|
||
|
Оптимизация sql запроса
|
|||
|---|---|---|---|
|
#18+
AkinaДумай. Думаю: У меня есть таблица history_uint AS hu из которой я хочу получить данные. В селекте я указываю поля которые мне нужны в выводе, и не указываю которые не нужны. И если я выполняю group или order на полях которые я не указал в выводе, они же никуда не деваются, выборка же идет по всей таблице hu, и не зависимо при'join'ились к этой таблице данные из другой таблицы или нет. Ваш пример мне кажется не совсем корректным, так как после join'а hu.itemid никуда не денется из промежуточной таблицы по нему нормально отрабатывает group by. Я не прав? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2014, 15:02:20 |
|
||
|
Оптимизация sql запроса
|
|||
|---|---|---|---|
|
#18+
uniken1MasterZiv"Не так" -- логика запроса идиотская. Что он тебе будет возвращать -- совершенно не понятно. Если тебя это устраивает, можешь и дальше заниматься оптимизацией запроса, который возвращает хрень. Я не понял почему. Можете объяснить на примере? Этот запрос возвращает точно правильные данные, так как я по его результатам "глазками" проверяют соответствующие порты на коммутаторах, и никогда не верных данных не было. Почти во всех нормальных СУБД (и даже в некоторых ненормальных) ЗАПРЕЩЕНО включать в список вывода (SELECT list, список полей и выражений в запросе) поля таблиц, которые не включены во фразу GROUP BY или не находятся под агрегатными функциями. И это вполне логично -- по одним полям ты группируешь, другие поля ты суммируешь, подсчитываешь и так далее. Если ты с полем не делаешь ни то, ни другое, то какое значение туда попадёт -- не понятно , потому что в разных записах значения этих полей могут быть разными. Чтобы чётко определить семантику выполнения SELECT...GROUP BY, такое запрещено, и даже, если я не ошибаюсь, в стандарте ANSI SQL. Но некоторые особо умные (в том числе и MySQL) СУБД допускают такие запросы, при этом явно декларируют, как будет работать такой запрос. В MySQL это тоже задокументировано -- для полей, не входящих в GROUP BY и AGGREGATE FUNCTION будут использоваться любые произвольные значения из имеющихся в таблице. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2014, 15:03:23 |
|
||
|
Оптимизация sql запроса
|
|||
|---|---|---|---|
|
#18+
MasterZivНо некоторые особо умные (в том числе и MySQL) СУБД допускают такие запросы, при этом явно декларируют, как будет работать такой запрос. В MySQL это тоже задокументировано -- для полей, не входящих в GROUP BY и AGGREGATE FUNCTION будут использоваться любые произвольные значения из имеющихся в таблице. http://dev.mysql.com/doc/refman/5.7/en/group-by-extensions.html ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2014, 15:04:54 |
|
||
|
Оптимизация sql запроса
|
|||
|---|---|---|---|
|
#18+
uniken1Ваш пример мне кажется не совсем корректным, так как после join'а hu.itemid никуда не денется из промежуточной таблицы по нему нормально отрабатывает group by. Я не прав? Хуже. Вы не думаете. Покажите первый десяток строк своего запроса, убрав из него MIN и GROUP BY. Убедитесь, что мой пример корректен. Ответьте на мой вопрос. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2014, 21:07:15 |
|
||
|
Оптимизация sql запроса
|
|||
|---|---|---|---|
|
#18+
вообщем вопросы к ТС 1. зачем надо select from t1 join (select from t2) вместо select from t1 join t2 2. зачем select a,c,b order by a,b >> csv вместо select a,b,c >> csv && sort csv ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2014, 12:13:48 |
|
||
|
Оптимизация sql запроса
|
|||
|---|---|---|---|
|
#18+
Я прочитал статью, теперь понял, к чему вы все это говорили, и почему в моем запросе это не влияло на результат. Но все-таки это ни как не относится а к производительности запроса. Я попробовал оставить только одну часть запроса. И такой запрос не выполнился за сутки: Код: sql 1. Explain: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. Есть какие-то варианты увеличить скорость? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.10.2014, 07:38:13 |
|
||
|
Оптимизация sql запроса
|
|||
|---|---|---|---|
|
#18+
uniken1, 11. покажите все индексы на таблице (таблицах) SHOW CREATE TABLE abc; 12. добавьте двойной индекс (itemid ,value). Отработайте идею на средней базе -- ибо на громадной базе создание индекса может быть долгим. После создания индекса сделайте еше один ЕХПЛАИН и замерьте скорость. 12. Если запрос надо гонять несколько раз, то лучше создать промежуточную таблицу с сборной статистикой по дням (или неделям). например, примерно такую: itemid, min_val, max_val, avg_val, event_count,time_start, time_end Затем каждый день добавлять только недавние агрегаты. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.10.2014, 14:55:41 |
|
||
|
Оптимизация sql запроса
|
|||
|---|---|---|---|
|
#18+
Сама база данный принадлежит мониторинговому приложению (если имеет значение то это zabbix). И можно ли что-то менять в схеме я точно не знаю. Добавление индекса не может негативно повлиять на работу в целом. Код: 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. Нет, запрос я делаю вручную, не очень часто (может раз в месяц). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.10.2014, 15:19:59 |
|
||
|
Оптимизация sql запроса
|
|||
|---|---|---|---|
|
#18+
Добавление индекса не может негативно повлиять на работу в целом? (это был вопрос)) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.10.2014, 15:24:14 |
|
||
|
Оптимизация sql запроса
|
|||
|---|---|---|---|
|
#18+
uniken1Добавление индекса не может негативно повлиять на работу в целом? (это был вопрос)) На каждый индекс система должна тратить какието дополнительные наносекунды при вставке записи. Если он сработает -- то ускорит выборку на пару-тройку порядков. Ну и само постриение может занять много времени. По запросу - у вас натурально просится сделать (пред-) агрегацию по дням. Идея в том чтоб посчитать каждый ден- ОДИН раз, сохранить и использовать только пред-агрегаты для больших запросов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.10.2014, 15:47:25 |
|
||
|
|

start [/forum/topic.php?fid=47&msg=38786736&tid=1834036]: |
0ms |
get settings: |
8ms |
get forum list: |
19ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
49ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
71ms |
get tp. blocked users: |
2ms |
| others: | 222ms |
| total: | 388ms |

| 0 / 0 |
