


Быстродействие падает, система виснет после запроса к базе SQL +++
В общем досталась мне морока, из таблицы архивов вытаскивать последний элемент. Как это сделать - разобралась.
Но дело в том, что запрос этот выполняется что-то около двух минут, так как в таблице 120 миллионов записей. Во время того, как этот запрос обрабатывается, всё просто повисает, почти не реагирует ничего в системе, причем это и если я программно запрос посылаю (C++), и если обычно в Microsoft SQL Server Managment Studio. В менеджере единственное ответ быстрее приходи, минуты через полторы.
Ладно, ответ слава богу приходит, однако после этого проблема не исчезает, всё тормозится жутко, невозможно. Приходится просто напросто перезагружать комп. В процессах смотрела, ничего даже память ни жрет, а процессор нагружен только лишь наполовину.
Это нормально? Вина в большом количестве записей таблицы?
Суть проблемы: база данных пытается загрузить как можно больше данных в оперативуню память, выдавливая их оператвки другие программы (операционную системы, вашу среду разработки, браузер с "вконтактом") . А все эти программы пытаются отвоевать себе какое-то место, выдавливая их памяти базу данных.
Действительно, процессор на этом не напрягается, напрягается жесткий диск.
Рецепт состоит из двух частей:
1. Сконфигурировать базу данных так, чтобы она не имела права жрать больше, например, полугигабайта оперативки
2. Проиндексирвать таблицу по полю, в котором содержится информация о том, что элемент - "последний" (что у Вас там, порядковый номер? Дата создания?)
Это не нормально. Выполнятся запрос должен почти мгновенно. Проблема судя по всему в том, что в вашем запросе последнего элемента не используются индексы.
Лучший способ узнать, что же на самом деле происходит - спросить MS SQL
В Microsoft SQL Server Managment Studio введите запрос, и перед выполнением зайдите в меню Query и включите Include Actual Execution Plan. После выполните запрос.
Вместе с результатом он покажет табличку в которой будет список шагов и сколько времени/ресурсов они потребовали. Вероятно для самой медленной операции придется сделать индекс. Ну или покажите ваш запрос, может быть нужно поменять его.
1. Подумай над запросом - возможно, есть способ вытащить первую/последнюю запись не перерывая все таблицу. Не помню я SQL, давно это было.
2. Используй асинхронную работу с БД - тогда программа виснуть не будет. В крайнем случае - выпихни все в новый поток.
3. Нет, естественно, это не нормально.
Согласна: проблема в индексах. В архивах, бывает, что индексов вообще нет, записали и забыли.
И + смотря, какой запрос? Если это не один примитвный select, а связанные таблицы, то надо разбираться с запросом. Например, часто помогает предварительный отбор, во временную таблицу.
Что, 120 записей, доолго получить последнюю?
Какойто обсурдишь
А пробовали ли вы один способ хороший, сортировка по id, Обратный метод, limit 1?