|
|
|
Помогите оптимизировать GROUP BY
|
|||
|---|---|---|---|
|
#18+
Есть TableA (field1, field2, field3) ~1000 записей и TableB (field1, field2, field4, field5, field6) ~ 1000000 записей. Все поля типа varchar. В TableA Primary Index field1 + field2. В TableB ниодна из комбинаций полей не является уникальной, т.е. присутствуют дубликаты строк. Есть запрос с группировкой, который выполняется около 10 часов из-за using temporary. Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. Как можно оптимизировать сам запрос добавлением индексов или ключей? Структуру таблиц или логику самого запроса поменять не предстваляется возможным. Моей первой идеей было добавить индекс для TableB (field1, field2, field4, field5) и изменить запрос на Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. К сожалению, анализатор этот индекс использовать не стал. Результат Explain: Код: plsql 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.05.2015, 18:07:42 |
|
||
|
Помогите оптимизировать GROUP BY
|
|||
|---|---|---|---|
|
#18+
mephМоей первой идеей было добавить индекс для TableB (field1, field2, field4, field5) Достаточно индекса TableB (field1, field2) - он сможет использоваться при связывании. mephизменить запрос на Тогда уж и таблицы во WHERE поменяй местами. mephВсе поля типа varchar. ... Код: plsql 1. 2. 3. 4. 5. Ага... сумма по варчарам - это не только сильно, но и умно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.05.2015, 18:19:23 |
|
||
|
Помогите оптимизировать GROUP BY
|
|||
|---|---|---|---|
|
#18+
AkinaДостаточно индекса TableB (field1, field2) - он сможет использоваться при связывании. Спасибо за совет, это вполне разумно, и работает мгновенно, если нет группировки. Результат Explain улучшился, теперь для TableB используется индекс field1, field2 и значение rows упало до 338. Однако итоговое 216*338 довольно велико и Copying To Tmp Table по-прежнему занимает довольно много времени. Мне кажется, что единственным вариантом ускорить этот запрос, является изменение логики или создание промежуточной таблицы. AkinaТогда уж и таблицы во WHERE поменяй местами. В смысле в JOIN, тут же нет WHERE ? Я пробовал и это, но оптимизатор сам решает, какую из таблиц использовать первой. AkinaАга... сумма по варчарам - это не только сильно, но и умно. Извините, конечно сам запрос немного сложнее, я привел его немного к более читаемому виду и забыл отредактировать эту часть. Давайте жить дружно ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.05.2015, 19:30:11 |
|
||
|
Помогите оптимизировать GROUP BY
|
|||
|---|---|---|---|
|
#18+
meph, попробуйте сделать ОТДЕЛЬНЫЕ селекты в обоих таблицас с груб БУ по фиелд1,фиелд2 а потом джоините результат, типа: селецкт Ф1, Ф2, СУМ(СФ3), Ф4, Ф5, СУМ(СФ6) Фром ( селецт Ф1, Ф2, сум(Ф3) СФ3 фром Т1 гроуп бу Ф1, Ф2 ) А1 Жоин в натуре! (селецт Ф1, Ф2,Ф4, Ф5, СФ6 Фром Т2 гроуп бы Т2.Ф1, Т2.Ф2) А2 гроуп бы Ф1, Ф2, Ф4, Ф5 вообше мне чтото не нравится СУМ(СФ3)... надо бы проверить правильность расчетов.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2015, 05:40:32 |
|
||
|
|

start [/forum/topic.php?fid=47&fpage=136&tid=1833148]: |
0ms |
get settings: |
7ms |
get forum list: |
17ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
30ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
39ms |
get tp. blocked users: |
2ms |
| others: | 195ms |
| total: | 306ms |

| 0 / 0 |
