powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Пихать ли в join все, что можно?
39 сообщений из 39, показаны все 2 страниц
Пихать ли в join все, что можно?
    #39557460
Добрый день.
Есть две таблички, связанные как M-D: City / город и Street / Улица

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
CREATE TABLE CITY (
    ID         INTEGER NOT NULL,
    CITY_NAME  VARCHAR(100)
);
ALTER TABLE CITY ADD CONSTRAINT PK_CITY PRIMARY KEY (ID);

CREATE TABLE STREET (
    ID             INTEGER NOT NULL,
    STREET_NAME    VARCHAR(100),
    STREET_LENGTH  INTEGER,
    CITY_ID        INTEGER
);
ALTER TABLE STREET ADD CONSTRAINT PK_STREET PRIMARY KEY (ID);
ALTER TABLE STREET ADD CONSTRAINT FK_STREET_CITY FOREIGN KEY (CITY_ID) REFERENCES CITY (ID);

Нужно показать улицы, длина которых больше 100 метров.

Вопрос:
1. Как идеологически более верно:

Код: sql
1.
2.
3.
4.
select C.CITY_NAME, S.STREET_NAME, S.STREET_LENGTH
from STREET S
join CITY C on C.ID = S.CITY_ID
where S.STREET_LENGTH > 100


или

Код: sql
1.
2.
3.
4.
select C.CITY_NAME, S.STREET_NAME, S.STREET_LENGTH
from STREET S
join CITY C on C.ID = S.CITY_ID
           and S.STREET_LENGTH > 100


?

2. И почему.

Спасибо.
...
Рейтинг: 0 / 0
Пихать ли в join все, что можно?
    #39557469
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
22.11.2017 13:22, Скоро пятница пишет:
> И почему.

никогда не смотри планы и статистику выполнения запросов.
сохраняй интригу.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Пихать ли в join все, что можно?
    #39557472
Мимопроходящий22.11.2017 13:22, Скоро пятница пишет:
> И почему.

никогда не смотри планы и статистику выполнения запросов.
сохраняй интригу.

Одинаковые. :)
...
Рейтинг: 0 / 0
Пихать ли в join все, что можно?
    #39557474
fraks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИМХО, второй вариант идеологически неверен тем что условие отбора засунуто в условие джойна.
Лучше не смешивать эти понятия в одну кучу без особой нужды.
...
Рейтинг: 0 / 0
Пихать ли в join все, что можно?
    #39557479
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Скоро пятница> 2. E ii?aio.

Никаких жестких общих правил нет.
Общая рекомендация - в join писать
то, что соединяет соотв. таблицы, а
всё остальное - фильтры - в where.
Это когда join inner, конечно, с left
всё работает иначе.

А планы, если будут отличаться, -
можно и нужно "настраивать".
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Пихать ли в join все, что можно?
    #39557480
fraksИМХО, второй вариант идеологически неверен тем что условие отбора засунуто в условие джойна.
Лучше не смешивать эти понятия в одну кучу без особой нужды.Скоро пятница...
2. И почему.
...
Спасибо.
...
Рейтинг: 0 / 0
Пихать ли в join все, что можно?
    #39557483
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Скоро пятница,

ответ - нет. идеологически более верно в on писать именно условие объединения, а в where - условия фильтрации получаемого результата.
см. http://www.ibase.ru/joins/
раздел "Отличие между On и Where" и дальше в разделе "Left/Right Join"

в качестве дополнительного примера можно привести запрос
Код: sql
1.
2.
3.
select c.id, c.name, o.id, ...
from clients c left join orders o on c.id = o.c_id
where o.id is null



мы не можем включить where o.id is null в on, потому что это не является условием объединения, и вообще записей с o.c_id is null в таблице orders не существует. Но эти записи возникают в результате работы left join.

В разделе "Left/right join" есть обратный пример, когда ошибочный вынос условия ON в where меняет результат запроса.

В общем, on и where - это не одно и то же. Если для inner join результат не отличается, то для left/right join - разница есть.
...
Рейтинг: 0 / 0
Пихать ли в join все, что можно?
    #39557484
Гаджимурадов Рустам...
Общая рекомендация - в join писать
то, что соединяет соотв. таблицы, а
всё остальное - фильтры - в where.
...
Что за рекомендация, чья(откуда)?

Спасибо
...
Рейтинг: 0 / 0
Пихать ли в join все, что можно?
    #39557488
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Скоро пятница> Что за рекомендация, чья(откуда)?

А, трололо... Вовка, ты что ли опять проказничаешь?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Пихать ли в join все, что можно?
    #39557490
kdv,

да, именно с inner. Исключительно для inner случая вопрос был.
...
Рейтинг: 0 / 0
Пихать ли в join все, что можно?
    #39557491
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Скоро пятницаЧто за рекомендация, чья(откуда)?
вопрос странный. рекомендация обусловлена синтаксисом. Если вы пытаетесь схитрить, то обманете сами себя - например, привыкнете для inner join втыкать where в условие on, а потом напоретесь на то, что в left join получите "не тот" результат.
Ну или тот, кто будет читать ваши запросы, будет долго думать, какого хрена в on написано то, что должно быть в where.
...
Рейтинг: 0 / 0
Пихать ли в join все, что можно?
    #39557494
kdvСкоро пятницаЧто за рекомендация, чья(откуда)?
вопрос странный. рекомендация обусловлена синтаксисом. Если вы пытаетесь схитрить, то обманете сами себя - например, привыкнете для inner join втыкать where в условие on, а потом напоретесь на то, что в left join получите "не тот" результат.
Ну или тот, кто будет читать ваши запросы, будет долго думать, какого хрена в on написано то, что должно быть в where.
Понятно.

Первая причина: если впоследствии придется изменить inner на другой - фигня может получиться, которую сразу и не заметишь.
Вторая: так не делают.

Большое спасибо, ваш ответ меня полностью устроил.
...
Рейтинг: 0 / 0
Пихать ли в join все, что можно?
    #39557515
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
не майся сомненьями.
пиши без джойна.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Пихать ли в join все, что можно?
    #39557561
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хороший лозунг.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Пихать ли в join все, что можно?
    #39557564
WildSery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdvЕсли вы пытаетесь схитрить, то обманете сами себя - например, привыкнете для inner join втыкать where в условие on, а потом напоретесь на то, что в left join получите "не тот" результат.А о каком случае "напоретесь" (кроме null / not null, которые пишутся изначально только под outer join) ты говоришь?
...
Рейтинг: 0 / 0
Пихать ли в join все, что можно?
    #39557582
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WildSery> А о каком случае "напоретесь" (кроме null / not null

Зависит от того, откуда куда переносить и
от того, на что и как фильтр накладывается.
Если из left-джойна в where, то выборка
может сильно сократиться. Если наоборот,
то выборка может наоборот увеличиться, с
теми самыми null-ами (а таблиц-то больше
дувх в запросе может быть).
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Пихать ли в join все, что можно?
    #39557617
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WildSeryА о каком случае "напоретесь"
у меня в статье этот случай прописан. пример - дата по заказам в on и where. Но это опять же по правой части left join.

Для меня, собственно, этот вопрос не существует. ON это условие объединения двух таблиц. То есть столбец из таблицы А и столбец из таблицы Б.
WHERE - это условие фильтрации по столбцам одной из таблиц.
Да, в ON можно добавить условие по одному из столбцов чтобы ОГРАНИЧИТЬ записи, по которым делается join, в дополнение к объединению по "столбец из А и столбец из Б".

То есть, у меня в голове множества до join и после не являются одним и тем же, даже если бы результат их объединения и фильтрации был одинаковым. :-)

A join B on a.id = b.a_id and a.id > 10

это последовательно:
- ограничение множества A -> множество А штрих.
- объединение множества А штрих и множества Б

Сейчас это заменяется на
(select from A where a.id > 10) join B on a.id = b.a_id

здесь
A join B on a.id = b.a_id
where a.id > 10

последовательно
- объединение множеств А и Б - результат = множество С
- применение фильтра над множеством С

и мне пофиг, как оно оптимизатором выполняется. Результат должен быть такой, как у указанных операций над множествами в соответствии с последовательностью операции.
...
Рейтинг: 0 / 0
Пихать ли в join все, что можно?
    #39557646
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdv> A join B on a.id = b.a_id and a.id > 10

Это какой-то маразматический пример.
Обычно в ON если и пихают доп.фильтры,
то на detail-таблицу, а не мастер-таблицу.

> A join B on a.id = b.a_id
> where a.id > 10
>
> последовательно
> - объединение множеств А и Б - результат = множество С
> - применение фильтра над множеством С
>
> и мне пофиг, как оно оптимизатором выполняется.

+1
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Пихать ли в join все, что можно?
    #39557671
WildSery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На всякий случай, ещё раз процитирую тебя:
kdvпривыкнете для inner join втыкать where в условие on , а потом напоретесь
Так на что же я могу напороться?

ЗЫ. Я нередко условия для присоединяемой таблицы пишу в ON, поскольку в многоэтажном WHERE часто разобраться значительно сложнее.
...
Рейтинг: 0 / 0
Пихать ли в join все, что можно?
    #39557677
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WildSery> На всякий случай, ещё раз процитирую тебя:


Ты как-то избирательно цитируешь, тогда уж полностью цитируй:

например, привыкнете для inner join втыкать where в условие on, а потом напоретесь на то, что в left join получите "не тот" результат.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Пихать ли в join все, что можно?
    #39557782
WildSery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов Рустам,

Полностью я процитировал до этого, но Дмитрий вопрос не понял.
И ты, похоже, тоже не вникал.

Спрашиваю ещё раз.
В каком случае, кроме одного-единственного, для поиска (не)найденных строк, я могу на что-то "напороться", если условия пишу в ON?
...
Рейтинг: 0 / 0
Пихать ли в join все, что можно?
    #39557798
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WildSery> кроме одного-единственного, для поиска (не)найденных строк

Не понял.

Если фильтр на левую таблицу перенести в ON - это один случай.
Если фильтр на правую таблицу перенести в ON - это второй случай.

Разумеется, если множеств (таблиц) больше двух, то и вариантов
их пересечений и результатов становится больше.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Пихать ли в join все, что можно?
    #39557831
Фотография Старый плюшевый мишка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В современных условиях наверное действительно лучше стремиться к канонической форме хотя бы для читабельности, но в 1-1.5 оптимизатор порой более уверенно обращался с индексами когда условие было в ON.
...
Рейтинг: 0 / 0
Пихать ли в join все, что можно?
    #39557832
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов РустамРазумеется, если множеств (таблиц) больше двух, то и вариантов
их пересечений и результатов становится больше.
не-а. джойны все равно попарно выполняются (обрабатываются). в inner пары могут образовываться в зависимости от кардинальности (типа A + (B+C) или (A+B) +C и т.д.), а в left/right они образуются жестко в порядке следования.
Ну и еще, a right join b преобразуется оптимизатором в b left join a.

Так что, вариантов пересечения там больше не образуется, т.к. их последовательность по большей части фиксированная.
...
Рейтинг: 0 / 0
Пихать ли в join все, что можно?
    #39557847
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdv> Так что, вариантов пересечения там больше не образуется,
kdv> т.к. их последовательность по большей части фиксированная.

Ну ты мне ещё про транзитивность расскажи. :)
Больше - потому что изменения результата
предыдущего соединения может повлиять на
следующее, хотя казалось бы его не трогает.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Пихать ли в join все, что можно?
    #39557851
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Старый плюшевый мишкаВ современных условиях наверное действительно лучше стремиться к канонической форме хотя бы для читабельности
даже если "каноническая" форма приводит к взбрыкиванию оптимизатора, любые подобные отклонения надо рассматривать именно как отклонения. И если уж и использовать, то с обязательной пометкой такого запроса как "криво оптимизируемого".
Или вообще его переписать так, чтобы вопросов к оптимизатору не было (если возможно).
Приведу пример.

Известно, что при plan sort строится временный файл, который состоит из фиксированных записей макс. длины равной ключ (order by) плюс содержимое select <column_list>.
Если в этом <column_list> какой-нибудь varchar(10000), ясное дело, файл сортировки получится конского размера.

Например
Код: sql
1.
2.
3.
SELECT Table1.Champ1, Table1.REF_REMPLACEMENT, Table2.Champ2
FROM Table1 INNER JOIN Table2 ON Table1.Table2_ID = Table2.ID
ORDER BY Table1.Champ1



в этом запросе вот этот здоровенный столбец - Table1.REF_REMPLACEMENT.

Еманов (или кто еще) придумал такой трюк. Берем, получаем отсортированный набор идентификаторов, а потом по нему выбираем этот столбец, джойном.
Код: sql
1.
2.
3.
4.
5.
6.
WITH A (Champ1,Champ2,ID) AS
(SELECT Table1.Champ1, Table2.Champ2, Table1.ID
 FROM Table1 INNER JOIN Table2 ON Table1.Table2_ID = Table2.ID
 ORDER BY Table1.Champ1)
SELECT A.Champ1, Table1.REF_REMPLACEMENT, A.champ2
FROM A JOIN Table1 ON Table1.ID = A.ID



Все вроде прекрасно - сначала сортируется внутренний подзапрос, а потом к нему приклеивается джойном внешняя часть.
И это работает. Однако.
Когда я стал проверять это же самое в InterBase 2017, обнаружилось, что в ИБ результат нихрена не сортированный, и его приходится сортировать еще раз.
Так вот, выяснилось, что оптимизатор ФБ берет вот этот сорт-файл за базу, и к нему пристегивает джойн, а оптимизатор ИБ делает это НЕ ТАК.
И в этот момент я понял, что оптимизатор ФБ как раз-то и не прав. В том смысле неправ, что нельзя ориентироваться на результат сортировки внутреннего подзапроса. И если хочешь отсортировать РЕЗУЛЬТАТ, то order by должно быть в конце всего, а не где-то в середине.
А это (order by в конце) убивает весь этот придуманный трюк.

Ну это как Еманов регулярно говорит - "не надейтесь на group by, что он вам правильно отсортирует. В будущих версиях group by может использовать другой метод доступа, который будет выдавать записи в другом порядке". И теперь вдруг тот же Еманов говорит - "используйте вот такой трюк, оно вам отсортирует".
Собственно, я тут Еманова никак не обвиняю, я просто говорю, что не надо реляционную алгебру подстраивать под особенности оптимизатора. Думать надо именно реляционной алгеброй. Разумеется, с учетом специфики нашего оптимизатора. Но именно реляционная алгебра даст правильное понимание join, on, where и прочего. А оптимизатор меняется с каждым релизом. И если начать думать "за оптимизатор", а не реляционной алгеброй, то у вас через 3-4 версии просто поедет крыша :-)
...
Рейтинг: 0 / 0
Пихать ли в join все, что можно?
    #39557858
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
мопед был не мой (с) :-)
...
Рейтинг: 0 / 0
Пихать ли в join все, что можно?
    #39557867
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdv,

GROUP BY может выполняться с помощью другого алгоритма HASH GROUP или как так. Так что действительно на это не следует закладываться.

kdvЕманов (или кто еще) придумал такой трюк.

Это работает только потому что оптимизатор derived table всегда ставит первым потоком в join. Однако в будущем это может поменяться. Можно подстраховать себя и использовать LEFT JOIN тогда порядок соединения будет гарантирован.
...
Рейтинг: 0 / 0
Пихать ли в join все, что можно?
    #39557869
Фотография Старый плюшевый мишка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdvдаже если "каноническая" форма приводит к взбрыкиванию оптимизатора, любые подобные отклонения надо рассматривать именно как отклонения

Панимаш какое дело. Как мне говорил владелец бизнеса - мы тут не программы красивые пишем, мы тут бумагой торгуем.
...
Рейтинг: 0 / 0
Пихать ли в join все, что можно?
    #39557872
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Старый плюшевый мишкаКак мне говорил владелец бизнеса - мы тут не программы красивые пишем, мы тут бумагой торгуем.Ну, дык, логично, ответить, что не надо объяснять профильному специалисту, как правильно работать его работу.
...
Рейтинг: 0 / 0
Пихать ли в join все, что можно?
    #39557886
Фотография Старый плюшевый мишка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovСтарый плюшевый мишкаКак мне говорил владелец бизнеса - мы тут не программы красивые пишем, мы тут бумагой торгуем.Ну, дык, логично, ответить, что не надо объяснять профильному специалисту, как правильно работать его работу.

Я не про это. Пальцы крутить умею когда надо.
...
Рейтинг: 0 / 0
Пихать ли в join все, что можно?
    #39557897
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Старый плюшевый мишка> Пальцы крутить умею

Кому?

P.S. Больно?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Пихать ли в join все, что можно?
    #39557918
Фотография Старый плюшевый мишка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов РустамСтарый плюшевый мишка> Пальцы крутить умею

Кому?

P.S. Больно?


Отца Кабани спроси :)

Умнейшая штука – мясокрутка называемая. Зачем? Нежный мясной фарш... Молодец!.. И мясокрутку мою забрал. Молодец, грит! Голова, грит, у тебя!.. И теперь, значит, в Веселой Башне нежный фарш делает... Очень, говорят, способствует...
...
Рейтинг: 0 / 0
Пихать ли в join все, что можно?
    #39557946
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Старый плюшевый мишкаКак мне говорил владелец бизнеса - мы тут не программы красивые пишем, мы тут бумагой торгуем.
не, так не пойдет. :-) Если вернуться к исходному вопросу этого топика, то речь не о красивой программе, а о том, каким должен быть мыслительный процесс для решения задачи. А если правильного процесса нет (раз нет понимания кубиков, из которых решение складывается), то и решения нет, или оно неправильное. А красивое и правильное - это не одно и то же.

p.s. меня регулярно пробивает на "помню, что тут было вот так, поэтому...". Но чтобы "оптимизатор при помещении в on условия where как-то иначе оптимизировал" - если такое даже и было (а я такого не помню), то оно уехало далеко и надолго.
Интересующиеся, кстати, на мои примеры должны были сразу тут привести куски explain plan в ФБ 3. Видимо, никого не торкнуло.
Ну хоть кто на семинаре последнем был в Москве, вы-то попробуйте.
...
Рейтинг: 0 / 0
Пихать ли в join все, что можно?
    #39557950
Фотография Старый плюшевый мишка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdvСтарый плюшевый мишкаКак мне говорил владелец бизнеса - мы тут не программы красивые пишем, мы тут бумагой торгуем.
p.s. меня регулярно пробивает на "помню, что тут было вот так, поэтому...". Но чтобы "оптимизатор при помещении в on условия where как-то иначе оптимизировал" - если такое даже и было (а я такого не помню), то оно уехало далеко и надолго.

Ну и слава Аллаху. Я же этта... динозавер. Вообще-то мне это некогда ДЕ подсказал, я попробовал и понравилось :)
...
Рейтинг: 0 / 0
Пихать ли в join все, что можно?
    #39557951
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdvречь ... о том, каким должен быть мыслительный процесс для решения задачи. А если правильного процесса нет (раз нет понимания кубиков, из которых решение складывается), то и решения нет, или оно неправильное. А красивое и правильное - это не одно и то же.

Это тебя сильно торкнуло. Тоже садись мемуары в легком эпистолярном
жанре писать. Только не очередное "Трое в серверной". Я даже почитаю. :)
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Пихать ли в join все, что можно?
    #39557954
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
СПМ> Вообще-то мне это некогда ДЕ подсказал, я попробовал и понравилось :)

Это некошерно. Трюки с плюсиками кошернее.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Пихать ли в join все, что можно?
    #39558035
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов Рустам,

трюки с плюсиком не помогут для уменьшения ширины резалсета под сортировку
...
Рейтинг: 0 / 0
Пихать ли в join все, что можно?
    #39558040
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов Рустам,

я в эпистолярном только в детстве писал. А "Трое в серверной" - Ковязина.
...
Рейтинг: 0 / 0
39 сообщений из 39, показаны все 2 страниц
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Пихать ли в join все, что можно?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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