Есть ли что-то не так с соединениями, которые не используют ключевое слово СОЕДИНЕНИЯ в SQL или MySQL?

Вероятно, самое близкое, что вы можете сделать, это

static bool IntegerFunction<T>(T value) where T: struct

Не уверен, что вы могли бы сделать следующее

static bool IntegerFunction<T>(T value) where T: struct, IComparable
, IFormattable, IConvertible, IComparable<T>, IEquatable<T>

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

42
задан 4 revs, 2 users 100% 12 March 2009 в 19:51
поделиться

10 ответов

Фильтрация соединений только с помощью WHERE может быть чрезвычайно неэффективной в некоторых общих сценариях. Например:

SELECT * FROM people p, companies c 
    WHERE p.companyID = c.id AND p.firstName = 'Daniel'

базы данных Most выполнят этот запрос вполне буквально, сначала беря Декартово произведение из people и companies таблицы и тогда фильтрация по тем, которые имеют соответствие companyID и id поля. В то время как полностью неограниченный продукт не существует нигде, но в памяти и затем только на мгновение, ее вычисление действительно занимает время.

А лучший подход должен сгруппировать ограничения с JOIN с, где релевантный. Это не только субъективно легче считать, но также и намного более эффективный. Таким образом:

SELECT * FROM people p JOIN companies c ON p.companyID = c.id
    WHERE p.firstName = 'Daniel'

Это немного более длинно, но база данных в состоянии посмотреть ON пункт и использовать его, чтобы вычислить полностью ограниченный JOIN непосредственно, вместо того, чтобы запуститься с [1 113] все и затем ограничить вниз. Это быстрее для вычисления (особенно с большими наборами данных и/или соединениями много-таблицы) и требует меньшей памяти.

я изменяю каждый запрос, который я вижу который использование синтаксис "запятой JOIN". По-моему, единственной целью для ее существования является краткость. Рассматривая влияние производительности, я не думаю, что это - неопровержимый довод.

36
ответ дан Daniel Spiewak 12 November 2019 в 00:15
поделиться

Более подробным INNER JOIN, LEFT OUTER JOIN, RIGHT OUTER JOIN, FULL OUTER JOIN является от ANSI SQL/92 синтаксис для присоединения. Для меня это многословие делает соединение более ясным разработчику/DBA того, что намерение с соединением.

10
ответ дан Forgotten Semicolon 12 November 2019 в 00:15
поделиться

В SQL Server всегда существуют планы запросов для проверки, текстовый вывод может быть сделан следующим образом:

SET SHOWPLAN_ALL ON
GO

DECLARE @TABLE_A TABLE
(
    ID INT IDENTITY(1,1) NOT NULL PRIMARY KEY,
    Data VARCHAR(10) NOT NULL
)
INSERT INTO @TABLE_A
SELECT 'ABC' UNION 
SELECT 'DEF' UNION
SELECT 'GHI' UNION
SELECT 'JKL' 

DECLARE @TABLE_B TABLE
(
    ID INT IDENTITY(1,1) NOT NULL PRIMARY KEY,
    Data VARCHAR(10) NOT NULL
)
INSERT INTO @TABLE_B
SELECT 'ABC' UNION 
SELECT 'DEF' UNION
SELECT 'GHI' UNION
SELECT 'JKL' 

SELECT A.Data, B.Data
FROM
    @TABLE_A AS A, @TABLE_B AS B
WHERE
    A.ID = B.ID

SELECT A.Data, B.Data
FROM
    @TABLE_A AS A
    INNER JOIN @TABLE_B AS B ON A.ID = B.ID

Теперь я опущу план относительно табличной переменной, создает, план относительно обоих запросов идентичен хотя:

 SELECT A.Data, B.Data  FROM   @TABLE_A AS A, @TABLE_B AS B  WHERE   A.ID = B.ID
  |--Nested Loops(Inner Join, OUTER REFERENCES:([A].[ID]))
       |--Clustered Index Scan(OBJECT:(@TABLE_A AS [A]))
       |--Clustered Index Seek(OBJECT:(@TABLE_B AS [B]), SEEK:([B].[ID]=@TABLE_A.[ID] as [A].[ID]) ORDERED FORWARD)
 SELECT A.Data, B.Data  FROM   @TABLE_A AS A   INNER JOIN @TABLE_B AS B ON A.ID = B.ID
  |--Nested Loops(Inner Join, OUTER REFERENCES:([A].[ID]))
       |--Clustered Index Scan(OBJECT:(@TABLE_A AS [A]))
       |--Clustered Index Seek(OBJECT:(@TABLE_B AS [B]), SEEK:([B].[ID]=@TABLE_A.[ID] as [A].[ID]) ORDERED FORWARD)

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

6
ответ дан Meff 12 November 2019 в 00:15
поделиться

Это - больше выбора синтаксиса. Я предпочитаю группировать свои условия объединения с моими соединениями, следовательно я использую синтаксис ВНУТРЕННЕГО ОБЪЕДИНЕНИЯ

SELECT a.someRow, b.someRow
FROM tableA AS a
INNER JOIN tableB AS b
  ON a.ID = b.ID
WHERE b.ID = ?

(? будучи заполнителем)

5
ответ дан Powerlord 12 November 2019 в 00:15
поделиться

Ничто не неправильно с синтаксисом в Вашем примере. Синтаксис 'ВНУТРЕННЕГО ОБЪЕДИНЕНИЯ' обычно называют синтаксисом 'ANSI' и прибыл после того, как стиль проиллюстрировал в Вашем примере. Это существует для разъяснения типа/направления/составляющих соединения, но обычно функционально не отличается, чем, что Вы имеете.

Поддержка соединений 'ANSI' является платформой для каждой базы данных, но это более или менее универсально в эти дни.

Как примечание стороны, одно дополнение с синтаксисом 'ANSI' было 'ПОЛНЫМ ВНЕШНИМ ОБЪЕДИНЕНИЕМ' или 'ПОЛНЫМ СОЕДИНЕНИЕМ'.

Hope это помогает.

4
ответ дан Jared 12 November 2019 в 00:15
поделиться

В целом:

Использование ключевое слово СОЕДИНЕНИЯ для соединения (т.е. "соединение") первичных ключей и внешних ключей.

Использование оператор Where для ограничения набора результатов только записями Вы интересуетесь.

4
ответ дан ilitirit 12 November 2019 в 00:15
поделиться

Одна проблема, которая может возникнуть, состоит в том, когда Вы пытаетесь смешаться, старое соединение "стиля запятой" с SQL-92 участвует в том же запросе, например, при необходимости в одном внутреннем объединении и другом внешнем объединении.

SELECT *
FROM table1 AS a, table2 AS b
 LEFT OUTER JOIN table3 AS c ON a.column1 = c.column1
WHERE a.column2 = b.column2;

проблема состоит в том, что в недавних стандартах SQL говорится, что СОЕДИНЕНИЕ оценено перед соединением запятой. Таким образом, ссылка на "a" в НА пункте дает ошибку, потому что имя корреляции еще не было определено как, который НА пункте оценивается. Это - очень запутывающая ошибка добраться.

решение не состоит в том, чтобы смешать два стиля соединений. Можно продолжить использовать стиль запятой в старом коде, но если Вы пишете новый запрос, преобразовываете все соединения в стиль SQL-92.

SELECT *
FROM table1 AS a
 INNER JOIN table2 AS b ON a.column2 = b.column2
 LEFT OUTER JOIN table3 AS c ON a.column1 = c.column1;
4
ответ дан Bill Karwin 12 November 2019 в 00:15
поделиться

Другая вещь рассмотреть в старом синтаксисе соединения, это, очень легко получить соединение cartesion случайно, так как существует не на пункте. Если Отличное ключевое слово находится в запросе, и это использует старые соединения стиля, преобразуйте, это к стандарту ANSI присоединяется и видит, нужно ли Вам все еще отличное. При фиксации случайных соединений cartesion этот путь можно улучшить производительность чрезвычайно путем перезаписи для определения соединения и объединяющих полей.

4
ответ дан HLGEM 12 November 2019 в 00:15
поделиться

Я избегаю неявных соединений; когда запрос является действительно большим, они делают код трудно для дешифровки

С явными соединениями и хорошим форматированием, код более читаем и понятен без потребности в комментариях.

3
ответ дан Cade Roux 12 November 2019 в 00:15
поделиться

Это также зависит от того, делаете ли Вы просто внутренние объединения этот путь или внешние объединения также. Например, синтаксис SQL Server MS для внешних объединений в операторе Where (= * и * =) может дать различные результаты, чем синтаксис ВНЕШНЕГО ОБЪЕДИНЕНИЯ и больше не поддерживается ( http://msdn.microsoft.com/en-us/library/ms178653 (SQL.90) .aspx) в SQL Server 2005.

2
ответ дан Sean Carpenter 12 November 2019 в 00:15
поделиться
Другие вопросы по тегам:

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