|
Очень долгое выполнение запроса, более минуты
|
|||
---|---|---|---|
#18+
Здравствуйте, уважаемые форумчане. Помогите решить проблему с запросом: есть таблица с номером телефона (без начального +7) и есть таблица, в которой содержатся регион и мобильный оператор, к которому относится телефоны, но проблема в том, что речь в ней идет про диапазон телефонов. Например, в одной таблице есть телефон 9379334565, а в другой таблице номера телефонов начинающиеся с 9379330000 и до 9379340000 принадлежат условно Мегафону в Республике Татарстан. Сама проблема: При количестве телефонов в таблице около 9 тысяч им проставляется в соответствие Регион и Оператор из другой таблицы за не приемлимое время, более минуты. Я пытался номер телефона представлять как текст, создавать по нему индекс в одной таблице и то же самое проделывать с другой - на моем компе это полторы минуты. Пытался номер телефона представлять как число и по нему создавать индекс - время никак не уменьшается. Хуже всего то, что телефонов может быть около полумиллиона и данный запрос выполняется несколько часов. Прошу Вашей помощи в оптимизации запроса, быть может как-то можно его упростить чтоб он выполнялся хотя бы несколько секунд. В прицепе база на аксессе с номерами телефонов и операторов, а также мои варианты запросов с индексами по строке и по числу. Буду признателен за любую помощь. Для того чтоб загрузить файл на форум пришлось немного подрезать таблицы, сейчас таблица с телефонами содержит 2300 строк (было 9000), таблица операторов 2000 строк (было 6500), но тормознутось запроса можно заметить и на таких маленьких данных ... |
|||
:
Нравится:
Не нравится:
|
|||
30.03.2021, 20:40 |
|
Очень долгое выполнение запроса, более минуты
|
|||
---|---|---|---|
#18+
papant1, попробуйте джойнами связать таблицы вместо Where Код: sql 1. 2.
... |
|||
:
Нравится:
Не нравится:
|
|||
30.03.2021, 21:02 |
|
Очень долгое выполнение запроса, более минуты
|
|||
---|---|---|---|
#18+
mds_world, такое чувство, что еще медленнее стало ((( ... |
|||
:
Нравится:
Не нравится:
|
|||
30.03.2021, 21:13 |
|
Очень долгое выполнение запроса, более минуты
|
|||
---|---|---|---|
#18+
papant1, перекинул Ваши файлы в наш ексцел (слегка навороченый) Ваш пример считает примерно за секунду Думаю что миллион телефонов раскидает за 10 секунд Если интересует - пришлем Приложен результат ( справа - Ваши данные для сравнения) ... |
|||
:
Нравится:
Не нравится:
|
|||
31.03.2021, 00:59 |
|
Очень долгое выполнение запроса, более минуты
|
|||
---|---|---|---|
#18+
papant1, оба запроса в вашем примере ровно 1 секунда... Что-то не так в вашем королевстве... Я так думаю вы всё это по сетке фигачите, тогда так и должно быть... Если в акцессе только пример, а в реале есть сервак, то делайте это на серваке... Ну или комп поменяйте, ssd вместо hdd, памяти добавьте... Ну реально - на компе телек смотрю, камтазия видео рендерит, оба запроса секунда... ... |
|||
:
Нравится:
Не нравится:
|
|||
31.03.2021, 02:04 |
|
Очень долгое выполнение запроса, более минуты
|
|||
---|---|---|---|
#18+
MX-9 papant1, перекинул Ваши файлы в наш ексцел (слегка навороченый) Ваш пример считает примерно за секунду Давайте попробуем, в личку киньте ссыль пожалуйста ... |
|||
:
Нравится:
Не нравится:
|
|||
31.03.2021, 06:07 |
|
Очень долгое выполнение запроса, более минуты
|
|||
---|---|---|---|
#18+
vmag papant1, оба запроса в вашем примере ровно 1 секунда... Что-то не так в вашем королевстве... Если просто запускать запросы, то да, вроде оно быстро выполняется.... Но, если вы попробуете перейти к последней записи, то увидите тормоза. И, как я сказал, обе таблицы очень порезаны, поэтому если в таблице телефонов будет полмиллиона записей, а в таблице с регионами в районе 6.5 тыс, то несколько часов ожидания обеспечены ... |
|||
:
Нравится:
Не нравится:
|
|||
31.03.2021, 06:09 |
|
Очень долгое выполнение запроса, более минуты
|
|||
---|---|---|---|
#18+
papant1, Ваш адрес скрыт Пришлите миллионые таблицы - проверю у себя на скорость sia.enters@inbox.lv -------- ... |
|||
:
Нравится:
Не нравится:
|
|||
31.03.2021, 09:27 |
|
Очень долгое выполнение запроса, более минуты
|
|||
---|---|---|---|
#18+
papant1, RecordSet пробывали? ... |
|||
:
Нравится:
Не нравится:
|
|||
31.03.2021, 10:56 |
|
Очень долгое выполнение запроса, более минуты
|
|||
---|---|---|---|
#18+
papant1 Если просто запускать запросы, то да, вроде оно быстро выполняется.... Но, если вы попробуете перейти к последней записи, то увидите тормоза. ну а кто же в таких запросах ходит по записям? да и зачем? я вас уверяю, что если любой из этих запросов переделать в запрос на добавление в промежуточную таблицу, то после добавления вы по промежуточной таблице будете ходить туда-сюда как у себя дома... Ну единственное сам запрос на добавление будет выполняться не секунду, а 4-5 ибо добавляются операции записи... ... |
|||
:
Нравится:
Не нравится:
|
|||
31.03.2021, 11:27 |
|
Очень долгое выполнение запроса, более минуты
|
|||
---|---|---|---|
#18+
vmag ну а кто же в таких запросах ходит по записям? да и зачем? До меня тоже дошло, а зачем по этим тысячам записей ходить (глазами чёли фильтровать) ... |
|||
:
Нравится:
Не нравится:
|
|||
31.03.2021, 15:19 |
|
Очень долгое выполнение запроса, более минуты
|
|||
---|---|---|---|
#18+
MX-9 Ушло, проверьте почту ... |
|||
:
Нравится:
Не нравится:
|
|||
01.04.2021, 05:26 |
|
Очень долгое выполнение запроса, более минуты
|
|||
---|---|---|---|
#18+
vmag papant1 Если просто запускать запросы, то да, вроде оно быстро выполняется.... Но, если вы попробуете перейти к последней записи, то увидите тормоза. ну а кто же в таких запросах ходит по записям? да и зачем? я вас уверяю, что если любой из этих запросов переделать в запрос на добавление в промежуточную таблицу, то после добавления вы по промежуточной таблице будете ходить туда-сюда как у себя дома... Ну единственное сам запрос на добавление будет выполняться не секунду, а 4-5 ибо добавляются операции записи... Не очень понял про промежуточную таблицу, что в нее положить? А еще лучше с примером insert-a ... |
|||
:
Нравится:
Не нравится:
|
|||
01.04.2021, 05:27 |
|
Очень долгое выполнение запроса, более минуты
|
|||
---|---|---|---|
#18+
papant1 Не очень понял про промежуточную таблицу, что в нее положить? в нее положить результат селекции и потом работать с этим результатом, а не работать с процессом самой селекции на ходу... - в примере пустая таблица Результат - выполните там же запрос на добавление в таблицу результат... - откройте секунд через 5-10 (не знаю сколько будет на вашем компе) таблицу результат и попробуйте походить по ней в конец и начало.... ... |
|||
:
Нравится:
Не нравится:
|
|||
01.04.2021, 13:50 |
|
Очень долгое выполнение запроса, более минуты
|
|||
---|---|---|---|
#18+
papant1 MX-9 Ушло, проверьте почту проверил отправил результат на Вашу почту в пределах 20 сек формирует и выводит на экран таблицу в ней : ввод - корректировка - в начале или в конце - мгновенно ... |
|||
:
Нравится:
Не нравится:
|
|||
01.04.2021, 19:54 |
|
Очень долгое выполнение запроса, более минуты
|
|||
---|---|---|---|
#18+
vmag papant1 Не очень понял про промежуточную таблицу, что в нее положить? в нее положить результат селекции и потом работать с этим результатом, а не работать с процессом самой селекции на ходу... - в примере пустая таблица Результат - выполните там же запрос на добавление в таблицу результат... - откройте секунд через 5-10 (не знаю сколько будет на вашем компе) таблицу результат и попробуйте походить по ней в конец и начало.... Идея Ваша понятна, на самом деле я делал подобное - в таблицу с телефонами добавлял 2 столбца Оператор и Регион и апдейтил ее, у вас решение - наполнить промежуточную таблицу, что тоже вариант. Просто дело в том, что выполнение запроса МЕДЛЕННОЕ. Например, по вашему образцу с числом записей в таблице телефонов 620 тысяч запрос на заполнение таблицы РЕЗУЛЬТАТ на моем компе (i7, ssd, 16Гб ОЗУ) выполняется более 20 минут. А все потому, что не используются индексы при написании запроса t1.телефон_строка>=t2.ОТ_строка And t1.телефон_строка<=t2.До_строка; Это можно увидеть, если данные поместить в MySQL и выполнить запрос с EXPLAINом, который говорит, что использует индекс по таблице Телефоны и не использует по РегионыОператоры: ID, SELECT_TYPE, Table, Partition, Type, PossibleKeys, Key, Key_Len, ref, rows, filtered, extra '1', 'SIMPLE', 'тел', NULL, 'index', 'column2_UNIQUE', 'column3_UNIQUE', '8', NULL, '2356', '100.00', 'Using index' '1', 'SIMPLE', 'РегОпер', NULL, 'ALL', 'idx_ro__to_str,idx_ro__from_str', NULL, NULL, NULL, '6380', '11.11', 'Range checked for each record (index map: 0x3)' Таким образом из столбца Extra можем увидеть, что для таблицы PH (Телефоны) используется индек, а для RO (РегионыОператоры) нет, это же видно из столбцов PossibleKeys (column2_UNIQUE, 'idx_ro__to_str,idx_ro__from_str') и Key (column3_UNIQUE, NULL) в скобочках указаны значения для (Телефоны, РегионыОператоры) соответственно Т.е. для использования индекса во второй таблице не подходит условие это условие t1.телефон_строка>=t2.ОТ_строка And t1.телефон_строка<=t2.До_строка его надо переписать как-то. в интернете пишут, что обычно помогает JOIN, но у меня ума не хватает ). К сожалению ... |
|||
:
Нравится:
Не нравится:
|
|||
02.04.2021, 07:28 |
|
Очень долгое выполнение запроса, более минуты
|
|||
---|---|---|---|
#18+
papant1, может добавить отсечку по первым 3 символам номера Код: sql 1. 2. 3. 4.
можно эти 3 символа вывести в отдельное поле и проиндексировать его ... |
|||
:
Нравится:
Не нравится:
|
|||
02.04.2021, 08:31 |
|
Очень долгое выполнение запроса, более минуты
|
|||
---|---|---|---|
#18+
papant1 его надо переписать как-то. в интернете пишут, что обычно помогает JOIN, но у меня ума не хватает ). mds_world papant1, попробуйте джойнами связать таблицы вместо Where Код: sql 1. 2.
... |
|||
:
Нравится:
Не нравится:
|
|||
02.04.2021, 08:45 |
|
Очень долгое выполнение запроса, более минуты
|
|||
---|---|---|---|
#18+
Вопрос: -ЗАЧЕМ в таблицах хранить ИЗЛИШЕСТВУЮЩУЮ информацию ОТ/ДО строка/текст,а если в "числах" возможны лидирующие нули..ответ однозначен. Да и сомневаюсь что без связей между таблицами с наполнением свыше~50000 записей возможно создать быстродействующий запрос А о связи Вам говорили давным-давно 2230223 ,но намного лучше "наморщить лоб" и придумать другую ... |
|||
:
Нравится:
Не нравится:
|
|||
02.04.2021, 15:19 |
|
Очень долгое выполнение запроса, более минуты
|
|||
---|---|---|---|
#18+
sdku Вопрос: -ЗАЧЕМ в таблицах хранить ИЗЛИШЕСТВУЮЩУЮ информацию ОТ/ДО строка/текст,а если в "числах" возможны лидирующие нули..ответ однозначен. Да и сомневаюсь что без связей между таблицами с наполнением свыше~50000 записей возможно создать быстродействующий запрос А о связи Вам говорили давным-давно 2230223 ,но намного лучше "наморщить лоб" и придумать другую Не оч понял про ИЗЛИШЕСТВУЮЩУЮ информацию и про "числа", но хочу заметить, что в таблице РегионыОператоры есть поля ОТ_строка, ДО_строка, а также для измерения быстродействия добавлены ОТ_число и ДО_число - думалось, что по числу индекс будет работать или быстрее выполняться запрос - но это не влияет. По поводу сообщения 2230223 вообще ничего не понял, там какой-то другой язык программирования и разговор о высоких материях.... Про промежуточную таблицу я усвоил, так и делаю (почти, апдейчу таблицу с Телефонами с добавлением информации из таблицы РегионыОператоры), но этот запрос выполняется также несколько часов при числе записей в несколько миллионов. Видимо запрос не получится оптимизировать, буду жить так Всем большое спасибо за участие ... |
|||
:
Нравится:
Не нравится:
|
|||
03.04.2021, 05:34 |
|
Очень долгое выполнение запроса, более минуты
|
|||
---|---|---|---|
#18+
ПЕНСИОНЕРКА, Идея отличная, уже даже придумал где ее можно применить (не в этом проекте), но сюда решение не годится - ведь для создания поля с помещением туда какой-то подстроки (длину которой можно подобрать опытным путем) придется все равно один раз перебрать все записи из таблицы, а это уже делается при создании промежуточной таблицы, в которую помещается для каждого телефона соответствующий ему Регион и Оператор ... |
|||
:
Нравится:
Не нравится:
|
|||
03.04.2021, 05:38 |
|
Очень долгое выполнение запроса, более минуты
|
|||
---|---|---|---|
#18+
papant1 придется все равно один раз перебрать все записи ввести дополнительное текстовое поле в основную таблицу и через update заполнить, если оно пустое - почти разовая процедура ... |
|||
:
Нравится:
Не нравится:
|
|||
03.04.2021, 09:27 |
|
Очень долгое выполнение запроса, более минуты
|
|||
---|---|---|---|
#18+
papant1 (длину которой можно подобрать опытным путем подбор не требуется - точно 3 знака, хотя совпадающих в тел_до и тел_после от 3 до 7 символов ... |
|||
:
Нравится:
Не нравится:
|
|||
03.04.2021, 09:30 |
|
Очень долгое выполнение запроса, более минуты
|
|||
---|---|---|---|
#18+
ПЕНСИОНЕРКА papant1 придется все равно один раз перебрать все записи ввести дополнительное текстовое поле в основную таблицу и через update заполнить, если оно пустое - почти разовая процедура ... |
|||
:
Нравится:
Не нравится:
|
|||
03.04.2021, 15:24 |
|
Очень долгое выполнение запроса, более минуты
|
|||
---|---|---|---|
#18+
papant1, да и всё это с определением опсоса по номеру ещё та идея... Сейчас со старым номером можно переходить к другому опсосу и хотя таких случаев немного, но они компрометируют всю эту затею. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.04.2021, 15:28 |
|
|
start [/forum/topic.php?fid=45&fpage=8&tid=1609725]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
49ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
60ms |
get tp. blocked users: |
1ms |
others: | 14ms |
total: | 167ms |
0 / 0 |