среда, сентября 06, 2006

TOP 10 THINGS I HATE ABOUT SQL SERVER

Ok, it is time for some tech notes and maybe some fun :)
Recently I've translated this article, I really enjoyed it :) Here is the link for English speakers: http://weblogs.sqlteam.com/jeffs/archive/2005/05/24/5248.aspx
So, here is translation. Enjoy :) If you have any questions don't hesitate to contact me.

10 наиболее веских причин, почему я ненавижу SQL Server!

1. SQL слишком сложный!
Если у меня есть множество значений в моих столбцах, например "ЯНВАРЬ, ФЕВРАЛЬ, МАРТ" или "15,84,22" , это не волнует SQL Server. Практически невозможно писать операторы SQL для таких таблиц! Если я захочу получить хотя бы какие-нибудь данные, придется написать оператор SELECT из 500 строк!! За каким? И к тому же понадобится божественное вмешательство, чтобы удалить какое-нибудь значение из этих списков. Зачем MS настолько все усложняет?

2. Преобразования типов данных!
Что за фигня с преобразованием данных? Я просто использую VARCHAR для всего, так как это единственный способ избежать тупых сообщений об ошибках при добавлении данных в мои таблицы. Работает отлично, пока мне не требуется получить месяц из даты или сложить два числа - тупой SQL Server заставляет меня сначала использовать функцию convert() для преобразования значений. Что за тупизм? SQL не знает как сложить "12" и "5" - он считает, что получится "125" !!!! И чтобы все еще ухудшить, в половине случаев SQL Server выдает мне ошибки, которые говорят, что он НЕ МОЖЕТ ВЫПОЛНИТЬ ПРЕОБРАЗОВАНИЕ! Блин, если бы я был компьютером, я бы смог до этого допереть.

3. Ёпрст, что с форматированием?
Все мы с этим сталкивались: хочу выровнять по правому краю столбец в своем SELECT'е - этого нельзя сделать, не вспотев! Ни говоря уже о том, чтобы отцентрировать, сделать отступы, вставить номера страниц, или что типа того. К тому же, сплошное мученье - отформатировать даты или округлить числа как я хочу. Я с трудом могу создать нормально выглядящий отчет в Query Analyzer, он выглядит как древние файлы MS-DOS! Может пора уже перейти в 21-й век, и включить какую-нибудь поддержку графики, цвета и шрифтов, эй вы, там, в Microsoft?

4. А что с сортировкой?
В половине случаев мои записи возвращаются БЕСПОРЯДОЧНО! Да, да, они вообще не отсортированы! Это бред. SQL Server должен понимать, что все должно быть отсортировано по имени/фамилии или по дате, без всякого напоминания! Компьютеры вроде бы умные, так ведь? Мои пользователи ненавидят это, потому что им сложно ориентироваться в своих отчетах. Если они жалуются, я просто говорю им, "Блин, если бы вы не были такими скупыми, и у нас был бы Oracle, нам не пришлось бы возиться с этой "особенностью" Microsoft!"И чтобы все еще ухудшить, когда я пытаюсь отсортировать, SQL Server считает, что "Декабрь" идет перед "Январем", или, что "10" меньше "2"! Блин, господин Гейтс, уже не удивляет, что вы никогда не выпускаете свои продукты в срок, так еще и ваши парни не в курсе, как работает календарь!

5. Оператор IN() вообще никогда не работает!
Это меня бесит. Конструкция IN (@Var) никогда не работает правильно! Я никогда не получаю то, что я хочу, даже если @Var точно содержит нормальный список идентификаторов. И вы даже не получите сообщение об ошибке!

6. Ограничения внешних ключей!
По каким-то причинам, в SQL вы можете обновлять или добавлять записи только в одну таблицу за раз! Я могу написать свои обычные FULL OUTER JOIN'ы и сдуреть от SELECT'а, который выполняется весь день, но что на счет того чтобы эта штука работала в UPDATE'ах и INSERT'ах!? Как по-другому сделать ссылочную целостность? Если запись в таблице A должна соответствовать записи в таблице B, то как, черт возьми, мне их запихнуть туда одновременно? По-моему это очень глупо.

7. Первичные ключи не работают!
Я дурею от этого. У меня есть первичный ключ identity под названием "ID" у каждой таблицы, но я все равно получаю дублирующиеся данные! Я должен иметь 20 разных записей для Бобруйска в моей таблице "tblStatesTable"! Тогда в чем смысл первичных ключей? Я надеюсь в следующем сервис-паке это будет исправлено.

8. S-Q-L - Т-О-Р-М-О-З!!!
Почему SQL такой медленный? Например, чтобы найти все данные в моей таблице для Января, я использую
WHERE LTRIM(tblTable.tblTable_colMonthList) LIKE '%Янв%'
Довольно стандартная конструкция. Но она выполняется ВЕЧНО! А столбец индексирован!! Эй, вы, там, в Micro-тормозе, вообще-то индексы нужны для ускорения!

9. Загадочные сообщения об ошибках!
Значит, я пытаюсь добавить данные в таблицу, и вот что получаю:
INSERT statement conflicted with COLUMN FOREIGN KEY constraint 'FK_Order_Details_Orders'. The conflict occurred in database 'Northwind', table 'Orders', column 'OrderID'. The statement has been terminated.
Или я пытаюсь написать простой GROUP BY, и получаю вот что:
Column 'orders.OrderID' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.
Или иногда я делаю обалденные динамические запросы, но они, похоже, не работают, и я получаю:
You are not allowed to truncate the system table 'master..sysobjects'.
Ээээй? Может расскажете, что не так, вместо того, чтобы писать длинные непонятные сообщения на языке мумбо-юмбо. Господин, Билл Гейтс, может, стоит потратить немного баксов на то, чтобы в SQL Server не было багов, вместо того, чтобы писать все эти дурацкие сообщения об ошибках! У кого есть время на то, чтобы вникать в эту чушь?

10. Ссылки на таблицы и столбцы!
Это вообще бред. Значит, у нас есть умные компьютеры, так? И у нас есть что-то под названием "переменные", так? В этих переменных мы можем хранить все что угодно, даже названия столбцов и таблиц. Но вот это вообще не работает:
Select @TableName.@ColumnName from @TableName
И мне понятно, и вам понятно, я не пойму, почему это не понятно SQL Server'у! Как получить данные из таблицы 'tblCustomerNumber0121' вместо таблицы 'tblCustomerNumber0122', или получить данные из столбца 'Янв2005', если я не могу использовать переменные в такой конструкции!? Это надо делать хард-кодом!? Как, черт возьми, я должен писать отчеты с пользовательскими параметрами, если я ограничен заранее определенными названиями таблиц и столбцов!? Ну же, Micro-тупость, что на счет ДЕЙСТВИТЕЛЬНО НУЖНЫХ вещей для программирования в T-SQL, например ПОЛНОЙ поддержки переменных! К тому же на, самом деле, очень тяжело добавлять новые данные в таблицы. INSERT? Он никогда не работал! INSERT не может даже добавить новый столбец в таблицу! Как предполагается добавлять данные для нового месяца, если у меня вообще еще нет этого столбца? Может это, наконец, сделают в SQL Server 2005.

Комментариев нет: