Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Работа с данными

Страница: 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-сайт: www.hypertech.ru
 Профиль | | #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;";)
";DSN=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-сайт: www.hypertech.ru
 Профиль | | #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-сайт: mc-black.narod.ru/dzp.htm
 Профиль | | #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=HEX;Database=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-сайт: mc-black.narod.ru/dzp.htm
 Профиль | | #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-сайт: mc-black.narod.ru/dzp.htm
 Профиль | | #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). А нельзя сделать интервал по пол часа или вообще по минутам?

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам