25.05.2022 05:56
konst
 
Необходимо получить данные по клиентам, хранящиеся в БД УКМ4 сервера.
в виде Фамилия, Имя, Телефон, E-mail.
в базе хранится около 100тыс.клиентов.
1 и 2 поля хранятся в таблице trm_in_clients, и запрос выдает нужные данные:
SQL код:
SELECT a.ida.classifclientb.name AS classnamea.sur_namea.namea.birthday
FROM trm_in_clients a
trm_in_classifclients b
WHERE a
.global_id AND a.deleted AND a.ACTIVE AND a.classifclient b.id 
Телефон, E-mail - лежат в таблице trm_in_clients_properties_values в виде доп характеристик.
сам список доп. характеристик лежит в таблице trm_in_clients_properties
в моем случае 1 - телефон, 2 - E-mail.
добавляю в запрос получение этих данных, например телефона:
вариант 1
SQL код:
SELECT a.ida.classifclientb.name AS classnamea.sur_namea.namea.birthday,
c.value AS phonenumber
FROM trm_in_clients a
LEFT JOIN trm_in_clients_properties_values c ON c
.client a.id AND c.property AND c.deleted AND c.global_id 0
trm_in_classifclients b
WHERE a
.global_id AND a.deleted AND a.ACTIVE AND a.classifclient b.id 
вариант 2

SQL код:
SELECT a.ida.classifclientb.name AS classnamea.sur_namea.namea.birthday,
(
SELECT c.value FROM trm_in_clients_properties_values c
WHERE c
.client a.id AND c.property AND c.deleted AND c.global_id 0) AS phonenumber
FROM trm_in_clients a
trm_in_classifclients b
WHERE a
.global_id AND a.deleted AND a.ACTIVE AND a.classifclient b.id 
... и время выполнения запроса уходит в бесконечность...
при этом если в таблице trm_in_clients_properties_values добавить индекс на поле CLIENT, то запрос начинает отрабатывать мгновенно, но вносить изменения в структуру БД нежелательно....

что я делаю не так?!
25.05.2022 07:15
OlegON
 
план запроса не смотришь, видимо...
у тебя основной вариант с соединением одного типа, первый вариант уже с добавлением другого типа соединения, второй вариант уже даже с подзапросом...
подозреваю нехватку памяти, но лучше не гадать, а план посмотреть...
26.05.2022 15:46
Павел Сосновских
 
По этой таблице индекс не повредит. У нескольких клиентов делал. В течение нескольких лет ничему не помешал
26.05.2022 22:37
vdm
 
Цитата:
konst
SQL код:
WHERE a.global_id AND a.deleted AND a.ACTIVE AND a.classifclient b.id 
Добавить
SQL код:
AND b.global_id a.global_id 
global_id входит в индекс primary почти всех client таблиц и в соединениях его нужно учитывать.
27.05.2022 05:10
konst
 
Цитата:
vdm Добавить
SQL код:
AND b.global_id a.global_id 
Спасибо,
Но в целом на скорость выполнения запроса это не повлияло.

В итоге добавил индекс (таблица trm_in_clients_properties_values поле CLIENT) - все заработало.
А вы все удивляйтесь почему загрузка данных по несколько часов идет.
27.05.2022 07:22
Mtirt
 
Загрузка на карточках товаров несколько часов страдает.
Это еще до данных коиентов происходит.
31.05.2022 10:45
vdm
 
Цитата:
konst Спасибо,
Но в целом на скорость выполнения запроса это не повлияло.
Полез копаться дальше, т.к. удивился, когда давно уже запросы по клиентам делал, таких проблем не возникало.

Что получилось:
SQL код:
SELECT a.ida.classifclientb.name AS classnamea.sur_namea.namea.birthdayc.value AS phonenumber
FROM trm_in_clients a
  INNER JOIN trm_in_classifclients b ON a
.classifclient b.id AND b.global_id a.global_id
  LEFT JOIN trm_in_clients_properties_values c ON c
.client a.id AND c.property AND c.global_id a.global_id
WHERE a
.global_id AND a.deleted AND a.ACTIVE 
  
AND c.deleted 0
Смысл в том, что не стоит в ON вписывать лишнее, не относящееся к основным полям соединения.
Тут c.deleted = 0 помешало.
Часовой пояс GMT +3, время: 22:14.

Форум на базе vBulletin®
Copyright © Jelsoft Enterprises Ltd.
В случае заимствования информации гипертекстовая индексируемая ссылка на Форум обязательна.