Переключение на Главную Страницу Страницы: [1] 2  ОтправитьПечать
Горячая тема (более 10 ответов) 1с77 + ms sql переоткрыть родной connect базы только на чтение (число прочтений - 5927 )
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
1с77 + ms sql переоткрыть родной connect базы только на чтение
05. Июня 2009 :: 06:07
Печать  
1с77 + ms sql переоткрыть родной connect базы только на чтение

Предположим есть пользователи которые формируют только отчеты.
Никаких изменений в документы и справочники они не вносят
и не запускают отчеты изменяющие данные.

Так вот если им сделать connect только на чтение теоретически
это повысит производительность , потому что оптимизатор запросов будет
знать что ничего не надо изменять в базе и как следсвие будет выполнять
sqlзапросы быстрее ( для соеденеий неродных я всегда ставлю readonly
если это можно по условию задачи).
Если ошибка в моих рассуждениях ?

Можно ли реализовать этуфункцию в 1с++ ?
ее надо будет запускать сразу же после загрузки
1с++ в модуле ПриНачалеРаботыСистемы.
Одна маленькая проблема при выходе из 1с
правиться _1susers можно либо забить на это либо сделать ReconnectNative
в модуле призавершенииработы

Реализовать вроде тоже не сложно т.к в 1с++ уже есть все "кусочки"
ReconnectNative
void CODBCDatabase::SetReadOnly(BOOL bReadOnly)

Хотелось бы услышать мнение ALL по subj
  
Наверх
 
IP записан
 
alexdd
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 347
Зарегистрирован: 25. Июня 2007
Re: 1с77 + ms sql переоткрыть родной connect базы только на чтение
Ответ #1 - 05. Июня 2009 :: 06:21
Печать  
Z1 писал(а) 05. Июня 2009 :: 06:07:
Так вот если им сделать connect только на чтение теоретически
это повысит производительность , потому что оптимизатор запросов будет
знать что ничего не надо изменять в базе и как следсвие будет выполнять
sqlзапросы быстрее ..

А повысит ли это производительность? Есть какая-то ссылка на документацию, описывающую этот момент? Имхо, оптимизатор получает конкретный батч и с ним работает соответствующим образом.
  
Наверх
 
IP записан
 
DmitrO
1c++ power user
Отсутствует


ex developer

Сообщений: 579
Местоположение: г. Киров
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: 1с77 + ms sql переоткрыть родной connect базы только на чтение
Ответ #2 - 05. Июня 2009 :: 06:36
Печать  
Мне кажется это никак не повысит производительность.
  
Наверх
ICQ  
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: 1с77 + ms sql переоткрыть родной connect базы только на чтение
Ответ #3 - 05. Июня 2009 :: 06:39
Печать  
alexdd писал(а) 05. Июня 2009 :: 06:21:
Z1 писал(а) 05. Июня 2009 :: 06:07:
Так вот если им сделать connect только на чтение теоретически
это повысит производительность , потому что оптимизатор запросов будет
знать что ничего не надо изменять в базе и как следсвие будет выполнять
sqlзапросы быстрее ..

А повысит ли это производительность? Есть какая-то ссылка на документацию, описывающую этот момент? Имхо, оптимизатор получает конкретный батч и с ним работает соответствующим образом.

Ссылки нет. Это мое мнение.
Т.к. оптимизатор достаточно умный ( в чем не раз уже убеждался в других задачах ) то имея информацию база только чтение оптимизатор может раньше освободить ресурсы выполненого запроса. Опять же если пользователь все таки обойдет разрешения и попытается что либо записать sql не даст это
сделать косвенно повышаем общую надежность.
  
Наверх
 
IP записан
 
sadovnikov
1c++ power user
Отсутствует


I Love YaBB 2!

Сообщений: 420
Зарегистрирован: 06. Марта 2007
Re: 1с77 + ms sql переоткрыть родной connect базы только на чтение
Ответ #4 - 15. Июня 2009 :: 11:00
Печать  
Что-то мне подсказывает, что NoLock спасет отца русской демократии...
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: 1с77 + ms sql переоткрыть родной connect базы только на чтение
Ответ #5 - 15. Июня 2009 :: 11:39
Печать  
sadovnikov писал(а) 15. Июня 2009 :: 11:00:
Что-то мне подсказывает, что NoLock спасет отца русской демократии...

нет не спасает.
Мои тесты показали что не влияет.
Я наоборот ставил только чтение и блокировал таблицы базы.
Блокировка спокойно устанавливалась.
Хотя другие параметры соедениения обязаны влиять на
поведение запросов например значения NULL в форме ANSI.
Моих знаний не хватает чтобы категорически подтвердить или
опровергнуть subj.

  
Наверх
 
IP записан
 
DmitrO
1c++ power user
Отсутствует


ex developer

Сообщений: 579
Местоположение: г. Киров
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: 1с77 + ms sql переоткрыть родной connect базы только на чтение
Ответ #6 - 17. Июня 2009 :: 05:57
Печать  
Z1, ты очень странно проводишь аналогию между режимом только_чтение и блокировками. (???)
Это вещи вобщем-то не связанные.
От того, что режим только_чтение, принципы блокирования при чтении никак не меняются, всегда остаются "грязное" (nolock - с минимальным блокированием) и "чистое" (блокирование управляется остальными хинтами) (holdlock - вообще будет до конца транзакции).
  
Наверх
ICQ  
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: 1с77 + ms sql переоткрыть родной connect базы только на чтение
Ответ #7 - 18. Июня 2009 :: 04:43
Печать  
Да нет я имел ввиду т.к. это соединение не будет ничего писать то ему и незачем выставлять хинты блокировок ( если только
для каких либо побочных эффектов).
Также пришел к выводу если соединение только чтение то все равно через хранимую процедуру можно выполнить оператор модифицирующий базу данных.
  
Наверх
 
IP записан
 
dnp
Senior Member
****
Отсутствует


.

Сообщений: 479
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: 1с77 + ms sql переоткрыть родной connect базы только на чтение
Ответ #8 - 18. Июня 2009 :: 06:07
Печать  
Писать это соединение не будет. А ему что-ли пофигу, если во время его чтения какая-то другая сессия будет писать в читаемое место? Прочитает часть старых данных и часть новых Улыбка
  
Наверх
ICQ  
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: 1с77 + ms sql переоткрыть родной connect базы только на чтение
Ответ #9 - 18. Июня 2009 :: 06:47
Печать  
dnp писал(а) 18. Июня 2009 :: 06:07:
Писать это соединение не будет. А ему что-ли пофигу, если во время его чтения какая-то другая сессия будет писать в читаемое место? Прочитает часть старых данных и часть новых Улыбка

так это зависит в общем случае от хинтов чтения и как эти хинты
соотносятся с выбранным индексом по которому формируется select.
И чтение этого соединения никак не зависит от того есть или
нет флага readonly.
Речь шла о том что если есть readonly у соединения то это соединение САМО не может ( точнее не должно накладывать блокировки ) оказалось что это сделать sql в общем случае не может - пример
хранимые процедуры.
Скорее всего флаг readonly действует на уровне odbc и запрещает
использовать sql операторы update,delete,insert на уровне
odbc ( т.е. odbc встретив эти команды сразу выдает ошибку).
  
Наверх
 
IP записан
 
alexdd
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 347
Зарегистрирован: 25. Июня 2007
Re: 1с77 + ms sql переоткрыть родной connect базы только на чтение
Ответ #10 - 18. Июня 2009 :: 20:55
Печать  
Z1 писал(а) 18. Июня 2009 :: 04:43:
если соединение только чтение то все равно через хранимую процедуру можно выполнить оператор модифицирующий базу данных.

значит MSSQL Server игнорирует этот атрибут, что собсно не противоречит документацииУлыбка
http://msdn.microsoft.com/en-us/library/ms713605.aspx
Атрибут SQL_ATTR_ACCESS_MODE:
..The behavior of the driver and data source when asked to process SQL statements that are not read-only during a read-only connection is implementation-defined..

т.е. драйвер сам по себе не запрещает никакие команды (insert/delete/update и т.д). Если сервер этот атрибут игнорирует, значит никакой оптимизации для read_only соединений нет.
Другое дело, если всю базу перевести в READ_ONLY, но это уже из другой оперы и не для 1СУлыбка
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: 1с77 + ms sql переоткрыть родной connect базы только на чтение
Ответ #11 - 19. Июня 2009 :: 03:45
Печать  
ну тогда читаем дальше документацию
Цитата:
SQL_ATTR_ACCESS_MODE (ODBC 1.0)


An SQLUINTEGER value. SQL_MODE_READ_ONLY is used by the driver or data source as an indicator that the connection is not required to support SQL statements that cause updates to occur. This mode can be used to optimize locking strategies, transaction management, or other areas as appropriate to the driver or data source. The driver is not required to prevent such statements from being submitted to the data source. The behavior of the driver and data source when asked to process SQL statements that are not read-only during a read-only connection is implementation-defined. SQL_MODE_READ_WRITE is the default.

ссылка http://msdn.microsoft.com/en-us/library/ms713605(VS.85).aspx
Т.е. все таки получается с этим флагом происходит ( может происходить) оптимизация блокировок ,управления транзакциями.

Что Вы после этой цитаты скажите о subj ?
  
Наверх
 
IP записан
 
alexdd
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 347
Зарегистрирован: 25. Июня 2007
Re: 1с77 + ms sql переоткрыть родной connect базы только на чтение
Ответ #12 - 19. Июня 2009 :: 07:55
Печать  
Z1 писал(а) 19. Июня 2009 :: 03:45:
ну тогда
Т.е. все таки получается с этим флагом происходит ( может происходить) оптимизация блокировок ,управления транзакциями.

Что Вы после этой цитаты скажите о subj ?

ну да, теоретически может, зависит от data source. Но мы же пришли к выводу, что этот флаг игнорируется. Я, к сожалению, не могу проверить, попробуйте установить атрибут в read_only, потом считать(SQLGetConnectAttr). Скорее всего, вернется 0, т.е. соединение вообще нельзя перевести в read_only для скл сервера. Или попробовать сделать update какой-нить. Короче, этот флаг, как я понимаю вообще ни на что не влияет для sql сервера.
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: 1с77 + ms sql переоткрыть родной connect базы только на чтение
Ответ #13 - 19. Июня 2009 :: 09:07
Печать  
Код
Выбрать все
Функция Соедениться_с_база(Зн_sql,Режим) Экспорт
// см ссылку http://www.connectionstrings.com/
		Имя0 = "...";
		Фл1 = Зн_sql.Соединение("DSN=" + Имя0 + ";UID=...;PWD=...;");
		Если Фл1 = 0 Тогда
			Сообщить("Не смогли открыть DSN для вечерней выписки = " + Имя0);
			Сообщить("ОШИБКА = " +  Зн_sql.ПолучитьОписаниеОшибки() );
			return 0;
		КонецЕсли;
		Если Режим = 1 Тогда
			Зн_sql.УстТолькоЧтение(1);
		КонецЕсли;
	return 1;
КонецФункции


Процедура Сформировать()
	sql = СоздатьОбъект("ODBCDatabase");
	rc = СоздатьОбъект("ODBCRecordSet");
	Если Соедениться_с_база(sql,ФлЧтение) = 0 Тогда
		Сообщить("не смогли свзаться с бд tetrad !!!");
		return;
	КонецЕсли;
	rc.УстБД(sql);
	Зн1 = 1 + 100*ФлЧтение;
	фл1 = rc.ВыполнитьСкалярный("insert into test_100 ( val100) values (" +  СокрЛП(Зн1) + " )");
    Сообщить("Фл1 = " + Фл1 + " Флаг только чтение = " + ФлЧтение);
	rc.Закрыть();
	sql.Закрыть();
КонецПроцедуры


Процедура Сформировать1()
	sql = СоздатьОбъект("ODBCDatabase");
	rc = СоздатьОбъект("ODBCRecordSet");
	Если Соедениться_с_база(sql,ФлЧтение) = 0 Тогда
		Сообщить("не смогли свзаться с бд tetrad !!!");
		return;
	КонецЕсли;
	rc.УстБД(sql);
	Если ФлЧтение = 0 Тогда
		Знач_1 = " < 100 ";
	Иначе
		Знач_1 = " > 100 ";
	КонецЕсли;
	Граница = 1 + 100*ФлЧтение;
	фл1 = rc.ВыполнитьСкалярный("Update  test_100 set val100 = val100 + 1 where val100 " + Знач_1);
    Сообщить("Фл1 = " + Фл1 + " Флаг только чтение = " + ФлЧтение);
	rc.Закрыть();
	sql.Закрыть();
КонецПроцедуры
 



Проверил Увы Проходит и Insert и Update.
Т.е. либо флаг не устанавливается либо игнорируется
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: 1с77 + ms sql переоткрыть родной connect базы только на чтение
Ответ #14 - 19. Июня 2009 :: 09:19
Печать  
Копаю дальше по моему ошибка в текстах 1с++
сейчас такой код
Код
Выбрать все
void CODBCDatabase::SetReadOnly(BOOL bReadOnly)
{
	SQLSetConnectAttr(m_hDbc, SQL_ATTR_ACCESS_MODE, (SQLPOINTER)(bReadOnly? SQL_MODE_READ_ONLY : SQL_MODE_READ_WRITE), 0);
}
 



Я считаю это баг ( ошибка 1с++ )
пример смотрел по ссылке http://msdn.microsoft.com/en-us/library/ms711810(VS.85).aspx
надо писать так

Код
Выбрать все
void CODBCDatabase::SetReadOnly(BOOL bReadOnly)
{
  SQLPOINTER rgbValue;
  int i;
  if ( bReadOnly == TRUE ) {
     i = SQL_MODE_READ_ONLY;
  }
  else {
     i = SQL_MODE_READ_WRITE;
  }

  rgbValue = &i;
  SQLSetConnectAttr(m_hDbc, SQL_ATTR_ACCESS_MODE, (SQLPOINTER)(rgbValue), 0);
}
 


Уважаемые разработчики 1с++ помогите разобраться
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: [1] 2 
ОтправитьПечать