powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Тормоза в объединении с ХП + LEFT JOIN
1 сообщений из 1, страница 1 из 1
Тормоза в объединении с ХП + LEFT JOIN
    #32635197
VaDima
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Имеются таблички:

1. Классификатор "CLASSTREE" (KIND - тип классификации):
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
+----+---------+------+
| ID |  NAME   | KIND |
+----+---------+------+
|  1 |Fruits   |   2  |
|  2 |Vegetable |   2  |
|  3 |Eatable  |   1  |
|  4 |Poison   |   1  |
|  5 |Delicious|   1  |
+----+---------+------+

2. Объекты "H" :
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
+----+--------+
| ID |  NAME  |
+----+--------+
|  1 |Apple   |
|  2 |Orange  |
|  3 |Potato  |
|  4 |Poganka |
|  5 |Eggs    |
+----+--------+

2. Связи "CLASSLINK" (Классификатор <-> Объект):
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
+-----+-----+
| OID | СID |  Комментарии за кадром
+-----+-----+
|  1  |  1  |  Apple -> Fruits
|  1  |  3  |  Apple -> Eatable
|  2  |  1  |  Orange -> Fruits
|  2  |  3  |  Orange -> Eatable
|  2  |  5  |  Orange -> Delicios (повторение в классификаторе KIND 1)
|  3  |  2  |  Potato -> Vegetable
|  3  |  3  |  Potato -> Eatable
|  4  |  4  |  Poganka -> Poison
|  5  |  3  |  Eggs -> Eatable
+-----+-----+

По заданному списку типов классификаторов (KIND) надо получить такое представление по "ведущему" классификатору:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
+----+-----------+----------+----------+
| ID |  OBJNAME  | CLASS_1  | CLASS_2  |
+----+-----------+----------+----------+
|  1 | Apple     | Eatable  | Fruits   |
|  2 | Orange    | Delicious| Fruits   | Delicios или Eatable - несущественно
|  3 | Potato    | Eatable  | Vegetable|
|  4 | Poganka   | Poison   | <NULL>   |
|  5 | Eggs      | Eatable  | <NULL>   |
+----+-----------+----------+----------+

Набор значений CLASSTREE.ID создается с помощью хранимой процедуры GET_CLASSIDS. В этом упрощенном случае она вернет только 1. CLASSTREE.KIND - заданы, но, как правило, их больше.

Т.о. строю запрос с группировкой:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
SELECT  H.ID, H.NAME OBJNAME, MAX(C1.NAME) CLASS_1, MAX(C2.NAME) CLASS_2
FROM GET_CLASSIDS( 1 ) GCC
  INNER JOIN CLASSLINK CL1 ON (CL1.CLASS_ID = GCC.ID)
  INNER JOIN CLASSTREE C1 ON (C1.ID = CL1.CLASS_ID) AND (C1.KIND_ID =  1 )
  INNER JOIN H ON (H.ID = CL1.HTML_ID)
  LEFT JOIN CLASSLINK CL2 ON (H.ID = CL2.HTML_ID)
  LEFT JOIN CLASSTREE C2 ON (C2.ID = CL2.CLASS_ID) AND (C2.KIND_ID =  2 )
GROUP BY  1 ,  2 

Получаю, что хотел, но производительность, мягко говоря, оставляет желать лучшего: на 500 итоговых записей - примерно по 7000 чтений в CLASSLINK и CLASSTREE. План - с тем же порядком объединения, что и в запросе.

Какие могут быть еще решения?

Далее. Нужен вариант этого представления: пересечение с списком объектов (H.ID), формируемым другой ХП. Вот здесь уже тормоза неизбежны имхо.
...
Рейтинг: 0 / 0
1 сообщений из 1, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Тормоза в объединении с ХП + LEFT JOIN
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]