Доп. индексы в файл 1Cv7.DDS

Если у вас SQL версия 1с77, то в файле 1Cv7.DDS хранится структура-описание базы данных

#===============================================================================
#==TABLE no 11     : Справочник БанковскиеСчета
# Name    |Descr                         |SQLTableNam|RecordLock
T=SC1504  |Справочник БанковскиеСчета    |SC1504     |R         
#-----Fields-------
# Name                  |Descr               |Type|Length|Precision
F=ROW_ID                |Row ID              |I   |0     |0        
F=ID                    |ID object           |C   |9     |0        
F=CODE                  |object code         |C   |5     |0        
F=DESCR                 |object description  |C   |25    |0        
F=PARENTEXT             |Parent in other tabl|C   |9     |0        
F=ISMARK                |Object is Marked for|L   |0     |0        
F=VERSTAMP              |Version stamp       |I   |0     |0        
F=SP1498                |(P)Номер            |C   |20    |0        
F=SP1499                |(P)БанкОрганизации  |C   |9     |0        
F=SP1500                |(P)БанкДляРасчетов  |C   |9     |0        
F=SP1501                |(P)ДатаОткрытияСчета|D   |0     |0        
F=SP1502                |(P)ДатаЗакрытияСчета|D   |0     |0        
#----Indexes------
# Name                           |Descr         |Unique|Indexed fields                                              |Type       
I=PK_SC1504                      |Row Id        |1     |ROW_ID                                                      |1          
I=IDD                            |of ID         |1     |ID                                                          |0          
I=PCODE                          |of PARENT and |1     |PARENTEXT,CODE,ROW_ID                                       |0          
I=PDESCR                         |of PARENT and |1     |PARENTEXT,DESCR,ROW_ID                                      |0          
I=CODE                           |of CODE       |1     |CODE,ROW_ID                                                 |0          
I=DESCR                          |of DESCR      |1     |DESCR,ROW_ID                                                |0          
I=VI1498                         |VI1498        |1     |SP1498,ROW_ID                                               |0          
I=VIP1498                        |VIP1498       |1     |PARENTEXT,SP1498,ROW_ID                                     |0          
#

Вот например как описывается справочник БанковскиеСчета. Макроподстановки в «прямых запросах» так и работают, находят название, и подставляют таблицу.

В данный момент нам интересны индексы. Индексы используются для ускорения поиска в больших таблицах. Почему именно в больших? Да потому что запись-то страдает… нужно же еще и индекс обновить.

Вот реальный пример. Мне потребовалось искать документ по его номеру

#==TABLE no 3      : Журналы
# Name    |Descr                         |SQLTableNam|RecordLock
T=1SJOURN |Журналы                       |_1SJOURN   |R         
#-----Fields-------
# Name                  |Descr               |Type|Length|Precision
F=ROW_ID                |Row ID              |I   |0     |0        
F=IDJOURNAL             |ID of Journal       |I   |0     |0        
F=IDDOC                 |ID Document         |C   |9     |0        
F=IDDOCDEF              |ID Def Document     |I   |0     |0        
F=APPCODE               |App code            |S   |0     |0        
F=DATE_TIME_IDDOC       |Date+Time+IDDoc     |C   |23    |0        
F=DNPREFIX              |Prefix Document No  |C   |18    |0        
F=DOCNO                 |Document No         |C   |15    |0        

, использую запрос вида like, но вот незадача, выполнение запроса 1,5 секунды(!!!). Когда дополз до индекса, понял что подходящего индекса просто нет, поэтому тупо в лоб перебирается вся таблица…. (т.к. она же не отсортирована по номеру).

В общем создал индекс с данным столбцом

Через MS SQL Server Managment Studio (MS SSMS)

Или же запросом

USE [TEST1]
GO

BEGIN -- Таблица Журнал

-- Индекс "НомерДок"
IF NOT EXISTS(SELECT * FROM sys.indexes WHERE object_id = object_id('_1SJOURN') AND NAME ='ZZ__DocNumber')
	CREATE NONCLUSTERED INDEX ZZ__DocNumber ON [dbo].[_1SJOURN] 
	(
		DOCNO
	)
END

 

После создания индекса, запрос по номеру документа с 1,5 секунды стал выполняться 0,03 сек.

Но рано радоваться… У вас все получится если вы создавали индекс на запущенном предприятии, в ином случае при запуске в режиме не монопольно, вы получите ошибку нарушение целостности таблицы (Индекс есть, а описания нет….) Если зайдете монопольно, предприятие вообще грохнет индекс  😀 

Решение есть (не окончательное!!)

Добавляете в файл 1Cv7.DDS описание нового индекса

#==TABLE no 3      : Журналы
# Name    |Descr                         |SQLTableNam|RecordLock
T=1SJOURN |Журналы                       |_1SJOURN   |R         
#-----Fields-------
# Name                  |Descr               |Type|Length|Precision
F=ROW_ID                |Row ID              |I   |0     |0        
F=IDJOURNAL             |ID of Journal       |I   |0     |0        
F=IDDOC                 |ID Document         |C   |9     |0        
F=IDDOCDEF              |ID Def Document     |I   |0     |0        
F=APPCODE               |App code            |S   |0     |0        
F=DATE_TIME_IDDOC       |Date+Time+IDDoc     |C   |23    |0        
F=DNPREFIX              |Prefix Document No  |C   |18    |0        
F=DOCNO                 |Document No         |C   |15    |0        
F=CLOSED                |Flag document is clo|Y   |0     |0        
F=ISMARK                |Doc is Marked for De|L   |0     |0        
F=ACTCNT                |Action counter      |I   |0     |0        
F=VERSTAMP              |Version stamp       |I   |0     |0        
F=RF216                 |Reg Action Flag     |L   |0     |0        
F=RF582                 |Reg Action Flag     |L   |0     |0        
F=RF560                 |Reg Action Flag     |L   |0     |0        
F=RF569                 |Reg Action Flag     |L   |0     |0        
F=RF246                 |Reg Action Flag     |L   |0     |0        
F=RF305                 |Reg Action Flag     |L   |0     |0        
F=RF262                 |Reg Action Flag     |L   |0     |0        
F=RF813                 |Reg Action Flag     |L   |0     |0        
F=RF980                 |Reg Action Flag     |L   |0     |0        
F=RF1020                |Reg Action Flag     |L   |0     |0        
F=RF1395                |Reg Action Flag     |L   |0     |0        
F=RF1408                |Reg Action Flag     |L   |0     |0        
F=RF1554                |Reg Action Flag     |L   |0     |0        
F=RF1914                |Reg Action Flag     |L   |0     |0        
F=RF1942                |Reg Action Flag     |L   |0     |0        
F=RF2212                |Reg Action Flag     |L   |0     |0        
F=RF2419                |Reg Action Flag     |L   |0     |0        
F=RF2995                |Reg Action Flag     |L   |0     |0        
F=RF3935                |Reg Action Flag     |L   |0     |0        
F=SP98                  |(P)Фирма            |C   |9     |0        
F=SP658                 |(P)Точка            |C   |9     |0        
F=SP289                 |(P)ТипУчета         |C   |9     |0        
F=SP1212                |(P)Автор            |C   |9     |0        
F=SP2254                |(P)мбИдентификатор  |C   |50    |0        
F=DS284                 |Flag document in seq|Y   |0     |0        
F=DS581                 |Flag document in seq|Y   |0     |0        
#----Indexes------
# Name                           |Descr         |Unique|Indexed fields                                              |Type       
I=PK__1SJOURN                    |ROW_ID        |1     |ROW_ID                                                      |1          
I=IDDOC                          |Id Doc        |1     |IDDOC                                                       |0          
I=ACDATETIME                     |Date+Time+ID  |1     |DATE_TIME_IDDOC                                             |0          
I=DOCNO                          |Prefix+No     |1     |DNPREFIX,DOCNO,ROW_ID                                       |0          
I=DOCTYPE                        |Type+Date+Time|1     |IDDOCDEF,DATE_TIME_IDDOC                                    |0          
I=JOURNAL                        |Journal+Date+T|1     |IDJOURNAL,DATE_TIME_IDDOC                                   |0          
I=VIA98                          |VIA98         |1     |SP98,DATE_TIME_IDDOC                                        |0          
I=VIA658                         |VIA658        |1     |SP658,DATE_TIME_IDDOC                                       |0          
I=VIA289                         |VIA289        |1     |SP289,DATE_TIME_IDDOC                                       |0          
I=VIA1212                        |VIA1212       |1     |SP1212,DATE_TIME_IDDOC                                      |0          
I=VIA2254                        |VIA2254       |1     |SP2254,DATE_TIME_IDDOC                                      |0          
I=VIA284                         |VIA284        |0     |DS284,DATE_TIME_IDDOC                                       |0          
I=VIA581                         |VIA581        |0     |DS581,DATE_TIME_IDDOC                                       |0          
#Доп. индекс Журнал
I=ZZ__DocNumber                             |Номер документа                            |0     |DOCNO                                                  |0

Немного опишу:

Колонка Описание
I=ZZ__DocNumber название индекса после «=»
Номер документа описание, можно написать все что угодно, но постарайтесь немного
0  Уникальность индекса (соответствует галке MS SQL)
DOCNO столбцы из чего состоит индекс (описывайте ровно также, иначе верификацию не пройдете)
0 кластеризованный/не кластированный индекс. У вас будет некластеризованные индексы, т.к. второй создать нельзя

После сохранении, 1с будет считать что все хорошо. Будьте внимательны, индексы описывайте в конце. Я к примеру по данной таблице поставил индекс первым, в итоге поиск документа в журнале был по колонкам моего индекса. Долго понять не мог почему ошибка выскакивает, с профайлером разобрался.

После сохранении конфигурации вам (в момент реструктуризации, когда добавится/удалится какой либо объект), ваши данные слетят и придется заново добавлять эти изменения.

Как это автоматизировать, напишу позже в новой заметке.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *