В общем досталась мне морока, из таблицы архивов вытаскивать последний элемент. Как это сделать - разобралась.
Но дело в том, что запрос этот выполняется что-то около двух минут, так как в таблице 120 миллионов записей. Во время того, как этот запрос обрабатывается, всё просто повисает, почти не реагирует ничего в системе, причем это и если я программно запрос посылаю (C++), и если обычно в Microsoft SQL Server Managment Studio. В менеджере единственное ответ быстрее приходи, минуты через полторы.
Ладно, ответ слава богу приходит, однако после этого проблема не исчезает, всё тормозится жутко, невозможно. Приходится просто напросто перезагружать комп. В процессах смотрела, ничего даже память ни жрет, а процессор нагружен только лишь наполовину.
Это нормально? Вина в большом количестве записей таблицы?
Другие языки программирования и технологии
Быстродействие падает, система виснет после запроса к базе SQL +++
Суть проблемы: база данных пытается загрузить как можно больше данных в оперативуню память, выдавливая их оператвки другие программы (операционную системы, вашу среду разработки, браузер с "вконтактом") . А все эти программы пытаются отвоевать себе какое-то место, выдавливая их памяти базу данных.
Действительно, процессор на этом не напрягается, напрягается жесткий диск.
Рецепт состоит из двух частей:
1. Сконфигурировать базу данных так, чтобы она не имела права жрать больше, например, полугигабайта оперативки
2. Проиндексирвать таблицу по полю, в котором содержится информация о том, что элемент - "последний" (что у Вас там, порядковый номер? Дата создания?)
Действительно, процессор на этом не напрягается, напрягается жесткий диск.
Рецепт состоит из двух частей:
1. Сконфигурировать базу данных так, чтобы она не имела права жрать больше, например, полугигабайта оперативки
2. Проиндексирвать таблицу по полю, в котором содержится информация о том, что элемент - "последний" (что у Вас там, порядковый номер? Дата создания?)
А он вам данные отдает или курсор визуального элемента на запись ставит? Если второе то немудрено что начинает тормозить...
Nurik Iz Kz
в sql студии то данные выдает, какие запросила. Запрос такой
SELECT TOP (1) Value,Seconds FROM SutvValueTable WHERE (DataIndex = 1) AND (RegionIndex = 1) ORDER BY Seconds DESC
SELECT TOP (1) Value,Seconds FROM SutvValueTable WHERE (DataIndex = 1) AND (RegionIndex = 1) ORDER BY Seconds DESC
Согласна: проблема в индексах. В архивах, бывает, что индексов вообще нет, записали и забыли.
И + смотря, какой запрос? Если это не один примитвный select, а связанные таблицы, то надо разбираться с запросом. Например, часто помогает предварительный отбор, во временную таблицу.
И + смотря, какой запрос? Если это не один примитвный select, а связанные таблицы, то надо разбираться с запросом. Например, часто помогает предварительный отбор, во временную таблицу.
Nurik Iz Kz
вот запрос:
SELECT TOP (1) Value,Seconds FROM SutvValueTable WHERE (DataIndex = 1) AND (RegionIndex = 1) ORDER BY Seconds DESC
SELECT TOP (1) Value,Seconds FROM SutvValueTable WHERE (DataIndex = 1) AND (RegionIndex = 1) ORDER BY Seconds DESC
1. Подумай над запросом - возможно, есть способ вытащить первую/последнюю запись не перерывая все таблицу. Не помню я SQL, давно это было.
2. Используй асинхронную работу с БД - тогда программа виснуть не будет. В крайнем случае - выпихни все в новый поток.
3. Нет, естественно, это не нормально.
2. Используй асинхронную работу с БД - тогда программа виснуть не будет. В крайнем случае - выпихни все в новый поток.
3. Нет, естественно, это не нормально.
Nurik Iz Kz
1. Вариант, будем думать, возможно это годится не для таких больших таблиц.
2. Да это понятно, запихнуть то можно в отдельный поток, возможно даже и нужно, если не найду решения более быстрого ответа. То что прога виснет, оно и понятно, меня смущает не это, а то что виснет вообще всё! Вся система. Ведь я даже и не программно когда посылаю запрос, через SQL менеджер, всё равно всё начинает висеть, тормозить, даже диспетчер не вызвать.
3. Так и знала (
2. Да это понятно, запихнуть то можно в отдельный поток, возможно даже и нужно, если не найду решения более быстрого ответа. То что прога виснет, оно и понятно, меня смущает не это, а то что виснет вообще всё! Вся система. Ведь я даже и не программно когда посылаю запрос, через SQL менеджер, всё равно всё начинает висеть, тормозить, даже диспетчер не вызвать.
3. Так и знала (
Что, 120 записей, доолго получить последнюю?
Какойто обсурдишь
А пробовали ли вы один способ хороший, сортировка по id, Обратный метод, limit 1?
Какойто обсурдишь
А пробовали ли вы один способ хороший, сортировка по id, Обратный метод, limit 1?
Nurik Iz Kz
120 миллионов записей
сортировка по id не вариант в таком случае, а вот про limit можно поподробнее? Где то наталкивалась на форуме, не поняла сути.
По сути мне нужно с конца таблицы проверять записи и вывести первую, которая будет удовлетворять условиям. Я вот так делаю :
SELECT TOP (1) Value,Seconds FROM SutvValueTable WHERE (DataIndex = 1) AND (RegionIndex = 1) ORDER BY Seconds DESC
но походу он нихрена не так срабатывает, судя по тому, сколько времени на это тратится.
сортировка по id не вариант в таком случае, а вот про limit можно поподробнее? Где то наталкивалась на форуме, не поняла сути.
По сути мне нужно с конца таблицы проверять записи и вывести первую, которая будет удовлетворять условиям. Я вот так делаю :
SELECT TOP (1) Value,Seconds FROM SutvValueTable WHERE (DataIndex = 1) AND (RegionIndex = 1) ORDER BY Seconds DESC
но походу он нихрена не так срабатывает, судя по тому, сколько времени на это тратится.
Это не нормально. Выполнятся запрос должен почти мгновенно. Проблема судя по всему в том, что в вашем запросе последнего элемента не используются индексы.
Лучший способ узнать, что же на самом деле происходит - спросить MS SQL
В Microsoft SQL Server Managment Studio введите запрос, и перед выполнением зайдите в меню Query и включите Include Actual Execution Plan. После выполните запрос.
Вместе с результатом он покажет табличку в которой будет список шагов и сколько времени/ресурсов они потребовали. Вероятно для самой медленной операции придется сделать индекс. Ну или покажите ваш запрос, может быть нужно поменять его.
Лучший способ узнать, что же на самом деле происходит - спросить MS SQL
В Microsoft SQL Server Managment Studio введите запрос, и перед выполнением зайдите в меню Query и включите Include Actual Execution Plan. После выполните запрос.
Вместе с результатом он покажет табличку в которой будет список шагов и сколько времени/ресурсов они потребовали. Вероятно для самой медленной операции придется сделать индекс. Ну или покажите ваш запрос, может быть нужно поменять его.
Nurik Iz Kz
вот запрос:
SELECT TOP (1) Value,Seconds FROM SutvValueTable WHERE (DataIndex = 1) AND (RegionIndex = 1) ORDER BY Seconds DESC
Нужно найти последнюю запись в таблице, удовлетворяющую условиям
SELECT TOP (1) Value,Seconds FROM SutvValueTable WHERE (DataIndex = 1) AND (RegionIndex = 1) ORDER BY Seconds DESC
Нужно найти последнюю запись в таблице, удовлетворяющую условиям
Nurik Iz Kz
89% на просмотр всего кластеризированного индекса
Nurik Iz Kz
Суть в том, что в этой архивной таблице хранятся данные о сигналах. У каждого сигнала двойной индекс - RegionIndex, DataIndex. Записей с такими индексами куча, так как она добавляются каждые 2 минуты. Архив суточный, но хранится месяц, вот и посчитайте сколько их там. Есть поля DayIndex и Seconds, указывающие день и время того, когда была занесена запись, вот по seconds и делаю order by. Мне нужно извлечь значение с определенными DataIndex, RegionIndex, которые были занесены в таблицу последними.
Nurik Iz Kz
По этим значениям я строю график с интервалом в 2 минуты. Вот такая задача.
DataIndex и RegionIndex всегда могут быть разными, т. к. потребоваться может инфа по любому сигналу.
Не оч понимаю про индексаю, к сожалению, ибо с БД так плотно не работала, обычно стандартные запросы были (
DataIndex и RegionIndex всегда могут быть разными, т. к. потребоваться может инфа по любому сигналу.
Не оч понимаю про индексаю, к сожалению, ибо с БД так плотно не работала, обычно стандартные запросы были (
Похожие вопросы
- Люди, знающие SQL, помогите сделать запрос.
- Невероятная ситуация с базами и запросами SQL
- Перечень допустимых функций в SQL-запросе ADO Jet 4.0 (MS Access)
- sql запрос как сделать предложение? Как написать девушке предложение выйти замуж с помощью SQL-запроса?
- SQL запрос в Acces
- В Delphi не работает SQL запрос.
- Помогите создать запрос на SQL
- помогите создать запрос в SQL!
- SQL запросы к внешним ключам
- Как легче создать большую базу данных в ACCESS 2010? Проблема вот в чем: сейчас б/д содержит 60 таблиц, 140 запросов. На
К сожалению, менять/добавлять/изменять саму таблицу мне нельзя.. она часть комплекса, который работает на этой базе уже больше десятка лет.