Здравствуйте, Ikemefula, Вы писали:
ВВ>>Обычно вообще-то переход, скажем, на 10g превращается в масштабный и сложный проект и вовсе не потому, что там "бизнес-логика" в базе. I>Поясни.
Переход с одной версии БД на другую в случае оракла — это очень нетривиальное занятие, т.к. изменения могут быть критичными для функционирования
приложения, ряд запросов возможно придётся переписать, какой-то функционал больше не поддерживается, зато появился новый итд итд итд.
Именно поэтому у многих сейчас работает оракл даже 8-й версии, хотя на дворе уже 11-я. Стоимость перехода неоправданно высока, такова жизнь.
Здравствуйте, Ночной Смотрящий, Вы писали:
Y>>Я отвечал на вполне конкретное заявление и iHateLogins вполне однозначно сказал то что сказал. Там не было ничего ни про массовые колличества ни про всегда плохо.
НС>А давай мы не будем пытаться превратно трактовать, а прямо у него спросим — считает ли iHateLogins, что юнит-тесты это всегда плохо?
Нет, я так не считаю. В некоторых проектах, связанных с мат. вычислениями, я использовал юнит-тесты по полной и это мне помогло сэкономить кучу времени при тестировании.
Здравствуйте, iHateLogins, Вы писали:
ВВ>>>Обычно вообще-то переход, скажем, на 10g превращается в масштабный и сложный проект и вовсе не потому, что там "бизнес-логика" в базе. I>>Поясни.
HL>Переход с одной версии БД на другую в случае оракла — это очень нетривиальное занятие, т.к. изменения могут быть критичными для функционирования HL>приложения, ряд запросов возможно придётся переписать, какой-то функционал больше не поддерживается, зато появился новый итд итд итд.
Меня интересует "вовсе не потому, что там "бизнес-логика" в базе", а ты пояснил как раз про бизнеслогику в базе
Здравствуйте, Ночной Смотрящий, Вы писали:
НС>Здравствуйте, yuriylsh, Вы писали:
Y>>Я отвечал на вполне конкретное заявление и iHateLogins вполне однозначно сказал то что сказал. Там не было ничего ни про массовые колличества ни про всегда плохо.
НС>А давай мы не будем пытаться превратно трактовать,
Точно, давай не будем.
НС>а прямо у него спросим — считает ли iHateLogins, что юнит-тесты это всегда плохо?
Спрашивай, если хочеться. Мне абсолютно не интересно, что он по этому поводу считает. К словам, на которые я отвечал этот вопрос не имеет никакого отношения.
... << RSDN@Home 1.2.0 alpha 4 rev. 1228>>
Luck in life always exists in the form of an abstract class that cannot be instantiated directly and needs to be inherited by hard work and dedication.
Здравствуйте, Ikemefula, Вы писали:
ВВ>>>>Обычно вообще-то переход, скажем, на 10g превращается в масштабный и сложный проект и вовсе не потому, что там "бизнес-логика" в базе. I>>>Поясни.
HL>>Переход с одной версии БД на другую в случае оракла — это очень нетривиальное занятие, т.к. изменения могут быть критичными для функционирования HL>>приложения, ряд запросов возможно придётся переписать, какой-то функционал больше не поддерживается, зато появился новый итд итд итд.
I>Меня интересует "вовсе не потому, что там "бизнес-логика" в базе", а ты пояснил как раз про бизнеслогику в базе
Даже если логики (транзакций) в базе нет, наверняка там есть вьюхи, индексы, оптимизированные для спец. запросов, вычисляемые колонки с индексами на них для лучшей производительности, ETL для аналитики, итд итд. Всё это перенести с одной БД на другую — это совсем не тривиальное занятие.
___>>СУБД — да это определяется сразу. А вот перекидывать с одной СУБД на другую — тот еще гемор — заказчик посылается в лес. I>Интересный подход однако, посылать заказчика. Жалко в ЖКХ где работает мой отец, об этом не знали. А то MSSQL выдохся и перешли на Оракл.
Ну так если не знать как оптимизировать SQL Server, то переход на оракл не поможет. Это раз.
А во-вторых, лучше бы ЖКХ лучше занималось своими непосредственными задачами и уважало своих клиентов (владельцев квартир), а не занималось откатной хернёй с переходом на оракл (который стоит где-то в 20 раз дороже SQL Server).
Здравствуйте, iHateLogins, Вы писали: HL>Такой подход как у _d_m_ будет как раз самым быстрым.
Это, интересно, почему? Ты полагаешь, что SQL Server сам не умеет выкидывать промежуточные результаты на диск?
Единственное, где это может 100% помочь — когда один и тот же подзапрос используется дважды в рамках одной транзакции. Кросс-запросную оптимизацию сиквел, естественно, не делает.
... << RSDN@Home 1.2.0 alpha rev. 677>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, Ikemefula, Вы писали:
I>Здравствуйте, _d_m_, Вы писали:
___>>СУБД — да это определяется сразу. А вот перекидывать с одной СУБД на другую — тот еще гемор — заказчик посылается в лес.
I>Интересный подход однако, посылать заказчика.
Мы не собираемся прыгать аки горные козлики с одной СУБД на другую. Тем более нет прецендентов с производительностью, багами, или необходимостью каких-то супервозможностей и фич в другой СУБД. Поэтому резонный вопрос: а на каком основании переход на другую СУБД? Но клиентам глубоко побоку на СУБД, их интересует возможности продукта, а как оно там реализовано. Если клиент выдвигает неадекватные требования — есть другие клиенты.
I>Жалко в ЖКХ где работает мой отец, об этом не знали. А то MSSQL выдохся и перешли на Оракл.
Я не знаю как там в вашей местности с ЖКХ, но у нас ЖКХ это просто кровососы.
Здравствуйте, criosray, Вы писали:
HL>>Такой подход как у _d_m_ будет как раз самым быстрым.
C>Да уж... если уже писать глупости, так по полной не зная меры?
Прекрати некропостинг, если есть что по существу — пиши. Иначе "лучше жевать чем говорить".
Здравствуйте, Sinclair, Вы писали:
S>Здравствуйте, iHateLogins, Вы писали: HL>>Такой подход как у _d_m_ будет как раз самым быстрым. S>Это, интересно, почему? Ты полагаешь, что SQL Server сам не умеет выкидывать промежуточные результаты на диск?
Может. Но все таки, еще раз: практическими экспирементами выявлено, это самый производительный вариант для любой комбинации входных параметров.
Здравствуйте, Ночной Смотрящий, Вы писали:
НС>Здравствуйте, _d_m_, Вы писали:
___>>Только плюс линку. Но заниматься преждевременной оптимизацией — "красивый рукопашный скрипт" — зло. Запросы надо писать так, как-будто ничего не знаешь про работу движка СУБД.
НС>Ага. И с линком это получается намного лучше.
___>>Классно. Но это хак. Оптимизатор СУБД должен этим заниматься.
НС>Не, ну ты можешь конечно ждать, когда оптимизатор станет идеальным. Лично я предпочитаю смотреть на то, что есть в наличии.
Отвечу всем: ну не будем переписывать проект с нуля, т.к. линк такой вот прекрасный. Хватает и того, что есть без линка. Тем более: то он разрабатывается, то его там вроде хотели закрыть, а то опять он ожил. А MS SQL и его оптимизатор будут, и оптимизатор будут подтягивать.
___>>PS: Речь изначально шла не об этом. Сначала gandjustas ляпнул ерунду (или коряво выразился), которую всем понять было только как: кэширование и индексы работают только для линк-запросов.
НС>Ну, касательно ляпанья gandjustas все вопросы к нему, он много тут такой пурги несет, что одной больше, одной меньше ...
Здравствуйте, Sinclair, Вы писали:
S>Здравствуйте, _d_m_, Вы писали:
___>>Ну это для детей. Для оптимизатора isnull — черный ящик. S>Ок. Теперь для взрослых: S>
S>select count(*) from sysobjects where id = @id or @id is null
S>
Если ты про = @Товар or @Товар is null, то он ваще не играет никакой роли. Писать отдельный запрос ради этого редкого частного случая смысла нет. Скорость приемлимая, и ради того чтобы юзер ждал 1 секунду вместо 5... оно того не стоит.
Здравствуйте, _d_m_, Вы писали: ___>Если ты про = @Товар or @Товар is null, то он ваще не играет никакой роли. Писать отдельный запрос ради этого редкого частного случая смысла нет. Скорость приемлимая, и ради того чтобы юзер ждал 1 секунду вместо 5... оно того не стоит.
Ну ок. Вас всё устраивает — не мне вас учить программировать.
Но не удивляйтесь, когда кто-то другой будет добиваться "приемлимой" скорости не многократными экспериментами и тяжкими усилиями, а просто наколбасит запрос на линке, и всё взлетит с первого раза.
... << RSDN@Home 1.2.0 alpha rev. 677>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, Ikemefula, Вы писали:
I>Здравствуйте, Воронков Василий, Вы писали:
G>>>И достигнуть этого можно двумя способами. G>>>1)Перенести всю BL на SQL, что практически смертельно в случае смены БД, так как придется перекраивать кучу кода. G>>>2)Использовать правильные инструменты для работы с БД, которые позволяют BL абстрагировать от хранилища, тогда и смена БД пройдет гладко.
ВВ>>Для тех в танке повторяю — вынесение BL из БД вовсе не означает "легкости смены СУБД", если, конечно же, речь не идет о хоум-пейджах.
I>Не спорь с ним, он сикп освоил
Здравствуйте, iHateLogins, Вы писали:
HL>Здравствуйте, gandjustas, Вы писали:
G>>Еще раз: главное абстрагировать BL от хранилища.
HL>Как вам другая задача: абстрагировать BL от языка программирования. Возьмётесь?
Здравствуйте, Sinclair, Вы писали:
S>Здравствуйте, _d_m_, Вы писали: ___>>Если ты про = @Товар or @Товар is null, то он ваще не играет никакой роли. Писать отдельный запрос ради этого редкого частного случая смысла нет. Скорость приемлимая, и ради того чтобы юзер ждал 1 секунду вместо 5... оно того не стоит. S>Ну ок. Вас всё устраивает — не мне вас учить программировать. S>Но не удивляйтесь, когда кто-то другой будет добиваться "приемлимой" скорости не многократными экспериментами и тяжкими усилиями, а просто наколбасит запрос на линке, и всё взлетит с первого раза.
Да не вопрос. Начинать новый проект — linq в руки и вперед. Но переписывать проект начатый в 2001 году мы не станем.
Здравствуйте, _d_m_, Вы писали: ___>Да не вопрос. Начинать новый проект — linq в руки и вперед. Но переписывать проект начатый в 2001 году мы не станем.
Еще раз: никто вас не уговаривает переписывать работающий восход с закатом. Напомню, что вы пытаетесь убедить нас, что и в новых проектах вот эти ваши дорогостоящие приседания на неприспособленном для программирования языке и есть руль. А линк — так, погулять вышел. Вот это и есть основное заблуждение.
Заранее хочу оговориться, а то в таких религиозных спорах часто приходится занимать несколько утрированную позицию: я не считаю конкретную реализацию Link2Sql панацеей. Она страдает множеством недостатков; и особо смелые парни из числа опытных собаководов сейчас полощут мозг команде авторов Linq на тему "вы всё сделали не так, иначе бы провайдер линка было бы легко написать". Но сам подход линка к решению задачи значительно лучше, чем подход T-SQL.
Понимаете, было время, когда опытные ассемблерщики смеялись над, скажем, С++. "Что он вам там наоптимизирует? Я вот заколбашу здесь rep scansd — и всё полетит, а где оно в C++?".
Но годы шли; смех сильно поутих после того, как оказалось, что и rep scansd, и прочее вполне себе подвластно компилятору. Более того, смеяться стали программисты на C++ — потому что они натравили новые компиляторы на старые программы и получили 150% прироста производительности. А ассемблерный код как был оптимальным для 80386, так для него оптимальным и остался. Отдельные кадры из числа особо упёртых продолжали смеяться над "корявым кодом", который генерировали компиляторы, даже в 2005 году. Лица этих отдельных кадров сильно вытягивались после просмотра результатов забега "корявого" кода под профайлером — rep scansd сливал. Оказалось, что Intel C/C++ Compiler знает об особенностях потрошков современных CPU немножко больше, чем среднестатистический ассемблерщик.
Такая же штука ожидает нас и в SQL. Понимаете, SQL — это ассемблер. Есть оптимизации, которые SQL Server не проводит и никогда не будет проводить. В простых случаях он справляется очень хорошо; но и ассемблер в простых случаях инкрементирует каунтер не шибко плохо. Но в сложных случаях руки оптимизатора связаны тем уровнем семантики, который ему видим. И в этом смысле линк позволяет развязать смысловую составляющую запроса и те кирпичики, из которых он сделан.
Классический пример — Skip(m).Take(n). Запрос, который вы нарулите вручную для MS SQL 2000, уже не будет самым эффективным на MS SQL 2005. И MS SQL 2005 не станет за вас переписывать его на оконные функции. А вот линк — станет. Потому, что линк видит суть запроса, а не нагромождение select top from select top.
И таких примеров в реальной жизни — очень и очень много. Вот вы помянули RLS. Очень часто в RLS есть режим "администратора", который типа видит всё. В классике вы будете делать джойн с таблицей ACL, оборудованный чем-то типа OR @userLevel == Admin. И сиквел будет честно сканировать ACL, просаживая производительность на порядок. А на linq приджойнивание ACL таблицы будет происходить в динамике, в зависимости от уровня доступа. И ненужные подзапросы даже не будут генерироваться.
В итоге, чем сложнее логика запроса — тем сильнее в нём будет рулить Linq. Вы совершенно напрасно пытаетесь показать те примеры, для которых линк и изобретался. Убийцы линка — это "простые" запросы, которые не пролезают через провайдера. Типа CTE. Вот в них можно положить линк на лопатки путём ручного кодирования.
... << RSDN@Home 1.2.0 alpha rev. 677>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
L>Отлично.
L>1. Если конструктор Customer() кинет исключение, тест не пройдет. L>2. Если Create() кинет исключение, тест не пройдет L>3. Если GetCustomerById() вернет что-то отличное от ожидаемого, тест провалится. L>4. Если впоследствии кто-то умный решит играться регистром имен в конструкторах, сеттерах или еще где, тест свалится
L>Нормальный тест.
Любой интеграционный тест использующий Customer и GetCustomerById проверит то же самое. Зачем отдельный юнит-тест?