Думай, как машина или зачем тестировщику алгоритмическое мышление?

Всем привет, народ!

Хочу с вами поделиться познавательной инфой по поводу седьмого задания в домашке вебинар SQL на ПОИНТ

Дело в том, что задание это взято из реальной рабочей ситуации-не полностью, конечно, а с изменениями.

Ситуация следующая: имеем 3 таблицы: с пользователями, с описанием товаров и с покупками пользователей (1 строка-1 покупка), необходимо найти всех пользователей, которые покупали только те товары, что выпущены в определённой стране в определенный год. В задании БД, конечно, другая, но структура и смысл задачи остались неизменны.

Ситуация эта случилась с моей коллегой. Девочка сукель знала, в принципе, неплохо, но на чисто техническом уровне-знала много операторов и могла их применять. К месту и не очень) А вот логическая сторона построения запросов хромала, в чем ее обвинять не могу и не стану — ну не поставлены у человека мозги, что тут поделаешь.

В общем, суть да дело-возилась девочка с задачей около часу (тестировщик-птица гордая, пока не приспичит — за помощью не пойдет!), написала соответствующий запрос и с задачей справилась. Ну справилась и справилась, умница и молодец, честь ей и хвала.

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

Решать данную задачу человек решил через сравнение общего количества товаров у пользователя и количества товаров у пользователя, подходящих под условие задачи!

Т.е., для каждого пользователя через подзапросы у нас определялись значения “общее кол-во купленных им товаров” и “кол-во купленных им товаров, подходящих под условие”, потом эти два значения сравнивались между собой (через IF-THEN-ELSE!) и, пользователь, для которого эти значения были равны, попадал в результирующую выборку. Ну превосходно же! Я действительно был в восхищении-мне бы такое даже в голову не пришло))

Но решение это столь же неоптимально, сколь и гениально! Посему мой внутренний перфекционист взбунтовался и потребовал от меня выдать на-гора более красивый и простой вариант. Я посидел, немного поскрипел извилинами и сделал всё проще и, на мой скромный взгляд, изящнее —  одним-единственным подзапросом отсёк всех пользователей, которые купили хотя бы один товар, не подходящий под условие и вывел всех остальных.

Решил я сравнить производительность наших запросов, дабы удостовериться в том, что мой запрос действительно легче и быстрее. Думал, мой запрос будет обрабатываться шустрее хотя бы в пару раз, но результат меня очень удивил. 2 миллисекунды в моём запросе против 11 миллисекунд в запросе коллеги. Разница в 5.5 раз! Пять с половиной, КАРЛ!!!

Да, вы можете сказать, что на этих величинах такая разница значения не имеет. Но есть один нюанс — тестирование проводилось на нашей ПОИНТовской базе, на которой студенты учат сукель — а она маленькая. А теперь представьте себе БД какого-нибудь фейсбука или алиэкспресса, с их тысячами пользователей и миллионами связанных сущностей. Представили? То-то же! На таких объемах данных эта разница в быстродействии уже начинает приобретать вес (и весьма ощутимый!), не так ли?)

И ведь человек это сделал не из-за того, что чего-то не знает или недостаточно опытен в написании запросов, а из-за того, что не умеет думать, как машина.

Просто потому, что у нее не поставлено логическое “машинное” мышление. Ну, в принципе, оно и ожидаемо — этому мало где учат.

И вот эту вопиющую несправедливость мне хочется исправить в меру своих возможностей. Именно поэтому в моём будущем курсе лекций по SQL я буду, кроме обучения SQL, учить вас и логическому “машинному” мышлению)

Кстати, скоро выйдет бесплатный промо-вебинар этого курса! Если интересно — заполни вот эту коротенькую формочку

Заполнять тут!

Всем резиновых дедлайнов и смачных блокеров, народ!

#ятренерпоинт