|
Оптимизировать соединение
|
|||
---|---|---|---|
#18+
Есть такая таблица: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17.
В таблице перечислены MAC-адреса и группы MAC-адресов. Для групп задается LEN, который определяет количество бит, принадлежащих группе (в основном там 24). Мне нужно для индивидуальных MAC-адресов определить группу, к которой они принадлежат. В лоб это делается так: Код: plsql 1. 2. 3. 4. 5.
Но выполняется такой запрос неторопливо, что неудивительно. Такой запрос выполняется в несколько раз быстрее: Код: plsql 1. 2. 3. 4. 5.
Можно ли оптимизировать еще больше? Сейчас в таблице примерно 35к записей, из них примерно 40 записей-хостов (LEN is null), но запрос выполняется почти 300мс. Мне кажется, что для индексированной таблицы с числовыми столбцами это долго. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.04.2019, 01:00 |
|
Оптимизировать соединение
|
|||
---|---|---|---|
#18+
С соединениями мне кажется лучше уже не сделать, по крайней мере мне в голову ничего не приходит. Разве что power заменить на заранее вычисленные числа. Но теперь хочу спросить совет по хранению. Например есть такой блок MAC-адресов (префикс), выделенный для Ауди: 70-B3-D5-01-Bx-xx. В числовом виде это значение 123917675114496 с длиной маски 36 бит. Если его хранить в символьном виде VARCHAR2, то оно соответствует "70B3D501B000/36". Таблица в примере хранит адреса именно так, в столбце VARCHAR2(20). Но намного красивее смотрится, если хранить в бинарном формате. Если использовать столбец с типом RAW(6), то в нем хранится значение 0x70B3D501B0. Занимает намного меньше места, лучше индексируется, а бонусом еще и правильно сортируется (при строковом типе буквы предшествовали цифрам). Проблема только в том, что в этом типе минимальная единица байт, а 36 бит это четыре с половиной байта. То есть более правильным было бы хранить в столбце значение 0x70B3D501B, а не 0x70B3D501B0, но половину байта хранить нельзя, поэтому я "добиваю" нулями оставшиеся биты. В принципе сейчас с типом RAW у меня все замечательно работает и даже быстрее. чем со строковым типом данных. Но потенциально возможна следующая проблема. Сейчас у меня в таблицу внесен префикс 70-B3-D5-01-Bx-xx. Допустим завтра мне нужно будет добавить в таблицу более "узкий" префикс 70-B3-D5-01-B0-xx. Однако в бинарном виде это получится 0x70B3D501B0 и констрейн PK не даст сохранить эту запись. Как тут лучше поступить? Сделать столбец LEN обязательным и добавить его в PK? Или вернуться к строковому типу? ... |
|||
:
Нравится:
Не нравится:
|
|||
06.04.2019, 22:41 |
|
Оптимизировать соединение
|
|||
---|---|---|---|
#18+
Alibek B., Alibek B. С соединениями мне кажется лучше уже не сделать, по крайней мере мне в голову ничего не приходит. Я бы следующий вариант сравнил с текущими 300мс: Код: 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. 38. 39. 40. 41. 42.
Можно индексы на виртуальные колонки сделать, чтобы не указывать эти выражения постоянно. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.04.2019, 23:01 |
|
Оптимизировать соединение
|
|||
---|---|---|---|
#18+
Alibek B., проще хранить в виде строки битов, и пользоваться like для поиска по индексу. Всего 48 символов будет максимум ... |
|||
:
Нравится:
Не нравится:
|
|||
08.04.2019, 01:09 |
|
Оптимизировать соединение
|
|||
---|---|---|---|
#18+
SeaGateМожно индексы на виртуальные колонки сделать, чтобы не указывать эти выражения постоянно. Да, я про индексы на вычисляемые столбцы не подумал. xtenderпроще хранить в виде строки битов, и пользоваться like для поиска по индексу. Всего 48 символов будет максимум Уже само использование 48 символов вместо 6 байт мне кажется сомнительным. А как именно использовать like? Если что-то вроде ADR like substr(lpad('%', LEN, '1')), то разве вычисления строки не съедят всю выгоду? ... |
|||
:
Нравится:
Не нравится:
|
|||
08.04.2019, 09:23 |
|
Оптимизировать соединение
|
|||
---|---|---|---|
#18+
Alibek B.А как именно использовать like? как-то так: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18.
и просто искать p.mac_bin like mac.mac_bin_mask ... |
|||
:
Нравится:
Не нравится:
|
|||
08.04.2019, 12:16 |
|
Оптимизировать соединение
|
|||
---|---|---|---|
#18+
Понял, то есть 96 символов вместо 6 байт на MAC-адрес и 1 байта на длину маски. Мне это не кажется хорошим решением. Избыточно, ненаглядно и сложно. Тогда уж лучше префикс хранить не как MAC/LEN, а в виде диапазона MAC1-MAC2 (начальный и конечный адрес префикса в числовом формате). Это тоже ненаглядно, но зато неизбыточно и несложно. И скорее всего between быстрее, чем like. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.04.2019, 12:35 |
|
|
start [/forum/topic.php?fid=52&msg=39798016&tid=1882608]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
41ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
45ms |
get tp. blocked users: |
1ms |
others: | 291ms |
total: | 419ms |
0 / 0 |