Форматирование кода SQL-запросов

17

Должен ли я разбивать SQL-запросы в разных строках? Например, в проекте, над которым я работаю, у нас есть запрос, который занимает 1600 столбцов! 1600 + табуляции символов. Я написал такие запросы:

   "SELECT bla , bla2 , bla FROM bla " . 
     "WHERE bla=333 AND bla=2" . 
      "ORDER BY nfdfsd ...";

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

GorillaApe
источник
Возражением может быть использование интерполированных кавычек (двойных кавычек) и конкатенации ( .), которые, как я видел, некоторые программисты обвиняют в снижении производительности.
Брюс Олдерсон
3
Все должно быть на 1 линии? Привет полоса прокрутки, до свидания читаемость.
mike30
1
@BruceAlderson Звучит как одна из статей начала 2000-х годов «Домохозяйка обнаруживает 3 простых совета по оптимизации вашего PHP». Настоящий красный флаг с двойными кавычками и / или конкатенацией появляется, когда вы начинаете вставлять переменные, не экранируя их должным образом, создавая атаки SQL-инъекций.
Шон МакSomething
1
Используются ли какие-либо инструменты для обработки файлов?
Ян
Почему так трудно понять, что, пока вам платят за код, вы должны писать чистый, аккуратный, аккуратный код?
Тулаинс Кордова

Ответы:

33

По причинам контроля исходного кода у нас есть разрывы строк после каждого предложения where или запятой. Так что твое выше превращается в

SELECT bla 
     , bla2 
     , bla 
FROM   bla 
WHERE  bla=333 
  AND  bla=2
ORDER  BY nfdfsd
        , asdlfk;

(табуляция и выравнивание здесь не имеют стандарта, но запятые обычно лидируют)

Тем не менее, без разницы в производительности.

glasnt
источник
5
Хорошая идея, это сделало бы небольшое изменение очень отличным в исходном контроле.
Carson63000
Практически такое же форматирование, как и у меня, хотя я обычно помещаю весь список выбора в одну строку (или в несколько строк, если столбцов много)
Дин Хардинг
7
Подобный макет здесь, единственная разница в том, что запятая в начале, у нас она есть в конце.
DBlackborough
4
@ m.edmondson - разница между версиями в системе контроля версий выделяет изменения построчно. В этом формате каждая строка содержит один бит информации - имя столбца, имя таблицы, предложение join или order - это означает, что diff будет указывать прямо на то, что изменилось, а не только на строку с множеством включенных вещей и оставит вас выяснить, что отличается.
Джон Хопкинс
2
Этот формат также позволяет легко закомментировать отдельные элементы во время разработки и использовать вырезать и вставить для изменения порядка.
Крис Нава
14

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

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

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

Re: это плохая практика кодирования. Едва! Это очень хорошая практика. Я не знаю веских причин использовать такой длинный запрос, и есть много веских причин для его переформатирования. Как я уже говорил, опытный администратор базы данных, вероятно, должен работать над этим.

жестяной человек
источник
3
Согласитесь, все сводится к удобочитаемости. На производительность и т. Д. Это никак не влияет, все это просто эстетично.
Кристиан
Согласитесь, что производительность не может быть хорошим аргументом.
Жестянщик
Я не знаю .. только что сказал мне держать это в одной строке, возможно, потому что они делают
GorillaApe
Они, вероятно, боятся прикасаться к нему, если это «устаревший» код. Просто медленно отойди и все будет хорошо.
Жестянщик
Его свежий код ...
GorillaApe
8

Единственное преимущество однострочных запросов, которое приходит на ум, заключается в том, что эти запросы могут быть несколько проще для поиска. Кроме этого, я в тупике. Лично я предпочитаю более читаемые, разделенные запросы.

leed25d
источник
6

Многострочные комментарии хороши, практически необходимы при работе с большими объемами SQL. И если ваш язык программирования имеет кавычки heredoc, это даже лучше (так как многие редакторы могут выделить синтаксис SQL в них).

Пример:

$a = SQL<<<
    SELECT a, b, c, d
    FROM Foo f
    WHERE f.a = ?
SQL;

При работе с запросами десятков строк (или сотен) текст и отступы делают текст работоспособным.

Брюс Олдерсон
источник
1
Для PHP nowdocs - это разновидность в одинарных кавычках (т.е. без подстановки переменных).
Алан Пирс
4

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

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

Что касается синтаксиса, вам следует подумать о том, чтобы переместить запрос за пределы вашего кода - сохраните его в отдельном файле ресурсов .sql и попросите программное обеспечение прочитать этот файл. Используйте подготовленные операторы для переменных, если это не запрос, который создается динамически (т. Е. Операторы where и т. Д. Добавляются в зависимости от определенных параметров). Если он построен динамически, вы можете добавить собственные переменные замены, вставляя дополнительные параметры там и тогда, когда это необходимо.

Что касается столбцов 1600, я настоятельно рекомендую создать представление для этого, поэтому вместо

SELECT column1, column2, .... column1600 from X where Y

вы получите

ВЫБЕРИТЕ * ИЗ ViewX, ГДЕ y

Гораздо лаконичнее в вашем собственном коде.

Ктулху
источник
+1, и я бы также подумал о том, чтобы превратить запрос в хранимую процедуру
Ларри Коулман,
1

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

Это может не ответить на ваш вопрос, но я бы также настоятельно рекомендовал разбить ваш запрос на более мелкие запросы. Очевидно, что это зависит от запроса, но чем больше предложений и объединений вы добавите в запрос, тем меньше механизм SQL сможет оптимизировать ваш запрос.

У вашего поставщика базы данных должны быть такие инструменты, как MySQL EXPLAIN (или настройка MSSQL SHOWPLAN_ALL), которые будут показывать вам, что база данных делает за кулисами для оптимизации вашего запроса, каждый раз, когда база данных должна создавать временную таблицу или что-то подобное, вы добавляете огромные задержки, когда вы говорите о нескольких одновременных пользователей.

Перемещая то, что может показаться тривиальной логикой, из SQL в ваш код, вы можете значительно повысить производительность - SQL отлично справляется с простыми операциями.

Очевидное преимущество, которое может иметь отношение к вам, состоит в том, что ваши запросы гораздо менее сложны и просты для чтения - просты в управлении (не более 1600 столбцов) и быстрее. Определенно всесторонняя победа.

Надеюсь это поможет :)

heretik
источник