Как определить, сколько времени будет выполняться запрос к БД?
Любимый вопрос начальства — «а сколько это будет считаться?». База большая, запросы сложные и все время разные (в смысле вообще разные, а не с разными аргументами). Как можно определить будущее время выполнения запросов в этом случае?
Ясно. Мудрые товарищи говорят, что нет в мускуле подобных средств прогнозирования, и есть только возможность примерной оценки на основе меньших выборок /*плюсанул ответ papersaltserver*/.
К вопросу, почему в СУБД нет встроенных средств прогнозирования: видимо, это очень дорого с точки зрения разработки/очень долго с точки зрения выполнении прогноза/дает очень грубый подсчет/всё вышеперечисленное.
Поверхностное гугление показало, что есть такая штука для Оракла — Discoverer — но и он делает очень грубый и очень приблизительный расчет исходя из предыдущих запросов.
Их нет потому, что прогнозировать это невозможно. Только предполагать. Вот предполагаете вы, что выполните работу для начальства за один час. А тут приходит другое, куда более высокое начальство и говорит: «бросай все, пошли со мной».
теперь давайте на базу данных это спроецируем:
insert into tbl_supertest(id, value)
select v.id_value, v.value from
tbl_value v
join tbl_valuedetail vd on v.id_value = vd.id_value
сколько времени будет выполнятся подобный запрос на 10 строчках? Политическая проститутка Троцкий скажет: «да за ноль секунд!» — и будет, как всегда, в корне не прав. Блокировочки! Другой процесс взял, и увел таблицу tbl_supertest с собой в режиме — запись запрещена. И? Пока он её не отдаст, никакой работы не будет. Конечно, мы с вами можем посчитать пока скорость выполнения селекта — но это здесь, в самом простом варианте.
А если мы пишем процедуру, и без данных в таблице tbl_supertest — дальше ничего работать не будет вообще? И это еще самый простой вариант.
Теперь пока вы там сидите и пытаетесь выполнить запрос с селектом — приходит еще сто тысяч пользователей и начинают писать в таблицу tbl_value — после чего записей в ней становится не 10, а сто миллионов. А индекс мы забыли с вами создать на tbl_valuedetail.id_value. Отразится это на времени исполнения? А через минуту нас осенило с вами, и мы индекс таки создали. Отразится это на времени исполнения?
И это я еще не учел наличие свободной памяти, скорость вашего жесткого диска, пренебрег фоновыми процессами и еще десятком важных деталей. Понимаете, почему это можно говорить лишь очень грубо?
Не в смысле: «Начальник, отвали с кретинским вопросом!», а в смысле «В мультиюзерной и мультизадачной среде ответить на вопрос ТОЧНО — невозможно. Даете монопольный доступ — будет примерно столько-то».
Написано
Войдите на сайт
Чтобы задать вопрос и получить на него квалифицированный ответ.