Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
помогите оптимизировать запрос
|
|||
|---|---|---|---|
|
#18+
Доброе время суток. У меня возникла необходимость создать некую процедуру для тарификации телефонного трафика. Суть в следующем: Есть таблица со статистикой - набираемыми номерами и номером звонящего(около 60000 записей). Кроме того есть три таблицы с кодами и зонами т.е код это префикс, зона - страна. Причем объеденить их в одну таблицу нельзя.Коды могут быть разной длинны, для поиска зоны звонка приходится через like копировать все подходящие записи из всех таблиц кодов во временную таблицу и выбирать из них код наибольшей длинны. т.е есть номер 222468598666 в результате выборки кодов получим таблицу: ----------- 2 22 222 2224 -> нужный код после этого удаляем таблицу и все сначала и.т.д все работает но ужасно медленно. нельзя ли как нибуть оптимизировать данный алгоритм или может есть какое нибуть более оптимальное решение? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.10.2001, 13:26 |
|
||
|
помогите оптимизировать запрос
|
|||
|---|---|---|---|
|
#18+
Можно так: SELECT @code = code from code_list WHERE @a_number LIKE code + '%' AND DATALENGTH(code) = (SELECT MAX(DATALENGTH(code)) FROM code_list WHERE @a_number LIKE code + '%') Можно его же разделить на отдельные запросы, а если сразу таблицу надо получить, то лучше поэкспериментировать с group by ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.10.2001, 14:51 |
|
||
|
помогите оптимизировать запрос
|
|||
|---|---|---|---|
|
#18+
А может еще так попробовать? select LTRIM(MAX(RIGHT(' ' + item_code), 20)) from code_list where item_code = LEFT(a_number, DATALENGTH(item_code)) здесь число пробелов и число (20) должны быть равны максимальной длине или так select ltrim(max(replicate(' ', 20 - DATALENGTH(item_code)) + item_code) from code_list where item_code = LEFT(a_number, DATALENGTH(item_code)) хотя на фоне невозможности использования индексов сравнивать, что быстрее right или replicate+ datalength имхо бессмыслено ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.10.2001, 15:15 |
|
||
|
помогите оптимизировать запрос
|
|||
|---|---|---|---|
|
#18+
Большое спасибо, обязательно попробую все три варианта - в любом случае это должно работать гораздо шустрее даже без индексов (в моем варианте индексы тоже не работали). Самое главное отпадает самый медленный момент - создание и удаление таблиц т.е. упроздняются файловые операции. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.10.2001, 15:26 |
|
||
|
|

start [/forum/topic.php?fid=46&gotonew=1&tid=1825176]: |
0ms |
get settings: |
7ms |
get forum list: |
10ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
32ms |
get topic data: |
7ms |
get first new msg: |
4ms |
get forum data: |
2ms |
get page messages: |
22ms |
get tp. blocked users: |
1ms |
| others: | 250ms |
| total: | 339ms |

| 0 / 0 |
