Почему в реализациях SQL важны отношения?

В книге, которую я читаю (Querying SQL Server 2012), автор рассказывает о теории работы баз данных. Он упоминает отношения, атрибуты, кортежи и т. Д.

Он часто подчеркивает тот факт, что некоторые аспекты T-SQL не являются реляционными. Как в следующем отрывке:

В отличие от предыдущих этапов, где результат был относительным, результат этого этапа не является относительным, потому что он имеет гарантированный порядок. Результатом этого этапа является то, что стандартный SQL называет курсором. Обратите внимание, что использование термина «курсор» здесь носит концептуальный характер. T-SQL также поддерживает объект, называемый курсором, который определяется на основе результата запроса и позволяет извлекать строки по одной в указанном порядке. Возможно, вы позаботитесь о возврате результата запроса в определенном порядке для целей представления или если вызывающему абоненту необходимо получить результат таким образом с помощью некоторого механизма курсора, который выбирает строки по одной за раз. Но помните, что такая обработка не является реляционной. Если вам нужно обработать результат запроса реляционным способом - например, определить табличное выражение, такое как представление, основанное на запросе (подробности позже в главе 4), - результат должен быть реляционным. Кроме того, сортировка данных может увеличить стоимость обработки запроса. Если вас не волнует порядок, в котором возвращаются строки результатов, вы можете избежать этих ненужных затрат, не добавляя предложение ORDER BY.

Я хотел бы знать, поскольку каждая реализация SQL в значительной степени имеет предложение ORDER BY, которое делает его нереляционным, почему это вообще имеет значение, что (используется набор после ORDER BY) он больше не является реляционным, поскольку это так везде?

Я могу понять, сказал ли он, что это нестандартно, например, используя != вместо <> для неравенства, потому что это влияет на переносимость и т. Д., Но я не понимаю, почему что-то лучше быть реляционным.

Просвети пожалуйста.


person sprocket12    schedule 08.11.2013    source источник


Ответы (2)


Похоже, автор имеет в виду использование теории множеств (которая в его терминах «реляционная») против обработки строка за строкой с помощью курсора или аналогичного метода. Доступ к данным реляционным способом позволяет ядру базы данных выполнять выбор / объединение / сортировку / заказы / и т. Д. для всех наборов данных, когда курсор обрабатывает только одну строку за раз. Насколько мне известно, добавление предложения ORDER BY не делает запрос "нереляционным", автор просто отмечает, что, если вам не важен порядок набора результатов, вы можете оставить это предложение вне своего запроса и ядро базы данных будет возвращать данные в том порядке, в котором они были обработаны.

Также обратите внимание, что предложение ORDER BY выполняется ядром базы данных последним, что означает, что запрос обрабатывается «реляционным» способом, а затем упорядочивается в последнюю минуту. Курсоры начинаются с первой записи и перемещаются по ним один за другим, поэтому вся операция выполняется в заранее определенном порядке на основе определения курсора / запроса.

person Troy Carlson    schedule 08.11.2013
comment
А курсоры и построчная обработка намного медленнее, чем операции на основе наборов. - person HLGEM; 08.11.2013
comment
Автор говорит, что ORDER BY делает его нереляционным. Он говорил об этом много раз. Из приведенного выше комментария HLGEM кажется, что причина, по которой автор продолжает упоминать об этом, вероятно, состоит в том, что он хочет, чтобы читатели различили и позже поняли последствия для производительности. - person sprocket12; 08.11.2013
comment
MuhammadA прав, и это верно - ORDER BY абсолютно делает набор результатов НЕРЕЛЯЦИОННЫМ. - person randmatt; 09.11.2013
comment
Это просто смешно. Допустим, по большой случайности механизм запросов возвращает уже отсортированную таблицу, это было бы реляционным. Вместо этого, если вы явно запрашиваете такую ​​сортировку (получение того же результата), она больше не является реляционной. В этом нет никакого смысла. Если порядок строк не имеет значения в реляционной модели, тогда: почему наличие определенного порядка делает его нереляционным? Пожалуйста, помогите мне понять. - person Michele; 19.03.2014

Смысл реляционного запроса в (Querying SQL Server 2012) заключается в следующем:

Он возвращает набор, удовлетворяющий требованиям запроса.

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

ORDER BY делает его детерминированным, и, таким образом, выполнение одного и того же запроса на разных серверах гарантирует одинаковый порядок результатов.

Таким образом, порядок может быть одинаковым до и после добавления предложения ORDER BY, но не указано, что они будут одинаковыми (например, для разных патчей)

person Karl Lundin    schedule 26.12.2019