Страница: 1 |
Страница: 1 |
Вопрос: VBScript_SQLServer2000
Добавлено: 17.08.04 13:13
Автор вопроса:
St@s | ICQ: 289429121
Привет!
Работаю над архивом SCADA системы. Использую встроеный в SCADA систему VBScript и SQLServer 2000. Каждую секунду в БД записываются состояния всех объектов SCADA системы. Надо последовательно вычитывать строки из БД для просмотра состояния объектов за какой то промежуток времени, чтобы получилось типа "кино".
Есть проблемка в скорости вычитывания данных из БД.
В начале таблицы вычитывает быстро. Можно вести просмотр с интервалом в 1 секунду и меньше. Но если строк в таблице больше 50 тыс. скорость снижается.
Для доступа к БД использую следующий код:
Dim rs As Object
Set rs = CreateObject("ADODB.Recordset")
rs.open "day_" & user_dd, "DSN=movie;UID=;PWD=;", 0, 1, 2
...
hours = rs.fields("hour")
mins = rs.fields("min")
sec = rs.fields("sec")
...
Посоветуйте как быть.
Заранее спасибо.
Ответы
Всего ответов: 10
Номер ответа: 1
Автор ответа: boevik
Хранитель чата
ICQ: 137392264
Вопросов: 8
Ответов: 557
Web-сайт:
Профиль | | #1
Добавлено: 17.08.04 14:42
Делать select определенного времени, а не всей таблицы.
Для select-a так же рекомендуется добавить индекс по полям времени.
Номер ответа: 2
Автор ответа: St@s
ICQ: 289429121
Вопросов: 4
Ответов: 9
Профиль | | #2
Добавлено: 17.08.04 19:22
Пробую таким способом
Set rs = CreateObject("ADODB.Recordset"
Set rs.Open("Select * from day_ & user_dd where user_hh = hour and user_mm = min;"
"SN=movie;UID=;PWD=;", 0, 1, 2
Пишет Syntax error
Номер ответа: 3
Автор ответа: St@s
ICQ: 289429121
Вопросов: 4
Ответов: 9
Профиль | | #3
Добавлено: 18.08.04 13:34
Народ! Помогите разобраться! Нехотят у меня SQL запросы посылаться.
Номер ответа: 4
Автор ответа: boevik
Хранитель чата
ICQ: 137392264
Вопросов: 8
Ответов: 557
Web-сайт:
Профиль | | #4
Добавлено: 18.08.04 17:34
St@s, поподробнее
Номер ответа: 5
Автор ответа: St@s
ICQ: 289429121
Вопросов: 4
Ответов: 9
Профиль | | #5
Добавлено: 18.08.04 19:25
Постараюсь объяснить задачу. Есть БД в которой находится 31 таблица (каждому дню соответствует одна таблица). Если, например сегодня 18 число, то все изменения объектов (с интервалом в 1 с.) записываются в 18 таблицу и т.д. В конце месяца надо просмотреть какие были изменения 18 числа.
Пользователь вводит дату и время начала просмотра и смотрит как бы "кино", т.е. из БД вытягивается строчка за строчкой с интервалом в 1 с. начиная с того времени что ввел пользователь.
Все это надо сделать на VBScript с которым я плохо знаком.
Выше я уже указывал фрагменты кода.
Что там не так и как его можно улучшить.
Заранее спасибо!
Номер ответа: 6
Автор ответа: mc-black
ICQ: 308-534-060
Вопросов: 20
Ответов: 1860
Web-сайт:
Профиль | | #6
Добавлено: 19.08.04 13:24
Что означает day_ & user_dd? И интересно, куда выводится результат: какой объект использует результаты? Результат дописывается каждую секунду в конец, либо затирает данные о предыдущей секунде?
hours = rs.fields("hour"
mins = rs.fields("min"
sec = rs.fields("sec"
куда идут эти переменные (переменные?) дальше? Может в этом месте возникают тормоза?
Ошибка твоя исправляется так:
"Select * from day_ & user_dd where user_hh=" & hour & " and user_mm=" & min, т.к. это у тебя была простая статическая строка и переменные так не катят
Номер ответа: 7
Автор ответа: St@s
ICQ: 289429121
Вопросов: 4
Ответов: 9
Профиль | | #7
Добавлено: 19.08.04 15:57
Понял. Попробовал таким способом:
Dim rs As Object
Dim cn As Object
user_day = "day_" & user_dd
Set cn = CreateObject("Adodb.Connection"
cn.Provider = "sqloledb"
ProvStr = "Server=HEXatabase=mydb;UID=stas;pwd=123;"
cn.Open ProvStr
Set rs = CreateObject("ADODB.Recordset"
rs.ActiveConnection = cn
rs.open "select * from " & user_day & " where hour = " & hours.value & " And min = " & mins.value
...
Заработало. Спасибо. Скорость вычитывания одинаковая что в начале, что в конце таблицы. Пока устраивает. Посмотрим что будет дальше. Еще видел такое: rs.GetRows. Если такое есть, то как пользоваться.
Что означает day_ & user_dd? Таблицы в БД названы так: day_1, day_2, day_3 ... т.е. каждому дню своя таблица. В user_dd записывается номер таблицы.
Результат дописывается в конец таблицы каждую секунду. Также хочу сделать еще и запись по изменению.
hours = rs.fields("hour"
mins = rs.fields("min"
sec = rs.fields("sec"
motor1 = rs.field("motor1)
motor2 = rs.field("motor2"
motor3 = rs.field("motor3"
и т. д.
Эти переменные потом присваиваются графическим объектам для отображения архива.
Номер ответа: 8
Автор ответа: mc-black
ICQ: 308-534-060
Вопросов: 20
Ответов: 1860
Web-сайт:
Профиль | | #8
Добавлено: 20.08.04 12:46
Маладэц, чувак!
По поводу разгона запросов на скорость (тебе ведь надо чаще, чем раз в секунду? Вместо полей min, hour и дня месяца в названии таблиц лучше завести одно универсальное поле, допустим now_date_time с типом дата и время и сделать его индексом. Тогда твой запрос будет бежать по строчкам как ошпаренный
Я сейчас оптимизирую по скорости одну базу данных (она долго открывается кучей запросов из рекурсии), так вот, добавил ещё однин индекс в нужное поле и производительность повысилась ровно в 2 раза. Этого пока мало, ищу дополнительные пути...
Вернемся к твоей проге:
Dim date_time As Date
date_time = txtDataTime.Text
rs.open "select * from big_table where big_table.now_date_time>" & date_time & " and big_table.now_date_time<" DateAdd("hh",1,date_time)
rs.MoveFirst
Do While Not rs.EOF
...
rs.MoveNext
Loop
Т.е. задаешь дату и время для старта, формируешь затрос (ролик) интервалом 1 час (или сколько надо), посекундно перемещаешься в нем.
Номер ответа: 9
Автор ответа: mc-black
ICQ: 308-534-060
Вопросов: 20
Ответов: 1860
Web-сайт:
Профиль | | #9
Добавлено: 20.08.04 12:51
Интересно, что все-таки такое делаешь? Может сбросишь архивчик mc-black@yandex.ru, если это не коммерческая тайна?
Номер ответа: 10
Автор ответа: St@s
ICQ: 289429121
Вопросов: 4
Ответов: 9
Профиль | | #10
Добавлено: 26.08.04 17:47
Спасибо за пример запроса.
Пробовал его в Query Analyzer, работает. Запрос обрабативается 22 секунды. Пихаю в прогу, вешается. Может из-за того, что комп слабенький (533 Celeron). А нельзя сделать интервал по пол часа или вообще по минутам?