25.05.2022 05:56
Необходимо получить данные по клиентам, хранящиеся в БД УКМ4 сервера.
в виде Фамилия, Имя, Телефон, E-mail.
в базе хранится около 100тыс.клиентов.
1 и 2 поля хранятся в таблице trm_in_clients, и запрос выдает нужные данные:
SQL код:
SELECT a.id, a.classifclient, b.name AS classname, a.sur_name, a.name, a.birthday
FROM trm_in_clients a, trm_in_classifclients b
WHERE a.global_id = 0 AND a.deleted = 0 AND a.ACTIVE = 1 AND a.classifclient = b.id 
Телефон, E-mail - лежат в таблице trm_in_clients_properties_values в виде доп характеристик.
сам список доп. характеристик лежит в таблице trm_in_clients_properties
в моем случае 1 - телефон, 2 - E-mail.
добавляю в запрос получение этих данных, например телефона:
вариант 1
SQL код:
SELECT a.id, a.classifclient, b.name AS classname, a.sur_name, a.name, a.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 = 1 AND c.deleted = 0 AND c.global_id = 0
, trm_in_classifclients b
WHERE a.global_id = 0 AND a.deleted = 0 AND a.ACTIVE = 1 AND a.classifclient = b.id 
вариант 2

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

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

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

Что получилось:
SQL код:
SELECT a.id, a.classifclient, b.name AS classname, a.sur_name, a.name, a.birthday, c.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 = 1 AND c.global_id = a.global_id
WHERE a.global_id = 0 AND a.deleted = 0 AND a.ACTIVE = 1 
  AND c.deleted = 0; 
Смысл в том, что не стоит в ON вписывать лишнее, не относящееся к основным полям соединения.
Тут c.deleted = 0 помешало.
Часовой пояс GMT +3, время: 21:47.

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