|
|
|
Еще раз про оптимизацию like запросов
|
|||
|---|---|---|---|
|
#18+
Всем добрый вечер. В нашей системе очень часто встречаются места, когда поиск в запросе ведётся с оператором like по большим таблицам. К примеру есть вот такой подзапрос Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. План запроса просто ужасен: Код: plsql 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. Проблема, как видно в том, что оптимизатор считает, что раз у нас есть лайк - будет много записей. например по индексу AK_G_ACCBLN_CODE - 234999 записей Но я точно знаю, что в большинстве случаев, на которые и хотелось расчитывать записей по индексу будет около 1 Делал вот такое извращение, которое помогает сделать более менее адекватный план Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. Как видим - за счёт хинта мы получаем в костах и Rows заметно меньшее количество записей и план очень похож на реальный, и в принципе устраивает за исключением одного момента, который хотелось бы поправить: Код: plsql 1. Собственно вопросы: 1. Можно ли как-то указать оптимизатору, что именно по этому самому индексу AK_G_ACCBLN_CODE и будет всего 1 запись? 2. Есть ли какие-то менее варварские способы указать оптимизатору, что лайк - это скорее оператор "=", нежели диапазон ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.03.2017, 22:04 |
|
||
|
Еще раз про оптимизацию like запросов
|
|||
|---|---|---|---|
|
#18+
feagor, _like_with_bind_as_equality ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.03.2017, 22:36 |
|
||
|
Еще раз про оптимизацию like запросов
|
|||
|---|---|---|---|
|
#18+
feagor1. Можно ли как-то указать оптимизатору, что именно по этому самому индексу AK_G_ACCBLN_CODE и будет всего 1 запись? OPT_ESTIMATE feagor2. Есть ли какие-то менее варварские способы указать оптимизатору, что лайк - это скорее оператор "=", нежели диапазонЕсть более варварский путь - сделать свою UDF + associate statistics. Estimated rows у тебя будут красивые только работать будет долго из-за переключений контекста для UDF. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.03.2017, 22:48 |
|
||
|
Еще раз про оптимизацию like запросов
|
|||
|---|---|---|---|
|
#18+
feagor, А создать подходящий индекс, чтобы можно было обойтись без like , не вариант? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.03.2017, 10:48 |
|
||
|
Еще раз про оптимизацию like запросов
|
|||
|---|---|---|---|
|
#18+
inse, Только domain index. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.03.2017, 13:00 |
|
||
|
Еще раз про оптимизацию like запросов
|
|||
|---|---|---|---|
|
#18+
dbms_photoshop, Я подумал в другом направлении. Наверняка поле ORIGINACC составное. Следует разбить его, либо добавлением столбца, либо использовать function based index. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.03.2017, 13:37 |
|
||
|
Еще раз про оптимизацию like запросов
|
|||
|---|---|---|---|
|
#18+
inse, Когда думаешь - не стесняйся пробовать. Так приходит опыт и понимание, какие идеи работают а какие нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.03.2017, 13:51 |
|
||
|
Еще раз про оптимизацию like запросов
|
|||
|---|---|---|---|
|
#18+
dbms_photoshop, И что тут пробовать. Подобные запросы явный признак ошибки при проектировании базы данных. Если есть потребность поиска данных по определенным критериям, предусмотри это при проектирование структуры бд. С function based index обычно предпочитаю не связываться, но в крайних случаях вполне рабочий вариант. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.03.2017, 14:05 |
|
||
|
Еще раз про оптимизацию like запросов
|
|||
|---|---|---|---|
|
#18+
inseС function based index обычно предпочитаю не связываться, но в крайних случаях вполне рабочий вариант.Ну давай уж продемонстрируй для случая ТС, проектировщик. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.03.2017, 14:12 |
|
||
|
Еще раз про оптимизацию like запросов
|
|||
|---|---|---|---|
|
#18+
dbms_photoshopfeagor1. Можно ли как-то указать оптимизатору, что именно по этому самому индексу AK_G_ACCBLN_CODE и будет всего 1 запись? OPT_ESTIMATE feagor2. Есть ли какие-то менее варварские способы указать оптимизатору, что лайк - это скорее оператор "=", нежели диапазонЕсть более варварский путь - сделать свою UDF + associate statistics. Estimated rows у тебя будут красивые только работать будет долго из-за переключений контекста для UDF. Код: plsql 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. Красота:) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.03.2017, 15:38 |
|
||
|
|

start [/forum/topic.php?fid=52&fpage=173&tid=1886342]: |
0ms |
get settings: |
9ms |
get forum list: |
9ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
80ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
27ms |
get tp. blocked users: |
1ms |
| others: | 268ms |
| total: | 407ms |

| 0 / 0 |
