Задать вопрос
  • Какие вам дают вопросы на собеседовании?

    @xaphazard
    1) Как уже говорили выше очевидную вещь, задание на собеседовании - это не "сделать кое-как, чтобы работало", а "сделать максимально хорошо, чтобы показать насколько хорошо ты вообще можешь делать эту работу"
    2) В условии сказано "над полями и записями таблицы допускаются любые одиночные и групповые операции". Это значит, что могут, например апдейтом уменьшить количество у части уже давно совершенных операций, или назначить каждой операции новый рандомный склад назначения. И все подобные действия нужно поддерживать. Так что задание, фактически, не выполнено.
    3) Не используйте курсоры и циклы в случае, если можно решить задачу без них. Миллион инсертов по 1 строке в цикле будет работать на порядки дольше чем 1 инсерт миллиона строк. В данном случае задача решается так же без цикла.
    4) А что будет, если в блоке if (@flag_in > 0 and @flag_out > 0) после выполнения первого update второй апдейт упадет с ошибкой (от недостатка памяти на сервере, например)? А что если между двумя апдейтами вклинится другой, от другого запроса? Стоит поботать транзакции и try/catch

    Как бы делал я (ваще не факт, что это идеальное решение):
    1) завернуть все в try блок, в catch откатывать транзакцию на точку в начале блока, если что-то пошло не так.
    2) повесить ограничение на таблицу Размещение, чтобы не позволять отрицательные количества. В случае чего возникнет ошибка при вставке, отрабатывает 1)
    3) В случае удалений-апдейтов - находим все склады, на которые это влияет, заново по Движению пересчитываем для них данные в Размещении. Никаких циклов, 1 запрос. (удаления можно на самом деле оптимизировать, аналогично пункту 4)
    4) В случае вставки можно поступть аналогично, но можно оптимизировать и считать разницу относительно уже обработанного состояния в Размещении. Опять же, никаких циклов.
    5) Заметить работодателю, что в целом постановка задачи не особо корректна: нет времени Движений, поэтому нельзя адекватно обработать ситуацию, например на склад приходило (+10)(-5)(+100), а потом заменили (-5) на (-50). В итоге сумма то на складе положительна, но был момент, когда она была < 0.

    Вообще на вашем месте я бы переписал решение максимально хорошо, просто для повышения своей квалификации. Здесь смогут дать мнение, насколько лучше стало. Плюс поботать try-catch и транзакции. Плюс избавляться от "программистского" стиля в SQL коде - если есть циклы и куча if, значит что-то скорее всего сделано не так.
    Ответ написан
    3 комментария
  • Какие вам дают вопросы на собеседовании?

    @dmitryKovalskiy
    программист средней руки
    Справедливости ради - вашего решения мы тоже не видим)) Критерии могут быть самые разные. Использовали вы или нет транзакции, использовали вы или нет блоки try/catch. Взяли курсор или избыточный FULL JOIN. Или наполнили код IF ELSE , а хотелось одним запросом... Но как ответил Сергей - Один случай действительно не показателен. Продолжайте искать.
    UPD: Оглядел поверхностно ваш код и в целом понимаю заказчика. Грехов хватает.
    set @flag_item	= (select [1] from #tmp_insert where [0] = @i)
    set @flag_in	= (select [2] from #tmp_insert where [0] = @i)
    set @flag_out	= (select [3] from #tmp_insert where [0] = @i)
    set @flag_count	= (select [4] from #tmp_insert where [0] = @i)

    За такое мой руководитель меня распнет и оставит на солнце голгофы.
    SELECT @flag_item = col1, @flag_in=col2,@flag_out=col3, @flag_count=col4 FROM #tmp
    WHERE col0 = @i

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

    Кстати - вы откатываете транзакцию при определенных условиях. А что за транзакция? нету риска что вы откатите некую параллельную нормально функционирующую?
    Ответ написан
  • Какие вам дают вопросы на собеседовании?

    saboteur_kiev
    @saboteur_kiev
    software engineer
    Один случай - вообще не показателен.

    Бывают ошибки, бывают случайности, бывают неадекватные задания.
    На этой фирме свет не сошелся. Забейте и шлите резюме на другие вакансии.
    Ответ написан
    Комментировать
  • SQL тип данных ... ....?

    @velnick
    Рискну предположить, что проблема не в типах данных, а в планах исполнения и статистике SQL Server.
    А вы случаной параметры не в хранику\функцию передаете? Может тут имеет место Parameter Sniffing?
    www.brentozar.com/archive/2013/06/the-elephant-and...
    Ответ написан
    8 комментариев