Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Горячая тема (более 10 ответов) Свои индексы. Подводные камни? (число прочтений - 3128 )
trdm
1c++ power user
qt1l developer
1c++ moderator
Отсутствует



Сообщений: 2344
Местоположение: г. Ростов-на-Дону
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Свои индексы. Подводные камни?
04. Декабря 2006 :: 14:26
Печать  
Работают ТП, немного призадумался, у меня ведь идут многочисленные отборы по полям документов в ТП-журналах. Решил немного индексов повесить на поля табличек БД. Набросал нечто:
Код
Выбрать все
Перем гСписИндексныхПолей;
//*******************************************
Процедура Сформировать()

	гНаборЗаписей = СоздатьОбъект("ODBCRecordSet");
	гНаборЗаписей.УстБД1С();
	// надо определить
	СЦ = 0;
	Для СЦ = 1 По гСписИндексныхПолей.РазмерСписка() Цикл
		вОбъект = "";
		вПолеОб = гСписИндексныхПолей.ПолучитьЗначение(СЦ, вОбъект);

		ИдОбъекта = "";
		ИдРеквизита = "";
		вМетаДок = Метаданные.Документ(вОбъект);
		Если вМетаДок.Выбран() = 1 Тогда
			ИдПоля	= "";
		    ИдОбъекта = "DH"+глМетаДатаВерк.ИДДокумента(вОбъект);
			Если глЕстьРеквизитШапки(вПолеОб,вОбъект) <> Да Тогда
				Продолжить;
			КонецЕсли;
			ИдПоля	= "SP"+глМетаДатаВерк.ИДРеквизитаШапки(вОбъект,вПолеОб);

			вindex_name =    "_"+ИдОбъекта+"_"+ИдПоля;
			вТекстЗапроса = Шаблон("CREATE NONCLUSTERED INDEX [вindex_name] ON [ИдОбъекта] ( [ИдПоля] ASC ) ");
			Попытка
				Если гНаборЗаписей.ВыполнитьИнструкцию(вТекстЗапроса) = 1 Тогда
					Сообщить("Выполняется: "+ вТекстЗапроса,"i");
				Иначе
					Сообщить(гНаборЗаписей.ПолучитьОписаниеОшибки() ,"!");
				КонецЕсли;
			Исключение
				вСтрокаОшибки = ОписаниеОшибки();
				Если ПустоеЗначение(вСтрокаОшибки) = 0 Тогда
					Если Найти(вСтрокаОшибки,"already an index")>0 Тогда
						Сообщить("Индекс уже существует: " + глВСтроку3(вindex_name),"iii");
					Иначе
						Сообщить(ОписаниеОшибки(),"!!!");
					КонецЕсли;
				КонецЕсли;
			КонецПопытки;
		КонецЕсли;

	КонецЦикла;

КонецПроцедуры


//============================================================
Процедура ПриОткрытии()
	Если глЭтоСкуль = 0 Тогда
		Сообщить("РАботает только в SQl-версии!","!!");
	    СтатусВозврата(0); Возврат;
	КонецЕсли;

	гСписИндексныхПолей.ДобавитьЗначение("Клиент","РасходнаяНакладная");
	гСписИндексныхПолей.ДобавитьЗначение("СостояниеСборки","РасходнаяНакладная");
	гСписИндексныхПолей.ДобавитьЗначение("СостояниеДоставки","РасходнаяНакладная");

	гСписИндексныхПолей.ДобавитьЗначение("Клиент","РасходнаяРозничная");
	гСписИндексныхПолей.ДобавитьЗначение("СостояниеСборки","РасходнаяРозничная");
	гСписИндексныхПолей.ДобавитьЗначение("СостояниеДоставки","РасходнаяРозничная");
	гСписИндексныхПолей.ДобавитьЗначение("Касса","РасходнаяРозничная");
	гСписИндексныхПолей.ДобавитьЗначение("Склад","РасходнаяРозничная");

	гСписИндексныхПолей.ДобавитьЗначение("Клиент","Счет");
	гСписИндексныхПолей.ДобавитьЗначение("СостояниеСборки","Счет");

	гСписИндексныхПолей.ДобавитьЗначение("Клиент","ЗаявкаНаОтгрузкуЗаНал");


КонецПроцедуры // ПриОткрытии

гСписИндексныхПолей = СоздатьОбъект("СписокЗначений");
 


А вот какие меня ждут последствия от этого шага, увы не в полной мере предстваляю.
  
Наверх
IP записан
 
spock
1c++ developer
1c++ moderator
Отсутствует



Сообщений: 822
Местоположение: Новосибирск
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Свои индексы. Подводные камни?
Ответ #1 - 04. Декабря 2006 :: 15:35
Печать  
1. Создал индексы, а теперь запусти еще одного пользователя в базу Улыбка
2. Просто индекс на какое-то поле бесполезен, как минимум нужно делать (iddoc, spXXX);
3. Проверять наличие индекса через исключение - моветон.
Можно ведь так:
Код
Выбрать все
IF NOT EXISTS (SELECT name FROM sysindexes WHERE name = 'IX_NAME')
    CREATE INDEX ...
 

  
Наверх
ICQ  
IP записан
 
spock
1c++ developer
1c++ moderator
Отсутствует



Сообщений: 822
Местоположение: Новосибирск
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Свои индексы. Подводные камни?
Ответ #2 - 04. Декабря 2006 :: 15:43
Печать  
+п.2: а лучше сделать покрывающий индекс, чтобы не спускаться до страниц с данными, а выбирать с leaf-level - будет быстрее.
  
Наверх
ICQ  
IP записан
 
spock
1c++ developer
1c++ moderator
Отсутствует



Сообщений: 822
Местоположение: Новосибирск
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Свои индексы. Подводные камни?
Ответ #3 - 04. Декабря 2006 :: 15:45
Печать  
+п.1: а вот если прописать индекс в DDS, то будет все ОК.
  
Наверх
ICQ  
IP записан
 
Славко
Senior Member
****
Отсутствует



Сообщений: 467
Местоположение: Украина, г. Днепропетровск
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Свои индексы. Подводные камни?
Ответ #4 - 04. Декабря 2006 :: 16:12
Печать  
spock писал(а) 04. Декабря 2006 :: 15:45:
+п.1: а вот если прописать индекс в DDS, то будет все ОК.

не прописать, а постоянно прописывать при изменении МД-шника...
словарь данных то пресоздается...
  

Ламер, самый обычный ламер...    сначала мы ...   а потом мы ...
Наверх
wwwICQ  
IP записан
 
Arta
1c++ power user
Отсутствует



Сообщений: 2537
Местоположение: Нижний Новгород
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Свои индексы. Подводные камни?
Ответ #5 - 04. Декабря 2006 :: 16:26
Печать  
http://www.softpoint.ru/article_id15.htm

курим вот эту траву и радуемся.
8 месяцев - полет успешный.
  
Наверх
 
IP записан
 
spock
1c++ developer
1c++ moderator
Отсутствует



Сообщений: 822
Местоположение: Новосибирск
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Свои индексы. Подводные камни?
Ответ #6 - 04. Декабря 2006 :: 16:30
Печать  
Цитата:
а постоянно прописывать при изменении МД-шника...

это уже дело третье...
  
Наверх
ICQ  
IP записан
 
trdm
1c++ power user
qt1l developer
1c++ moderator
Отсутствует



Сообщений: 2344
Местоположение: г. Ростов-на-Дону
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Свои индексы. Подводные камни?
Ответ #7 - 04. Декабря 2006 :: 17:15
Печать  
spock писал(а) 04. Декабря 2006 :: 15:35:
1. Создал индексы, а теперь запусти еще одного пользователя в базу Улыбка
Попробовал, нормально в плане запуска работы, но поперли странные глюки:
1. 1С попросила зарегистрировать БД (я в недоумении)
2. При открытии списка баз там оказалось 50 % баз (я в недоумении) Быстро открыл стартовик и "потери" путей к БД не произошло...

2. Просто индекс на какое-то поле бесполезен, как минимум нужно делать (iddoc, spXXX);
Что ты имеешь ввиду? использование в запросах?
3. Проверять наличие индекса через исключение - моветон.
Можно ведь так:
Код
Выбрать все
IF NOT EXISTS (SELECT name FROM sysindexes WHERE name = 'IX_NAME')
    CREATE INDEX ...
 


Верно, собирался порыть структуру сервера на эту тему, а потом запамятовал...

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



Сообщений: 2344
Местоположение: г. Ростов-на-Дону
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Свои индексы. Подводные камни?
Ответ #8 - 04. Декабря 2006 :: 17:16
Печать  
Arta писал(а) 04. Декабря 2006 :: 16:26:
http://www.softpoint.ru/article_id15.htm
курим вот эту траву и радуемся.
8 месяцев - полет успешный.

Сенкс, хорошая травка, пожалуй и распечатаю, не считая того что в chm-ку закину....
  
Наверх
IP записан
 
spock
1c++ developer
1c++ moderator
Отсутствует



Сообщений: 822
Местоположение: Новосибирск
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Свои индексы. Подводные камни?
Ответ #9 - 04. Декабря 2006 :: 18:16
Печать  
При старте первого пользователя 1с-ка сверяет схему с метаданными, в т.ч. индексы.
Если индексы "родные" (есть в dds), то отлично. В противном случае ругается. В этом похоже на dbf-ный формат 1с.
  
Наверх
ICQ  
IP записан
 
trdm
1c++ power user
qt1l developer
1c++ moderator
Отсутствует



Сообщений: 2344
Местоположение: г. Ростов-на-Дону
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Свои индексы. Подводные камни?
Ответ #10 - 04. Декабря 2006 :: 18:46
Печать  
щет....
  
Наверх
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать