SQL: запрос как этот OK или является там более эффективным способом сделать его, как использование соединения?

Я часто желаю для записи SQL-запроса как следующее:

SELECT body 
  FROM node_revisions 
 where vid = (SELECT vid 
                FROM node 
               WHERE nid = 4);

Я знаю, что существуют соединения и наполняют Вас, мог сделать, но они, кажется, делают вещи более сложными. Действительно ли соединения являются лучшим способом сделать это? Действительно ли это более эффективно? Легче понять?

5
задан OMG Ponies 21 January 2010 в 22:43
поделиться

8 ответов

.

Тем не менее, производительность будет варьироваться от базы данных для базы данных, как таблицы структурированы, количество данных в них и сколько будет возвращено запросом.

Если сумма данных невелики, я бы использовал подзапрос, как ваш, а не присоединение.

Вот как будет выглядеть присоединение:

SELECT body 
FROM node_revisions nr
INNER JOIN node n
  ON nr.vid = n.vid
WHERE n.nid = 4

Я бы не использовал запрос, который вы разместили, так как есть шанс на более чем одного записи узла с помощью NID = 4 , что приведет к этому потерпеть неудачу.

Я бы использовал:

SELECT body 
FROM node_revisions 
WHERE vid IN (SELECT vid 
             FROM node 
             WHERE nid = 4);

Это более читаемый или понятный? В этом случае это вопрос личных предпочтений.

7
ответ дан 18 December 2019 в 08:28
поделиться

Я думаю, что присоединения легче понимать и могут быть более эффективными. Ваш корпус довольно прост, так что это, наверное, бросается. Вот как я бы написал это:

SELECT body 
  FROM node_revisions 
    inner join node 
      on (node_revisions.vid = node.vid)
  WHERE node.nid = 4
3
ответ дан 18 December 2019 в 08:28
поделиться

Ответ на любые вопросы, связанные с производительностью в базах данных это зависит , и мы кратко по деталям в ОП. Зная особенности о вашей ситуации ... (Таким образом, это общие правила большого пальца)

Присоединения лучше и легче понять

  • Если по какой-то причине вам нужны несколько ключей столбцов (Fishy), вы можете продолжать использовать Присоединиться и просто включите другое выражение к состоянию соединения.
  • Если в будущем вам действительно нужно присоединиться к вспомогательным данным, структура соединения уже там.
  • Это делает его более понятно, что именно вы присоединяетесь и где следует реализовать индексы.
  • Использование присоединений позволяет вам лучше присоединиться и лучше думать о присоединениях.
  • Присоединения очевидны о том, какие таблицы находятся в Play

Письменные запросы не имеют ничего общего с эффективностью *

Запросы, которые вы пишете, и то, что на самом деле становится бегическим Есть много способов написать запрос, но только так несколько способов получить данные, и это зависит от механизма запроса для решения. Это относится в основном к указателям. Очень можно написать четыре запроса, которые выглядят совершенно иначе, но внутренне делают то же самое.

(* можно написать ужасному запросу, которое неэффективно, но это требует особого рода сумасшедшего, чтобы сделать это.)

select
  body

from node_revisions nr

join node n
on n.vid = nr.vid

where n.nid = 4
3
ответ дан 18 December 2019 в 08:28
поделиться

Присоединение интересно:

select body 
from node_revisions nr
join node n on nr.vid = n.vid
where n.vid = 4

, но вы также можете выразить присоединение без присоединения [!]:

select body 
from node_revisions nr, node n
where n.nid = 4 and nr.vid = n.vid

Достаточно интересно, SQL Server дает небольшой другой план запроса на обоих запросах, а присоединение имеет кластерный индекс Сканирование, «Присоединение без присоединения» имеет кластерный индекс ищет в его месте, что указывает на это лучше , по крайней мере, в этом случае!

2
ответ дан 18 December 2019 в 08:28
поделиться
select 
     body 
from node_revisions A 
where exists (select 'x' 
              from Node B 
              Where A.Vid = B.Vid and B.NID=4)
1
ответ дан 18 December 2019 в 08:28
поделиться

Я не вижу ничего плохого в том, что вы написали, и хороший оптимизатор может даже изменить его в присоединение, если он видит в форме.

1
ответ дан 18 December 2019 в 08:28
поделиться

Последний код MySQL 6.x будет автоматически Преобразуйте, что в выражении в внутреннее соединение с использованием полуприменения оптимизация подзасоединения , делая 2 заявления в значительной степени эквивалентной:

http://forge.mysql.com/worklog/task.php?id= 3740

Но на самом деле написание его довольно просто сделать, потому что внутреннее присоединение - это тип присоединения по умолчанию, и делает это не полагается на сервер, оптимизирующий его (который может принять решение не по какой-то причине, и который не будет портативным обязательно). Все равно равны, почему бы не пойти с:

select body from node_revisions r, node n where r.vid = n.vid and n.node = 4
1
ответ дан 18 December 2019 в 08:28
поделиться
SELECT  body 
FROM    node_revisions 
WHERE   vid =
        (
        SELECT  vid 
        FROM    node 
        WHERE   nid = 4
        )

Этот запрос логически эквивалентен присоединению, если и только тогда, когда NID является первичным ключом или покрывается уникальным ограничением .

В противном случае запросы не эквивалентны: присоединение всегда будет успешным, в то время как подзапрос не удастся, если будет больше, что 1 ряд в Node с NID = 4 .

Если NID представляет собой первичный ключ , то соединение и подзапрос будет иметь ту же производительность.

В случае соединения узел будет произведен ведущий

в случае подзапроса, подзапрос будет выполнен один раз и преобразован в const на стадии разбора.

1
ответ дан 18 December 2019 в 08:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: