Есть ли причина (производительность или нет) присоединиться к производной таблице только необходимых столбцов в таблице, а не просто присоединиться к самой таблице? - PullRequest
0 голосов
/ 22 февраля 2020

Я выполняю рефакторинг и переформатирую длинный запрос, и я заметил шаблон для JOIN, который, кажется, не имеет смысла. В коде, над которым я работаю, многие из JOIN следуют тому же шаблону, что и JOIN, включающий таблицу customers_to_accounts в приведенном ниже примере:

SELECT
  customers.name,
  accounts.balance
FROM customers
  INNER JOIN (
    SELECT
      customer_id,
      account_id
    FROM customers_to_accounts
  ) AS x ON x.customer_id = customers.customer_id
  INNER JOIN accounts ON accounts.account_id = x.account_id

Я действительно не понимаю, почему код не было написано как:

SELECT
  customers.name,
  accounts.balance
FROM customers
  INNER JOIN customers_to_accounts ON customers_to_accounts.customer_id = customers.customer_id
  INNER JOIN accounts ON accounts.account_id = customers_to_accounts.account_id

Добавление производной таблицы приводит к тому, что на первый взгляд код делает что-то намного более сложное, чем на самом деле. Единственное преимущество, о котором я могу подумать, - это некоторый прирост производительности, но я думаю, что создание производной таблицы будет вредным для производительности, если что-нибудь. Если бы целью было присвоить таблице более короткий псевдоним, чем customers_to_accounts, вы, конечно, могли бы сделать это без создания производной таблицы.

Я не знаю, был ли код написан от руки или это было как-то сгенерировано - это то, что любят делать многие библиотеки ORM? Какие еще причины могут быть для этого?

1 Ответ

1 голос
/ 22 февраля 2020

Подзапрос НЕ даст повышение производительности - по крайней мере, не в любой базе данных, с которой я знаком. С другой стороны, существуют базы данных, которые будут стремиться материализовать подзапрос, что может отрицательно сказаться на производительности.

Почему код должен быть написан таким образом? Вероятно, это просто тот, кто усложнил запрос, возможно, из-за аллергии на слишком много смежных соединений.

Но могут быть и другие причины. Например, возможно, когда-то давно логика c была намного сложнее - и таблица соединений была создана совсем недавно. Человек, который первоначально написал код, возможно, хотел отделить эту конкретную логику c.

Или, возможно, она была написана таким образом, чтобы облегчить тестирование. Легко вставить limit 10 или top (2) в подзапрос, чтобы проверить, что код выполняет то, что ожидается.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...