Переключение на Главную Страницу Страницы: [1]  ОтправитьПечать
Очень популярная тема (более 25 ответов) часть 5 1с sql  таблицы rg изнутри (число прочтений - 15806 )
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
часть 5 1с sql  таблицы rg изнутри
26. Ноября 2008 :: 07:48
Печать  
Ломаю голову не могу понять
Зачем для таблиц rg...
сделан класторный индекс
Период,Измерение_1,Измерение_2,...,Измерение_N

Ведь эти таблицы Очень часто и сильно меняются.
Даже если у Вас месяц ТА совпадает с текущим то все равно
все время идет физическое перестроение этих таблиц и на этом
теряется очень много времени.
Далее существенный выигрыш от кластерного индекса
мы получим только если будем обходить rg таблицу строго в порядке
период,измерение_1,измерение_2,...., измерение_n
а ведь это далеко не всегда соответсвует действительности.

Может кто скажет в чем я прав а в чем ошибаюсь в этих рассуждениях.
  
Наверх
 
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: часть 5 1с sql  таблицы rg изнутри
Ответ #1 - 26. Ноября 2008 :: 07:57
Печать  
Z1 писал(а) 26. Ноября 2008 :: 07:48:
Ломаю голову не могу понять
Зачем для таблиц rg...
сделан класторный индекс
Период,Измерение_1,Измерение_2,...,Измерение_N

Ведь эти таблицы Очень часто и сильно меняются.
Даже если у Вас месяц ТА совпадает с текущим то все равно
все время идет физическое перестроение этих таблиц и на этом
теряется очень много времени.
Далее существенный выигрыш от кластерного индекса
мы получим только если будем обходить rg таблицу строго в порядке
период,измерение_1,измерение_2,...., измерение_n
а ведь это далеко не всегда соответсвует действительности.

Может кто скажет в чем я прав а в чем ошибаюсь в этих рассуждениях.


Ну сказал!
Да это основной индекс для проведения в реальном режиме! Самый разумный.
Например регистр остатков - Задано Период,Фирма,Номенклатура,Склад.
Селективность - 1 к 10 в n степени.
Если где неудачно(видимо нетиповые) - вручную поправляешь порядок следования измерений.
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: часть 5 1с sql  таблицы rg изнутри
Ответ #2 - 26. Ноября 2008 :: 08:05
Печать  
kiruha писал(а) 26. Ноября 2008 :: 07:57:
Z1 писал(а) 26. Ноября 2008 :: 07:48:
Ломаю голову не могу понять
Зачем для таблиц rg...
сделан класторный индекс
Период,Измерение_1,Измерение_2,...,Измерение_N

Ведь эти таблицы Очень часто и сильно меняются.
Даже если у Вас месяц ТА совпадает с текущим то все равно
все время идет физическое перестроение этих таблиц и на этом
теряется очень много времени.
Далее существенный выигрыш от кластерного индекса
мы получим только если будем обходить rg таблицу строго в порядке
период,измерение_1,измерение_2,...., измерение_n
а ведь это далеко не всегда соответсвует действительности.

Может кто скажет в чем я прав а в чем ошибаюсь в этих рассуждениях.


Ну сказал!
Да это основной индекс для проведения в реальном режиме! Самый разумный.
Например регистр остатков - Задано Период,Фирма,Номенклатура,Склад.
Селективность - 1 к 10 в n степени.
Если где неудачно(видимо нетиповые) - вручную поправляешь порядок следования измерений.

Разве ту же селективность не будет обеспечивать уникальный индекс ?
А что будет с попаданием в индекс для регистра при запросе на ТА ?

Группировка Склад
Группировка Номенклатура
  
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3051
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: часть 5 1с sql  таблицы rg изнутри
Ответ #3 - 26. Ноября 2008 :: 08:18
Печать  
а какой бы ты сделал кластерный индекс для этой таблицы?
и делал ли бы его вообще?
  

1&&2&&3
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: часть 5 1с sql  таблицы rg изнутри
Ответ #4 - 26. Ноября 2008 :: 08:22
Печать  
trad писал(а) 26. Ноября 2008 :: 08:18:
а какой бы ты сделал кластерный индекс для этой таблицы?
и делал ли бы его вообще?

Я не делал я думаю почему так сделано.
Какие от этого плюсы и минусы.

Ну и у меня очень много мыслей как сделать.
я за ними не совсем поспеваю.
Чтобы разобраться лучше как есть сейчас  - вот и спаршиваю.
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: часть 5 1с sql  таблицы rg изнутри
Ответ #5 - 26. Ноября 2008 :: 08:49
Печать  
Кстати когда востанавливаем последовательность из глубокого
прошлого вот эти таблицы rg круто "кобасятся".
Т.е. если оставлять индекс как есть то во время
монопольного восстановления гораздо быстрее ( с меньшей нагрузкой на sql) сделать так
предположим что перепроводим данные с 01.02.2008
1. удаляем все записи в rg c 01.02.2008
2. во время проведения НИЧЕГО не пишем в rg.
3. после проведения по ra востанавливаем rg для каждого
периода
01.02.2008 01.03.2008  ...  01.11.2008
  
Наверх
 
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: часть 5 1с sql  таблицы rg изнутри
Ответ #6 - 26. Ноября 2008 :: 09:33
Печать  
Z1 писал(а) 26. Ноября 2008 :: 08:05:
Разве ту же селективность не будет обеспечивать уникальный индекс ?
А что будет с попаданием в индекс для регистра при запросе на ТА ?

Группировка Склад
Группировка Номенклатура

1. Порядок группировок не имеет значения
2. Группирование достаточно низкозатратная операция . Может имелся ввиду отбор?
3. Если имелся ввиду "отбор" по  измерениям Склад, Номенклатура, то т.к.
Справочник Фирм маленький (как правило), то появляется реальная возможность задействовать индекс с попаданием в поля
Период,Фирма,Номенклатура,Склад - очень высокая селективность.

4. "эти таблицы rg круто "кобасятся"- ну вообще то т.к. упорядочение начинается с периода, а восстановление
идет от меньшего периода к большему -
то только меняются записи в части таблицы в момент расчета остатков на начало периода.

А при полном перепроведении - только добавляются записи в конец таблицы - быстрее трудно придумать
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: часть 5 1с sql  таблицы rg изнутри
Ответ #7 - 26. Ноября 2008 :: 09:43
Печать  
kiruha писал(а) 26. Ноября 2008 :: 09:33:
Z1 писал(а) 26. Ноября 2008 :: 08:05:
Разве ту же селективность не будет обеспечивать уникальный индекс ?
А что будет с попаданием в индекс для регистра при запросе на ТА ?

Группировка Склад
Группировка Номенклатура

4. "эти таблицы rg круто "кобасятся"- ну вообще то т.к. упорядочение начинается с периода, а восстановление
идет от меньшего периода к большему -
то только добавляются новые записи в конец таблицы в момент расчета остатков на начало периода. Быстрее трудно придумать.

Да но при этом записи в которые в следущем периоде все время сдвигаются вниз.
Далее смотри в одном периоде предположим что товары упорядочены и индексе по алфавиту
сначала накладная с товаром Швелер скажем 02.11
записали ее в тек период
далее накладная 03.11 накладная с товаром Арматура
чтобы записать этот результат в тек период ( если его там нет)
надо сдвинуть вниз Швелер.
А если точно также не попадет фирма то нам надо будет сдвинуть очень большой кусок данных

Насчет пунктов 1-3 буду думать.


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


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: часть 5 1с sql  таблицы rg изнутри
Ответ #8 - 26. Ноября 2008 :: 10:03
Печать  
Ты правда думаешь, что при изменении кластерного индекса записи перемещаются?  Ужас
  

пароль как коньяк, чем больше звездочек, тем лучше
Наверх
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: часть 5 1с sql  таблицы rg изнутри
Ответ #9 - 26. Ноября 2008 :: 10:09
Печать  
berezdetsky писал(а) 26. Ноября 2008 :: 10:03:
Ты правда думаешь, что при изменении кластерного индекса записи перемещаются?  Ужас

вообще то да. я только учусь
Даже если они (данные ) и не перемещаются а перемещаются только индексы
то для таблиц rg... размер индекса почти совпадает с размером данных а значит если перемещается только индекс то это
почти одно и тоже что и сказанное все выше.
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: часть 5 1с sql  таблицы rg изнутри
Ответ #10 - 26. Ноября 2008 :: 10:31
Печать  
Цитата:
Если первичный ключ таблицы является последовательным, сделайте его
некласторным первичным ключом. Кластерный индекс по монотонно возрастающему
ключу менее оптимален, поскольку вы, скорее всего, не будете осуществлять
запросы   на выборку диапозона ключей в ORDER BY.
Последовательный кластерный первичный ключ может привести к тому,
что пользователи будут претендовать на одну и ту же область в базе
данных при добавлении записей,  тем самым создавая горячую точку ( hotspot )
Кен Хендерсон
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re:
Ответ #11 - 26. Ноября 2008 :: 10:55
Печать  
Цитата:

Может быть, но для восстановления последовательности в монопольном режиме нам не нужны вообще никакие блокировки.

что то интернет сбойнул
пост berezdetsky пропал и его цитата тоже

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



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: часть 5 1с sql  таблицы rg изнутри
Ответ #12 - 26. Ноября 2008 :: 11:13
Печать  
Кстати, если уж об индексах регистров :

если в rg разработчики очень хорошо продумали индекс,
то в RA (таблица движений) - как будто индекс делал другой человек.

Кажется - возьми да повтори структуру как в rg.
Нет - лепят Цитата:
IDDOC,LINENO_,ACTNO
Кому нужен LINENO_,ACTNO ?
А чтобы провести задним числом приходится все таблицу считывать, да еще и большую часть журнала.
Лечится штатно установкой отбора движений, но в этом случае в отличии от rg -
попадание максимум в 2 поля.

Отсюда тормоза при проведении задним числом.
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: часть 5 1с sql  таблицы rg изнутри
Ответ #13 - 26. Ноября 2008 :: 11:21
Печать  
kiruha писал(а) 26. Ноября 2008 :: 11:13:
Кстати, если уж об индексах регистров :

если в rg разработчики очень хорошо продумали индекс,
то в RA (таблица движений) - как будто индекс делал другой человек.

Кажется - возьми да повтори структуру как в rg.
Нет - лепят Цитата:
IDDOC,LINENO_,ACTNO
Кому нужен LINENO_,ACTNO ?
А чтобы провести задним числом приходится все таблицу считывать, да еще и большую часть журнала.
Лечится штатно установкой отбора движений, но в этом случае в отличии от rg -
попадание максимум в 2 поля.

Отсюда тормоза при проведении задним числом.

не понял пересчитываются как раз rg а не ra
Индекс LINENO_,ACTNO нужен для

Регистр. ... .ПривязыватьСтроку(НомерСтроки);

а зачен нужен ПривязыватьСтроку не знаю.
наверное иак исторически сложилось
а потом оставили все как есть.

этот индекс помогает если у Вас слетел флаг rf
( тоглько аппаратный сбой ) а движения остались нельзя провести документ не разобравшись - дубль ключей возникает
так что вроде как нужен.
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: часть 5 1с sql  таблицы rg изнутри
Ответ #14 - 26. Ноября 2008 :: 11:31
Печать  
А по моему наоборот для RA очень хороший индекс так как
IDDOC единственен и селективность самая хорошая супер.

и ситуация следущая при любой реализации в ra может писать
только один кто "владеет" документом,
а в rg  стучаться все даже если у Вас период один = месяц ТА
и при этом нехило колбасят либо саму rg либо ее кластерный индекс.
  
Наверх
 
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Re:
Ответ #15 - 26. Ноября 2008 :: 12:04
Печать  
Z1 писал(а) 26. Ноября 2008 :: 10:55:
что то интернет сбойнул
пост berezdetsky пропал и его цитата тоже

Это я сам его удалил, чтобы не начинать холивар - Хендерсона многие воспринимают как догму.

Z1 писал(а) 26. Ноября 2008 :: 11:31:
А по моему наоборот для RA очень хороший индекс так как
IDDOC единственен и селективность самая хорошая супер.

и ситуация следущая при любой реализации в ra может писать
только один кто "владеет" документом,
а в rg  стучаться все даже если у Вас период один = месяц ТА
и при этом нехило колбасят либо саму rg либо ее кластерный индекс.

Т.е. в RA "последовательный кластерный первичный ключ" - это супер, а в RG - нет?  Подмигивание

+ последовательный индекс колбасит гораздо меньше, чем какой нибудь GUID..
  

пароль как коньяк, чем больше звездочек, тем лучше
Наверх
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Re:
Ответ #16 - 26. Ноября 2008 :: 12:14
Печать  
berezdetsky писал(а) 26. Ноября 2008 :: 12:04:
Z1 писал(а) 26. Ноября 2008 :: 10:55:
что то интернет сбойнул
пост berezdetsky пропал и его цитата тоже

Это я сам его удалил, чтобы не начинать холивар - Хендерсона многие воспринимают как догму.

Z1 писал(а) 26. Ноября 2008 :: 11:31:
А по моему наоборот для RA очень хороший индекс так как
IDDOC единственен и селективность самая хорошая супер.

и ситуация следущая при любой реализации в ra может писать
только один кто "владеет" документом,
а в rg  стучаться все даже если у Вас период один = месяц ТА
и при этом нехило колбасят либо саму rg либо ее кластерный индекс.

Т.е. в RA "последовательный кластерный первичный ключ" - это супер, а в RG - нет?  Подмигивание

+ последовательный индекс колбасит гораздо меньше, чем какой нибудь GUID..

И да и нет.
В ra мы записали и забыли, а в rg еще надо сделать +.
причем в ra iddoc единственен ( первое поле ключа а ведь по нему идет основная селективность)
а записей в периоде rg   поле PERIOD очень много.
Также в ra длина записи может быть намного больше длины ключа
а в rg  длина записи практически совпадает с длиной ключа.
  
Наверх
 
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: часть 5 1с sql  таблицы rg изнутри
Ответ #17 - 26. Ноября 2008 :: 12:37
Печать  
Z1 писал(а) 26. Ноября 2008 :: 11:21:
kiruha писал(а) 26. Ноября 2008 :: 11:13:
Кстати, если уж об индексах регистров :

если в rg разработчики очень хорошо продумали индекс,
то в RA (таблица движений) - как будто индекс делал другой человек.

Кажется - возьми да повтори структуру как в rg.
Нет - лепят Цитата:
IDDOC,LINENO_,ACTNO
Кому нужен LINENO_,ACTNO ?
А чтобы провести задним числом приходится все таблицу считывать, да еще и большую часть журнала.
Лечится штатно установкой отбора движений, но в этом случае в отличии от rg -
попадание максимум в 2 поля.

Отсюда тормоза при проведении задним числом.

не понял пересчитываются как раз rg а не ra
Индекс LINENO_,ACTNO нужен для

Регистр. ... .ПривязыватьСтроку(НомерСтроки);

а зачен нужен ПривязыватьСтроку не знаю.
наверное иак исторически сложилось
а потом оставили все как есть.

этот индекс помогает если у Вас слетел флаг rf
( тоглько аппаратный сбой ) а движения остались нельзя провести документ не разобравшись - дубль ключей возникает
так что вроде как нужен.


Ну типичная ситуация.
Провожу задним числом.
Нужен остаток товара "Бутылка".
Как будет производится расчет с таким индексом?
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: часть 5 1с sql  таблицы rg изнутри
Ответ #18 - 26. Ноября 2008 :: 12:52
Печать  
kiruha писал(а) 26. Ноября 2008 :: 12:37:
Z1 писал(а) 26. Ноября 2008 :: 11:21:
kiruha писал(а) 26. Ноября 2008 :: 11:13:
Отсюда тормоза при проведении задним числом.



Ну типичная ситуация.
Провожу задним числом.
Нужен остаток товара "Бутылка".
Как будет производится расчет с таким индексом?

Остаток на какую дату?
и вообще если Вы перепроводите сегодня 26.11.2008 документ за 01.02.2008 год еще очень и очень большой вопрос нужно или нет считать этот остаток.
Опять же при проведении переколбашивание индекса не зависит считаете Вы или нет остаток в модуле проведения.
в периоде много записей  Бутылка может оказаться и последним товаром  в текущем периоде.
  
Наверх
 
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: часть 5 1с sql  таблицы rg изнутри
Ответ #19 - 26. Ноября 2008 :: 12:57
Печать  
Z1 писал(а) 26. Ноября 2008 :: 12:52:
Остаток на какую дату?
и вообще если Вы перепроводите сегодня 26.11.2008 документ за 01.02.2008 год еще очень и очень большой вопрос нужно или нет считать этот остаток.
Опять же при проведении переколбашивание индекса не зависит считаете Вы или нет остаток в модуле проведения.
в периоде много записей  Бутылка может оказаться и последним товаром  в текущем периоде.


На 15 ноября 2008.
Остаток на 1 ноября будем считать известным - т.е. только данные из RA.
500 док. в день.
Фирма , склад - заданы.
Вопрос о допустимости проведения опустим - интересует только техническая сторона вопроса.
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: часть 5 1с sql  таблицы rg изнутри
Ответ #20 - 26. Ноября 2008 :: 13:17
Печать  
kiruha писал(а) 26. Ноября 2008 :: 12:57:
Z1 писал(а) 26. Ноября 2008 :: 12:52:
Остаток на какую дату?
и вообще если Вы перепроводите сегодня 26.11.2008 документ за 01.02.2008 год еще очень и очень большой вопрос нужно или нет считать этот остаток.
Опять же при проведении переколбашивание индекса не зависит считаете Вы или нет остаток в модуле проведения.
в периоде много записей  Бутылка может оказаться и последним товаром  в текущем периоде.


На 15 ноября 2008.
Остаток на 1 ноября будем считать известным - т.е. только данные из RA.
500 док. в день.
Фирма , склад - заданы.
Вопрос о допустимости проведения опустим - интересует только техническая сторона вопроса.

ах вот Вы о чем ну от этого никуда не деться и придеться пересчитать по ra c 01.11 по 15.11 простым сканированием соеденившись с jornl( поэтому 1с и рекомендует брать остатки на ta)
и мое утверждение не протеворечит Вашему если Вам надо считать
очень и очень часто остатки в середине месяца то нужен индекс
товар ... Также сначала нужно получить
значение остатка этой бутылки на 01.11 а для этого надо найти ее
сначала в rg а  на это  тоже нужно время найтись.
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: часть 5 1с sql  таблицы rg изнутри
Ответ #21 - 26. Ноября 2008 :: 13:48
Печать  
даже если говорить об отрицательных остатках то можно считать
что мы их проверяем в половине документов ( лукавлю конечно приход крупнее чем расход ) но перестроение кластерного индекса
будет происходить всегда ( таблицы  rg ). даже когда у Вас только
приход.
по поводу отрицат остатков также два соображения  УРБД может
вносить искажения это раз

Соображение номер 2 а не слишком ли дорого считать отрицательные остатки в модуле проведения в открытой транзакции - может это тоже вынести как отдельный  subj ?
Речь естественно идет когда у нас очень дикие нагрузки на базу.

И основной вопрос этого subj  зачем  именно Кластерный по rg
  
Наверх
 
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: часть 5 1с sql  таблицы rg изнутри
Ответ #22 - 26. Ноября 2008 :: 14:15
Печать  
Z1 писал(а) 26. Ноября 2008 :: 13:48:
И основной вопрос этого subj  зачем  именно Кластерный по rg



Цитата:
По неизвестной мне причине, казалось бы уже миллион раз поднятый и разобранный вопрос о правильном использовании кластерного индекса поднимается вновь и вновь, и, что самое удивительное, наружу выплывают все те же старые мифы...

1. Кластерный индекс физически упорядочивает записи, строго в порядке определяемом ключевыми полями индекса.

2. Кластерный индекс черезвычайно дорог при вставке и изменении.

3. Кластерный индекс обязательно должен быть построен по Primary Key, причем, лучше всего, если этот PK является Identity столбцом.

См Телега о кластерном индексе
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: часть 5 1с sql  таблицы rg изнутри
Ответ #23 - 26. Ноября 2008 :: 14:34
Печать  
Статью прочитал мысль автора понятна и правильна.
Получается если мы перепроводим сейчас накладную за 03.02.2008
то возможны ситуации по таблице  rg :
1. это update и индекс не измениться
2. если это несколько insert то индекс влезет в туже страницу из-за
фрагментации
3. если индекс не влезет в нужную страницу вот только в этом случае будет пересчет индекса - но тогда уж пересчет так пересчет.
Вероятность невлезания возрастает вызвана еще и тем что insert идет
и в февраль,март,апрель,май,июнь,июль,август,сентябрь,октябрь,ноябрь

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


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: часть 5 1с sql  таблицы rg изнутри
Ответ #24 - 26. Ноября 2008 :: 14:51
Печать  
Цитата:
Ну тогда также не понятно чем кластерный индекс отличается от некластерного уникального.

У обычного индекса на уровне листьев находится ключ индекса и row id данных, а у кластерного там непосредственно данные. Только и всего..
  

пароль как коньяк, чем больше звездочек, тем лучше
Наверх
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: часть 5 1с sql  таблицы rg изнутри
Ответ #25 - 26. Ноября 2008 :: 14:54
Печать  
berezdetsky писал(а) 26. Ноября 2008 :: 14:51:
Цитата:
Ну тогда также не понятно чем кластерный индекс отличается от некластерного уникального.

У обычного индекса на уровне листьев находится ключ индекса и row id данных, а у кластерного там непосредственно данные. Только и всего..

Ты же сам вроде говорил в этой ветке  что индекс отдельно а данные тоже отдельно. см пост 8.
  
Наверх
 
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: часть 5 1с sql  таблицы rg изнутри
Ответ #26 - 26. Ноября 2008 :: 15:09
Печать  
Z1 писал(а) 26. Ноября 2008 :: 14:54:
Ты же сам вроде говорил в этой ветке  что индекс отдельно а данные тоже отдельно. см пост 8.

Там сказано только то, что сказано. Не надо приписывать мне свои мысли. В кластерном индексе данные смешаны с индексом - по-этому он и называется "кластерный".
  

пароль как коньяк, чем больше звездочек, тем лучше
Наверх
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: часть 5 1с sql  таблицы rg изнутри
Ответ #27 - 26. Ноября 2008 :: 15:40
Печать  
Тогда получается что  kiruha прав и индекс для rg сделан в 1с
хорошо и проблемы могут возникнуть только если мы залезаем в глубое прошлое и что-то там перепроводим.
Для ra тоже все ok c идексом так как ID документа не меняется
и все движения ra будут на одной или нескольких близких
страницах.
Если же нужны какие-то условия ускоряющие выбор остатков
например по конкретному товару то нужно взвешено выбирать между новым индексом или скоростью получения
остатка на любую дату.
  
Наверх
 
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: часть 5 1с sql  таблицы rg изнутри
Ответ #28 - 26. Ноября 2008 :: 15:54
Печать  
А для чего еще нужен индекс в таблице движений регистра -
чтобы либо быстро рассчитывать остатки, либо быстро смотреть движения в отчетах.
И то и другое родной индекс 1С (в RA) делает плохо.

Разумно в регистрах ставить "отбор движений" по Номенклатуре и Контрагент(или соответственно Договор)
По умолчанию в 1С этих отборов нет - видимо ориентация на мелкие фирмы.
  
Наверх
 
IP записан
 
DmitrO
1c++ power user
Отсутствует


ex developer

Сообщений: 579
Местоположение: г. Киров
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: часть 5 1с sql  таблицы rg изнутри
Ответ #29 - 26. Ноября 2008 :: 15:58
Печать  
Z1 писал(а) 26. Ноября 2008 :: 14:34:
2. если это несколько insert то индекс влезет в туже страницу из-за
фрагментации
3. если индекс не влезет в нужную страницу вот только в этом случае будет пересчет индекса - но тогда уж пересчет так пересчет.
Вероятность невлезания возрастает вызвана еще и тем что insert идет
и в февраль,март,апрель,май,июнь,июль,август,сентябрь,октябрь,ноябрь

Fill Factor. Рекомендую ознакомиться в BOL.
  
Наверх
ICQ  
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: часть 5 1с sql  таблицы rg изнутри
Ответ #30 - 26. Ноября 2008 :: 16:00
Печать  
kiruha писал(а) 26. Ноября 2008 :: 15:54:
А для чего еще нужен индекс в таблице движений регистра -
чтобы либо быстро рассчитывать остатки, либо быстро смотреть движения в отчетах.
И то и другое родной индекс 1С (в RA) делает плохо.

Разумно в регистрах ставить "отбор движений" по Номенклатуре и Контрагент(или соответственно Договор)
По умолчанию в 1С этих отборов нет - видимо ориентация на мелкие фирмы.

не только. Может исходили из того т что выбрать остатки только из
rg гораздо лучше и быстрее чем из двух таблиц rg и ra.
а если строиться матерьяльная ведомость то все равно сканируется весь ra по датам.
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: часть 5 1с sql  таблицы rg изнутри
Ответ #31 - 26. Ноября 2008 :: 16:02
Печать  
И еще 1с конструктор - универсальное решение и пограничные случаи выпадают  Смех
  
Наверх
 
IP записан
 
spock
1c++ developer
1c++ moderator
Отсутствует



Сообщений: 822
Местоположение: Новосибирск
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: часть 5 1с sql  таблицы rg изнутри
Ответ #32 - 26. Ноября 2008 :: 16:14
Печать  
kiruha писал(а) 26. Ноября 2008 :: 15:54:
А для чего еще нужен индекс в таблице движений регистра -
чтобы либо быстро рассчитывать остатки, либо быстро смотреть движения в отчетах.
И то и другое родной индекс 1С (в RA) делает плохо.

а можно это утверждение развернуть тезисно.
  
Наверх
ICQ  
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: часть 5 1с sql  таблицы rg изнутри
Ответ #33 - 27. Ноября 2008 :: 05:10
Печать  
spock писал(а) 26. Ноября 2008 :: 16:14:
kiruha писал(а) 26. Ноября 2008 :: 15:54:
А для чего еще нужен индекс в таблице движений регистра -
чтобы либо быстро рассчитывать остатки, либо быстро смотреть движения в отчетах.
И то и другое родной индекс 1С (в RA) делает плохо.

а можно это утверждение развернуть тезисно.

смотри что писал kiruha.
Если нужен остаток товара "бутылка" на 15.11 мы сначала
должны найти по rg найти остаток на 01.11 после этого переберать всю ra до 15 числа вычисляяя остаток бутылка.
Без индекса по ra ( движения региста) этот перебор долгий когда этих движений много.
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: часть 5 1с sql  таблицы rg изнутри
Ответ #34 - 27. Ноября 2008 :: 05:22
Печать  
kiruha писал(а) 26. Ноября 2008 :: 15:54:
А для чего еще нужен индекс в таблице движений регистра -
чтобы либо быстро рассчитывать остатки, либо быстро смотреть движения в отчетах.
И то и другое родной индекс 1С (в RA) делает плохо.

Разумно в регистрах ставить "отбор движений" по Номенклатуре и Контрагент(или соответственно Договор)
По умолчанию в 1С этих отборов нет - видимо ориентация на мелкие фирмы.

посмотрел но ведь в регистре остатоков есть
а - быстрая обработка движений добавляет datetime_id_doc в индекс вместо iddoc
б - отбор движений вот он то и создает индекс по измерению
или по реквизиту регистра
индекс равен = ( измерение,кластер индекс )

также можно создать дополнительный индекс и по rg итоги
индекс = период, измерение.

Я придумал ведь еще можно по измерению регистра создать индекс
как "графа отбора 1с" можно посмотреть что он при этом понасоздает - для моих задач это точно не нужно



Так что получается с индексами для регистра внутри 1с все в порядке создавай обдуманно какие тебе нужны
  
Наверх
 
IP записан
 
spock
1c++ developer
1c++ moderator
Отсутствует



Сообщений: 822
Местоположение: Новосибирск
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: часть 5 1с sql  таблицы rg изнутри
Ответ #35 - 27. Ноября 2008 :: 05:32
Печать  
Z1 писал(а) 27. Ноября 2008 :: 05:10:
Если нужен остаток товара "бутылка" на 15.11 мы сначала
должны найти по rg найти остаток на 01.11 после этого переберать всю ra до 15 числа вычисляяя остаток бутылка.
Без индекса по ra ( движения региста) этот перебор долгий когда этих движений много.

На примере гипотетического регистра ОстаткиТоваров (Товар, Склад, Фирма):
Порядок расстановки измерений в регистре: Товар, Склад, Фирма. У всех выставлены отборы итогов и движений.
В итоге получаем индексы такие:
1. для RA:
  • iddoc + lineno_ + actno (I)
  • date_time_iddoc + lineno_ + actno (II)
  • Товар + date_time_iddoc + lineno_ + actno (III)
  • Склад + date_time_iddoc + lineno_ + actno (IV)
  • Фирма + date_time_iddoc + lineno_ + actno (V)

2. Для RG:
  • period + Товар + Склад + Фирма (I)
  • period + Склад (II)
  • period + Фирма (III)


И для случая, что нужен остаток для "бутылка" на 15.11 будет так:
1. Получаем остаток из RG на 01.11 по товару "бутылка" -> попадаем в индекс RG_(I), взяли данные крайне дешево.
2. Получаем движения из RA от 01.11 по 15.11 для товара "бутылка" -> попадаем в индекс RA_(III), тоже взяли данные ранжированием очень дешево.
3. Объединили агрегированием и получили результат.
  
Наверх
ICQ  
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: часть 5 1с sql  таблицы rg изнутри
Ответ #36 - 27. Ноября 2008 :: 05:41
Печать  
ну и я о том же.
Так что пусть kiruha сам поясняет что он имеет ввиду.
я думаю что он бы хотел наверное индекс
( товар,склад,кластерный индекс) чтобы еще быстрее вычислять остаток товара бутылка на заданном складе на 15 число.
или
( период,товар,склад,кластерный индекс) чтобы еще быстрее вычислять остаток товара бутылка на заданном складе на 15 число.

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



Сообщений: 822
Местоположение: Новосибирск
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: часть 5 1с sql  таблицы rg изнутри
Ответ #37 - 27. Ноября 2008 :: 05:46
Печать  
Есть мнение, что требуется все-таки заглянуть хотя бы в EM (Enterprise Manager) на предмет ознакомления со структурой индексов регистров.
  
Наверх
ICQ  
IP записан
 
leshik
1c++ donor
Отсутствует



Сообщений: 820
Местоположение: Пятигорск
Зарегистрирован: 22. Апреля 2007
Пол: Мужской
Re: часть 5 1с sql  таблицы rg изнутри
Ответ #38 - 27. Ноября 2008 :: 06:47
Печать  
spock писал(а) 27. Ноября 2008 :: 05:46:
Есть мнение, что требуется все-таки заглянуть хотя бы в EM (Enterprise Manager) на предмет ознакомления со структурой индексов регистров.

Добавлю от себя, что уважаемому Z1 неплохо бы ознакомиться с
http://www.sql.ru/articles/mssql/03013101Indexes.shtml
а также просмотреть форум на SQL.RU на предмет
http://www.sql.ru/forum/actualtopics.aspx?search=%EA%EB%E0%F1%F2%E5%F0%ED%FB%E9+...
И очень хотелось бы не просто теоретических обоснований, а с приведением планов запросов, DURATION запросов и их COST из планов.
  
Наверх
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: часть 5 1с sql  таблицы rg изнутри
Ответ #39 - 27. Ноября 2008 :: 06:50
Печать  
leshik писал(а) 27. Ноября 2008 :: 06:47:
spock писал(а) 27. Ноября 2008 :: 05:46:
Есть мнение, что требуется все-таки заглянуть хотя бы в EM (Enterprise Manager) на предмет ознакомления со структурой индексов регистров.

Добавлю от себя, что уважаемому Z1 неплохо бы ознакомиться с
http://www.sql.ru/articles/mssql/03013101Indexes.shtml
а также просмотреть форум на SQL.RU на предмет
http://www.sql.ru/forum/actualtopics.aspx?search=%EA%EB%E0%F1%F2%E5%F0%ED%FB%E9+...
И очень хотелось бы не просто теоретических обоснований, а с приведением планов запросов, DURATION запросов и их COST из планов.

спасибо буду читать
  
Наверх
 
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: часть 5 1с sql  таблицы rg изнутри
Ответ #40 - 27. Ноября 2008 :: 07:54
Печать  
Z1 писал(а) 27. Ноября 2008 :: 05:41:
ну и я о том же.
Так что пусть kiruha сам поясняет что он имеет ввиду.



Да я имел ввиду простую вещь.
По умолчанию в типовых в RA стоит только один индекс iddoc + lineno_ + actno (I).
И что этого индекса не достаточно.

Индекс
Товар + date_time_iddoc + lineno_ + actno (III)
нужно добавлять правкой конфигурации, о чем и писал :
kiruha писал(а) 26. Ноября 2008 :: 15:54:
Разумно в регистрах ставить "отбор движений" по Номенклатуре и Контрагент(или соответственно Договор)
По умолчанию в 1С этих отборов нет - видимо ориентация на мелкие фирмы.


Извиняюсь, если писал достаточно непонятно.
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: часть 5 1с sql  таблицы rg изнутри
Ответ #41 - 28. Ноября 2008 :: 05:11
Печать  
Почитав про индексы в  MS SQL я немного понял в чем я заблуждался.
Я представлял  индексы как линейный список, а индексы устроены  хитрее, лучше ( B-деревья).
А индекс как список можно рассматривать только на логическом уровне.

И БОЛЬШОЙ пересчет индексов идет только во время подгрузки УРБД, для всех остальных случаях при правельной фрагментации индексов сами индексы перестраивается очень быстро.
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: часть 5 1с sql  таблицы rg изнутри
Ответ #42 - 28. Ноября 2008 :: 06:07
Печать  
и еще вопрос предположим что у нас есть регистр
остатки с такой структурой
Фирма,Номенклатура,Склад и если нам надо очень  быстро получать остатки Номенклатура,Склад на произвольную дату
текущего месяца то самый быстрsй для этого индекс будет
по таблице Ra
Товар,Склад,Date_Time_IDDOC desc

просто в статье сказано что составной индекс быстее чем
несколько отдельных индекса.
или я все равно где=то ошибаюсь ?
  
Наверх
 
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: часть 5 1с sql  таблицы rg изнутри
Ответ #43 - 28. Ноября 2008 :: 11:33
Печать  
Z1 писал(а) 28. Ноября 2008 :: 06:07:
и еще вопрос предположим что у нас есть регистр
остатки с такой структурой
Фирма,Номенклатура,Склад и если нам надо очень  быстро получать остатки Номенклатура,Склад на произвольную дату
текущего месяца то самый быстрsй для этого индекс будет
по таблице Ra
Товар,Склад,Date_Time_IDDOC desc

просто в статье сказано что составной индекс быстее чем
несколько отдельных индекса.
или я все равно где=то ошибаюсь ?


Да. Только штатными средствами такой индекс создать нельзя.
Можно вручную в EM, но при изменении конфигурации 1С его грохнет.
  
Наверх
 
IP записан
 
spock
1c++ developer
1c++ moderator
Отсутствует



Сообщений: 822
Местоположение: Новосибирск
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: часть 5 1с sql  таблицы rg изнутри
Ответ #44 - 28. Ноября 2008 :: 16:40
Печать  
Z1 писал(а) 28. Ноября 2008 :: 06:07:
просто в статье сказано что составной индекс быстее чем
несколько отдельных индекса.

Я без личного наезда, твоей пользы для: а понял ли ты почему композитный индекс (покрывающий/covered) лучше нескольких отдельных?

ps: Я подсказки дал в скобках для поиска, если не найдешь, думаю, нам не проблемно будет пояснить.
  
Наверх
ICQ  
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: часть 5 1с sql  таблицы rg изнутри
Ответ #45 - 28. Ноября 2008 :: 16:57
Печать  
spock писал(а) 28. Ноября 2008 :: 16:40:
Z1 писал(а) 28. Ноября 2008 :: 06:07:
просто в статье сказано что составной индекс быстее чем
несколько отдельных индекса.

Я без личного наезда, твоей пользы для: а понял ли ты почему композитный индекс (покрывающий/covered) лучше нескольких отдельных?

ps: Я подсказки дал в скобках для поиска, если не найдешь, думаю, нам не проблемно будет пояснить.

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



Сообщений: 822
Местоположение: Новосибирск
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: часть 5 1с sql  таблицы rg изнутри
Ответ #46 - 28. Ноября 2008 :: 17:43
Печать  
Z1 писал(а) 28. Ноября 2008 :: 16:57:
потому что по композитному ключу мы находим все одинаковые
записи склад,товар и можем их быстро получить через кластерный индекс
а идя по простому одинарному индексу записи мы должы будем
просканировать все записи с заданным этим первым  индексом.

Видимо, все-таки нужно поговорить на эту тему Улыбка
Вот для примера ситуация:
- имеем таблицу с полями Склад, Фирма, Товар. Нужно определиться каким образом организовать индекс(ы) и его(их) тип.
Часто видел ситуацию, когда народ расставляет поля в индексе в порядке: Фирма + Склад + Товар (в случае регистра и измерений, соответственно). С одной стороны есть логика: вдруг нужно будет будет получать остатки по Фирме, а иной раз даже еще и по Складу. В большинстве случаев количество Фирм и Складов значительно меньше количества Товарных позиций.

На наборе данных (Фирма - Склад - Товар) с фильтром по Фирма1 + Склад1:
Фирма1 - Склад1 - Товар1
Фирма1 - Склад1 - Товар2
Фирма1 - Склад1 - Товар3
...
Фирма1 - Склад1 - ТоварN
Фирма1 - Склад2 - Товар1
Фирма1 - Склад2 - Товар2
Фирма1 - Склад2 - Товар3
...
Фирма1 - Склад2 - ТоварN
...

поведение ms-sql сервера будет таким:
Оптимизатор видит, что индекс такой Фирма + Склад + Товар, а условие выборки такое Фирма + Склад и строит план, скорее всего, Index Seek. Т.е. наше условие накладывается на индекс полностью. В служебных табличках сервер хранит плотность/распределенность (Statistics) данных в индексе и соответственно знает с какого места(!) нужно начинать перебор индекса (тут, вообще-то, помогает структура хранения индекса - B-tree и IAM). Мы получаем данные просто пройдя индекс и, взяв данные из самого индекса (для случая некластерного индекса).

Как мы знаем, в некластерном индексе организована определенная структура хранения. На листьях (leaf nodes) дерева хранятся данные индекса (т.е. это данные тех полей, которые указаны в индексе, в соответствии со способом сортировки), если же этих данных для выборки недостаточно, то серверу нужно будет спуститься по логической структуре дерева до самих данных (data leaf), которые храняться в куче (heap) через идентификатор (row locator). И если с B-tree все ясно, там поиск нужных значений производится крайне быстро, то в куче мы попадаем в "кучу". Т.е. тут нужно проводить тупой перебор (для начала пройтись по дереву по индексу, а чего нехватает - перебором кучи) - это очень злые Закладки (Bookmarks), довольно-таки тяжелая операция.

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



Сообщений: 822
Местоположение: Новосибирск
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: часть 5 1с sql  таблицы rg изнутри
Ответ #47 - 28. Ноября 2008 :: 17:51
Печать  
А вот теперь в случае, если набор данных тот же и условия отбора теже (Фирма1 + Склад1), а вот структура индекса уже другая - Фирма + Товар + Склад получаем поведение следующее:
оптимизатор решает, что нужно сначала отобрать все (!) записи, соответствующие Фирма1 (если в нашей БД есть только одна Фирма, то в этой таблице из 1000 записей все будут будут отобраны), затем будет долго и нудно бегать по дереву в поисках нужного Склада среди "ненужных" Товаров. А скорее всего оптимизатор выберет план Index Scan.

Забавно, но на одних и тех же условии отбора и наборе данных получаем разное время выполнения + разное количества сканов + разное количество чтений.
  
Наверх
ICQ  
IP записан
 
spock
1c++ developer
1c++ moderator
Отсутствует



Сообщений: 822
Местоположение: Новосибирск
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: часть 5 1с sql  таблицы rg изнутри
Ответ #48 - 28. Ноября 2008 :: 18:31
Печать  
А вот теперь меняем изначальные условия:
- набор данных тот же;
- индекс Товар + Склад + Фирма; <<<<-- индекс поменяли
- условие отбора Фирма1 + Склад1 + Товар1

Вот тут на сцену выплывает такое понятие как 'селективность' (selectivity). Вроде термин простой, но объяснить не просто Улыбка
Например, если в таблице 100 строк и все они уникальны (или почти все), то селективность данных высокая. И наоборот, если  таблице 100 строк и почти все они одинаковые, то селективнолсть низкая (или в виде формулы: X = КоличествоСтрокУдовлетворяющихУсловиюОтбора / КоличествоСтрокВообще, где X ->> 0 - ВысокаяСелективность ).
  
Наверх
ICQ  
IP записан
 
spock
1c++ developer
1c++ moderator
Отсутствует



Сообщений: 822
Местоположение: Новосибирск
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: часть 5 1с sql  таблицы rg изнутри
Ответ #49 - 28. Ноября 2008 :: 18:44
Печать  
Если начальные условия соответсвуют средней фирме, т.е. в БД очень мало Фирм (или совсем одна), очень мало Складов и значительно больше Товаров, то на наборе данных получаем:
- условия попадают в новый индекс - замечательно Улыбка
- оптимизатор выбирает Index Seek - тоже ура Улыбка
- однако, получаем оху..ый бонус Улыбка
визуально считаем сколько в наборе срок с Товар1 = 2 (... не считаем) - оптимизатор по нашему новому(!) индексу отобрал сразу и всего 2 строки, среди которых критерию Склад1 соответствует всего одна. Фигасе, да? Мы не перебираем всю таблицу, а сразу получаем отсортированную выборку по товарам, сразу позиционируемся на наужный товар, проходимся по этому товару всего две строи, где на второй строке перебор заканчивается.
  
Наверх
ICQ  
IP записан
 
spock
1c++ developer
1c++ moderator
Отсутствует



Сообщений: 822
Местоположение: Новосибирск
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: часть 5 1с sql  таблицы rg изнутри
Ответ #50 - 28. Ноября 2008 :: 18:52
Печать  
Теперь коротко о случае, если бы для каждого поля был бы свой индекс:
IX_I(Фирма)
IX_II(Склад)
IX_III(Товар)
многие делают именно такие индексы, и считают, что этого достаточно - бог им судья Улыбка Есть мнение, что от таких индексов оптимизатору сносит мозг. Он отдельно отбирает по Фирме, отдельно по Складу, отдельно по Товару строки соответствующие критерию отбора, а потом делает сливание этих данных. Для условия Фирма1 + Склад1 + Товар1 и начального набора данных получаем скорее всего такую картину (... не считаем):
1. отбор по Фирма1 = 8 строк;
2. отбор по Склад1 = 4 строки;
3. отбор по Товар1 = 2 строки;
4. а теперь по внутренним индентификаторам сделаем сливание и выбор общих (merge)

А может даже, что будет Scan, не ясно что хужее.

ps: сойдет для пояснения??
  
Наверх
ICQ  
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: часть 5 1с sql  таблицы rg изнутри
Ответ #51 - 28. Ноября 2008 :: 20:53
Печать  
Кирилл, спасибо за ликбез. Честно сказать, я тоже был среди тех людей, которые
Цитата:
... расставляют поля в индексе в порядке: Фирма + Склад + Товар

Мне вот только немного не понятна такая митуация:
имеем твой вариант построения индекса: "Товар + Склад + Фирма". Типовая задача: остатки товара по конкретному складу определенной фирмы. Тут мы тоже сразу попадаем в индекс?? (говорю без сарказма. реально хочу понять)
  
Наверх
 
IP записан
 
spock
1c++ developer
1c++ moderator
Отсутствует



Сообщений: 822
Местоположение: Новосибирск
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: часть 5 1с sql  таблицы rg изнутри
Ответ #52 - 29. Ноября 2008 :: 05:55
Печать  
JohnyDeath писал(а) 28. Ноября 2008 :: 20:53:
имеем твой вариант построения индекса: "Товар + Склад + Фирма". Типовая задача: остатки товара по конкретному складу определенной фирмы. Тут мы тоже сразу попадаем в индекс?? (говорю без сарказма. реально хочу понять)

Если есть индекс Товар + Склад + Фирма и необходимо получить данные по по конкретному складу определенной фирмы, то в индекс мы не попадаем. Первым полем у нас идет Товар, а условия накладываются по складу и фирме, следовательно, чтобы серверу получить то, что ты просишь, ему нужно будет просканировать индекс.
Но в примере был акцент на том, что в условиях отбора появился товар. Т.е. нужны остатки по конкретной фирме, конкретному складу и конкретному товару. Лично мне кажется, что в oltp-базе, в которой постоянно проводят расходные накладные, перемещения и прочие документы, которым для проведения нужно получить итоги как раз по такому условию (фирма+склад+товар), будет самым лучшим. В смысле, получение итогов более критичная к скорости, чем просто отчет по остаткам.
Ну и еще есть такое правило для выбора расстановки полей в индексе:
СелективностьПоПолю1 > СелективностьПоПолю2 > СелективностьПоПолю3 > ... > СелективностьПоПолюN

Код
Выбрать все
SELECT
    COUNT(*) as ОбщееКоличествоСтрок,
    COUNT(DISTINCT field1) as КоличествоУникальныхСтрокДляПоля1,
    COUNT(DISTINCT field2) as КоличествоУникальныхСтрокДляПоля2
FROM table
 

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



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: часть 5 1с sql  таблицы rg изнутри
Ответ #53 - 29. Ноября 2008 :: 11:56
Печать  
Но при построении индекса Ф-С-Т мы попадаем в него всегда - будь то отчет по остаткам или проведение накладной.
При построении индекса Т-С-Ф - только при указании товара. Но здесь мы получаем выигрыш в скорости при проведении накладных и заметно проигрываем при построении отчета по остаткам товаров на складе.
Смотря на эти два принципа, хочется знать "а что мы выигрываем во втором случае?", т.е. во сколько раз скорость получения данных будет быстрее? Будет очень интересно посмотреть на такие цифры (если это реально сделать).
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: часть 5 1с sql  таблицы rg изнутри
Ответ #54 - 29. Ноября 2008 :: 13:21
Печать  
я конечно не разбираюсь сам так хорошо в ms sql
но думаю так
Без индексов плохо.
Когда индексов много и они "протеворечивы" оптимизатору запросов крышу сносит sql бы уже все простым scanом сделал
а оптимизатор все думает какой индекс все таки для этого
надо использовать ( при этом переберая горы статистики)

сам по себе индекс никому не нужен. индекс должен решать
конкретную Задачу ( главную)
Вон у меня главная задача толучение итогов на ТА а
у kiruha главная задача получение остатков на любую
дату.
и глядя на один и тот же регистр и его индексы я говорю все классно все работает и индексы хорошие.
kiruha - все очень медленно  не могу я так вычислять
остаток бутылки на 15 число.
Кто из нас прав. Да оба мы правы только каждый по своему.
Исходя из этого spock все твои высказывания я плохо понимаю
ну во первых не хватает квалификации во вторых не знаю какую главную задачу ты решаешь.

kiruha - я для твоей постановки задачи придумал индекс
я конечно не очень разбираюсь ну по моему должно все очень быстро работать. В понедельник расскажу.
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: [1] 
ОтправитьПечать