Холиварный мегасрач - 4: Порядок следования измерений в Регистре

  1. 9 г. назад

    Открыл тут для себя Америку, хотелось бы услышать мнение 330-ников.
    Оказывается сабж нислабо влияет на производительность. Типа именно в таком порядке строятся индексы, в каком указаны измерения в пофигураторе.
    К примеру индекс "Склад1,Товар1" быстрее найдётся при поиске по "Склад1", чем при поиске по "Товар1".

    http://www.forum.mista.ru/topic.php?id=694500
    http://www.gilev.ru/index/

    Ответы: (15) (113)
  2. ‹ Ранее
  3. 9 г. назад

    (33) чорт, чё-то я протупил. я про составные индексы подумал

  4. andrewks скоростью выполнения запросов, не?

    с чего-й это оно быстрее будет? или мы про разное говорим?
    давай "стандартный" регистр накопления остатков, измерения:
    Склад, товар, серия.
    если ты ставишь отбор товар-серия-склад. оно будет медленнее работать?

    Ответы: (40) (42)
  5. sf или мы про разное говорим?

    во-во. я про составной имел в виду

  6. Дядя Вася Он там изначально есть

    Дядя Вася Реализованно на уровне движка

    мы же про 8ку говорим?
    я вижу: индексы
    Дата + Ссылка
    Номер + Ссылка

    дата+номер не вижу :(

    Ответы: (43)
  7. sf если ты ставишь отбор товар-серия-склад. оно будет медленнее работать?

    для ответа на этот вопрос нужно видеть, в какой скуль-запрос 1сина транслирует, ибо порядок может поменяться оптимизатором 1с, например

    Ответы: (44) (49)
  8. (41) В журналах посмотри, нешто отменили... Нелогично.

    Ответы: (47)
  9. (42) Кажется опять забыли, что регистр это все-таки не справочник... Из регистра выбирается не товар-серия-склад, а количество и сумма на дату. Это нельзя просто посмотреть найдя нужную запись, это считать надо.

    Ответы: (45)
  10. (44) рассмотрим задачу когда нам остатки из итогов надо получить, они рассчитаны и не надо ничего "считать"

    Ответы: (46)
  11. (45) Сферический конь в вакууме )

    Ответы: (48)
  12. (43) имхается мне, что и не было никогда (в 8ке)
    нафиг он нужен.
    в журнале тоже нет, да ты и про документы писал.
    хотя да, критерии отбора и графы журналов - неявно добавят индекс. но не к номеру и не составной.

    Ответы: (50)
  13. (46) почему конь в вакууме?
    если мы в запросе будем обращаться к РН.Остатки(), т.е. без даты, сколько соединений и к скольким таблицам на скуле запрос будет?

    Ответы: (50)
  14. andrewks оптимизатором 1с,

    плюсану на 0.5, оптимальный запрос выбирает SQL, у него оптимизатор. а 1С - просто "тряпка" по сравнению с ним )

    Ответы: (51)
  15. 16.11.2014 10:10:01 отредактировано Дядя Вася

    (47) В семерке были, в общем.
    (48) Потому что искусственная задача к реальной жизни имеющая мало отношения. Даже если ты будешь писать запрос только к таблице итогов, тебе скорее все равно считать придется. Есть у тебя там итоги по каждому складу-товару-серии, а пользователю не интересно в разрезе серий, он хочет например посмотреть сколько нужного товара всего на основном складе, или вообще на всех складах.

    Ответы: (52) (53)
  16. (49) я хотел было слово оптимизатор в кавычки поставить, но не стал )

  17. (50) считать будет скуль, опять-таки, с применением (или неприменением) индексов

    Ответы: (54)
  18. Дядя Вася искусственная задача к реальной жизни имеющая мало отношения.

    не надо ничего придумывать, давай сначала:
    Регистр накопления остатки "ТоварыНаСкладах". Измерения: Склад, Номенклатура,Серия. Ресурсы: Количество
    Запрос:
    Выбрать Остатки.Количество
    из РН.ТоварыНаСкладах.Остатки КАК Остатки
    ГДЕ
    Остатки.Номеклатура = &Номеклатура И Остатки.Серия = &Серия И Остатки.Склад = &Склад

    как будет себя вести скуль?

    и есть ли разница в случаях когда измерения в конфигураторе будут в порядке: "Номенклатура,Серия,Склад"

    или будет ли по-другому (быстрее?) работать запрос:
    Выбрать Остатки.Количество
    из РН.ТоварыНаСкладах.Остатки КАК Остатки
    ГДЕ
    Остатки.Склад = &Склад И Остатки.Номеклатура = &Номеклатура И Остатки.Серия = &Серия

    ?

    Ответы: (55)
  19. (52) Ну это само собой, просто сколько он записей перебирет чтобы получить итог который тебе нужен, а не в том разрезе в котором они в таблице хранятся? С применением составного индекса понятно переберет меньше, но для этого он должен быть продуман. Одинэска не в курсе смысловой нагрузки измерений. На момент создания регистра она не знает, что у тебя будет 10 складов, и 10000 товаров, а не наоборот. Названия измерений ей не говорят ни о чем. На самом деле это может быть не товар и склад, а что-то еще, и по 1000 каждого. Тогда в таком индексе вообще нет смысла, в каком порядке его не строй, количество итераций такое же будет. Потому сама она его грамотно построить не в состоянии, а в макроязыке это сделать возможности не предусмотрели.

  20. (53) Ну там как минимум еще дата есть, и в итогах тоже. И сортировка по ней вроде как важнее прочего для регистра-то.

    Ответы: (56)
  21. 16.11.2014 10:21:35 отредактировано sf

    (55) я так понял, ты сливаешься? [smile=:D]

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

    Ответы: (58)
  23. (57)+ И собственно что ты доказать хочешь не понимаю. При сортировке Дата-Склад-Номенклатура-Серия отработает быстрее если тебе нужна например номенклатура без учета серии, и медленнее если она нужна без учета склада. Так что идеальных индексов не бывает, даже если он и составной. Разве что несколько замутить, на все случаи жизни, но это уже избыточная инфа. Не столько полезных записей, сколько записей о том как их обходить.

    Ответы: (60)
  24. кто победил?

  25. Дядя Вася даже если он и составной

    т.е. ты знаешь способ как сделать в 1С составной индекс?

    Ответы: (61)
  26. (60) Смотря в какой 1С... В семерке с прямыми и не то можно сделать. )

    Ответы: (62)
  27. (61) ты или Кэп или некомпетентный как ...
    причем здесь прямые запросы?
    я тоже могу зайти в скуль и ручками создать там составной индекс. мы же говорим про средства 1С?

    Ответы: (63)
  28. (62) А вам шашечки или ехать? Создать-то ты его в скуле можешь, только будет ли он использоваться интересный вопрос. С прямыми в семерке будет, потому как непосредственно со скулем и работаешь. А восьмерка из макроязыка в скулевские свои запросы транслирует как умеет, и про твой индекс она не в курсе...

    Ответы: (64)
  29. (63)
    ты это.... завязывай с алкоголем. причем здесь трансляция языка 1Ской и индекс?

    Дядя Вася Станет ли он составной мутить из 15 измерений?

    я до сих пор не могу понять, про какую реальность ты пишешь? мы тут в сабже вроде не клюшки обсуждаем.

    хотя стоп. расскажи как использовать сделать и использовать составной индекс в 7ке?

    Ответы: (65)
  30. (64) Ну хранимки-то делал, чего бы и с индексом не извернуться. Понятно что это уже не просто семерка, но возможность-то есть.

  31. 16.11.2014 12:32:38 отредактировано sf

    так что в итоге? зачем порядок нужен в измерениях?
    я проверил сейчас: в любом порядке ставь условия - будет использоваться кластерный индекс

  32. 17.11.2014 07:21:28 отредактировано БухиТог

    Провел такой эксперимент:

    1. Определяем структуру таблиц для регистра "ПартииНаСкладе" с помощью метода "ПолучитьСтруктуруХраненияБазыДанных"

    -image-

    -image-

    2. Смотрим структуру индексов ДО установки в измерениях галок Индексировать!
    -image-

    -image-

    И самое интересное!!
    -image-

    Т.е. в таблице Итогов в составе кластерного индекса присутсвуют ВСЕ измерения. Несмотря на осутствие галок "Индексировать" в 1С
    Видимо про это писал Груви!

    3. Измерение"Склад" делаем числовым чтобы отличить его от остальных:

    -image-

    -image-

    4. Меняем порядок измерений:

    -image-

    -image-

    Что и требовалось доказать!!!

    З.Ы.: Позже покажу что происходит по галке "Индексировать". Сейчас времени нет. Но там ничего интересного, просто добавляется еще один некластеризованный индекс, отделный индекс по каждому измерению, по которому стоит галка.

    Ответы: (68) (89)
  33. БухиТог Т.е. в таблице Итогов в составе кластерного индекса присутсвуют ВСЕ измерения.

    ну, в принципе, это логично

    Ответы: (69)
  34. (68) и их порядок в составном индексе меняется при изменении порядка измерений в Конфигураторе!!!

    Ответы: (70)
  35. (69) не составном, а кластеризованном. а то опять путаемся в терминах

    Ответы: (72)
  36. 17.11.2014 07:38:59 отредактировано БухиТог

    А вот так меняется состав колонк.
    -image-
    -image-

    Меянем порядок измерений:
    -image-
    -image-

    Ответы: (74)
  37. (70) составным (несколько полей в ключе индекса) может быть как кластеризованный индекс, так и не кластеризованный.

    Точнее не составной, а композитный он называется См.(23)

    Ответы: (73) (75)
  38. (72) я в курсе. в нашем случае индекс не составной

    Ответы: (75) (76)
  39. БухиТог Точнее не составной, а композитный

    оба термина применимы

    composite - составной объект m (Компьютерный)

  40. (72)(73) а еще разные переводы в разных редакциях/версиях MS SQL. Имхо, это эхо холодной войны.

    лучше скажите, нафига нужен порядок?
    есть кластерный индекс, скуль в любом случае будет искать по нему, что это первое поле, что второе.

  41. 17.11.2014 08:43:50 отредактировано БухиТог

    (73) Как не составной?! Полей же несколько!

    -image-

    Ответы: (77) (79) (83)
  42. хм... ну, да, в таблице итогов

    Ответы: (89)
  43. (76) да можно хоть сколько спорить про термины в русских статьях.
    открой скуль и найди там слово составной.

    Ответы: (80) (85)
  44. +(79) по сути индексы делятся на кластерные и не кластерные.
    уникальные и не уникальные.
    + различается состав колонок
    составной/не составной - спор ни-о-чем.

    но: 1С сама генерит кластерный, при этом средствами 1С нельзя сделать некластерный индекс по 2м полям

    Ответы: (81)
  45. (80) под термином "составной индекс" подразумевается индекс с ключом строки, состоящим из более чем одного столбца/поля

  46. Минуточку, а как это будет работать в свете (23)? В частности это:

    БухиТог Например, если создается индекс по полям Field1, Field2, то он может быть применен только в запросе где в критериях используются оба этих поля. Так же этот индекс будет полезен для условий, построенных для одного Field1. Для одного Field2 этот индекс не может быть применен.

    Получается что индекс работает только если выбирать по полям в порядке следования, если на первом месте Контрагент, на втором склад, а мне нужно просто по складу, одну сумму, без контрагентов и прочих товаров, то индекс вообще не используется? А на практике покажет мгновенно...

    Ответы: (83)
  47. (76) давай лучше вернемся к сабжу: почему важен порядок?

    Дядя Вася то индекс вообще не используется

    я проверял вчера. не важно по какому полю отбор (первое или третье) - выборка из индекса.

    Ответы: (84)
  48. sf выборка из индекса

    сначала должен использоваться кластерный индекс, не? в нём мы получим ссылки на записи в обычных индексах

    Ответы: (88)
  49. sf открой скуль и найди там слово составной.

    в документации фигурирует
    http://msdn.microsoft.com/ru-ru/library/ms188783.aspx

    Ответы: (86)
  50. (85) Ну это можно проще сделать: https://translate.google.com/?hl=ru#ru/en/составной
    13 вариантов перевода, composite в том числе.

    Ответы: (87)
  51. (86) мне не нужны варианты перевода, мне нужен официальный перевод, т.е. перевод на оф.сайте, ссылку на который я и привёл

    Ответы: (92)
  52. +(84) только, если я правильно понимаю, в нашем случае кластеризованный использоваться не будет, а будут по-отдельности использоваться простые индексы, из которых он состоит, так?

  53. 17.11.2014 09:18:23 отредактировано БухиТог

    (78) так весь мораль моих скриншотов в (67) был что порядок измерений влияет только на индекс таблицы итогов! Он является кластеризованным и композитным (составным).

    Ответы: (90)
  54. (89) так вот и получается, что в данном случае порядок не важен нифига

    Ответы: (91)
  55. (90) чччорт! Как не важен?!
    Обоснуй!

    Ответы: (92) (96)
  56. (87) исходное слово там composite.

    БухиТог Как не важен?!
    Обоснуй!

    ты первый начал. почему важен?

    повторюсь: я проверил фильтр по любой колонке 1,2,3 - работает по индексу

    Ответы: (93)
  57. sf исходное слово там composite

    что за исходное слово? я тебе ссылку на вариант перевода на русском языке привёл, там - "составной"

    Ответы: (94)
  58. 17.11.2014 09:39:08 отредактировано sf

    (93) исходное - на английском. я к тому что спор "композитный" или "составной" - ни о чем.

    по мне так вообще пофиг составной, несоставной, композитный / некомпозитный.
    Кластерный и не кластерный - вот в чем вопрос )
    где рекомендации по порядку полей именно для скуля.

    Ответы: (95)
  59. sf я к тому что спор "композитный" или "составной" - ни о чем.

    дык и я об том же ))

  60. (91) ну, я же написал. в каком случае поиск будет по ключу кластеризованного индекса?

    Ответы: (108)
  61. 17.11.2014 09:48:35 отредактировано pumbaEO

    Индексная селективность - отношение числа строк соответствующих конкретному ключевому значению к общему числу строк в индексе. Селективность индекса – это показатель того, сколько строк от общего числа приходится на одно ключевое значение индекса.
    Селективность чаще вычисляют в процентах. Чем больше этот процент, тем хуже селективность. Селективность хороша, если мало строк имеют одинаковые ключевые значения.
    Индексный доступ к данным имеет смысл при хорошей селективности. Это утверждение верно при равномерном распределении данных. Однако для ситуации с неравномерным распределением данных такой подход не оправдан.

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

    Ответы: (98)
  62. (97) ты сейчас нам все шаблоны порвешь.
    т.е. лучше:
    серия - номенклатура - склад ????

    Ответы: (99) (100)
  63. (98) а какие шаблоны он тебе порвал? ты не знал, что-ли, что индекс - дерево?
    вопрос не в этом, а в том, используется ли ключ составного некластеризованного индекса для поиска по одному измерению

    Ответы: (100) (101)
  64. (98) да, если у тебя отбор по сериям используется, а не "Номенклатура в Иерархии"
    (99) хороший вопрос, но него можно только отвечать с хорошей статистикой и при проверке во временном интервале.

  65. andrewks а какие шаблоны он тебе порвал?

    мне? я изначально в сабж не верил вообще-то. я утверждаю, что порядок не важен.

    andrewks вопрос не в этом, а в том, используется ли ключ составного некластеризованного индекса для поиска по одному измерению

    сейчас будет пруф, что используется.

    Ответы: (102)
  66. 17.11.2014 10:12:55 отредактировано pumbaEO

    (101) dell

  67. структура.png
    ПланИсполнения.png
    как-то так

    Ответы: (104)
  68. (103) а почему планы разные для разных полей?

    Ответы: (105)
  69. (104) прошу считать картинку неправильной :(
    это с эксперимента с "составным индексом aaaa"
    сейчас сделаю другую

  70. вот собственно, кластерный индекс задействован всегда:
    планЗапроса2.png

    Ответы: (107) (111) (123)
  71. (106) Clustered index scan... трындец, считай, что индекса нет

    Ответы: (109) (123)
  72. (96) где написал? Закеж!

  73. (107) стоп-стоп-стоп )
    третья картинка. индекс используется, смотрим на % стоимости выполнения: 20/40/40. хотя скорее всего из-за того, что у меня первое измерение не заполнено, поэтому и 20%
    ПланИсполнения3.png

    Ответы: (110) (111)
  74. (109) ты это... не шулеруй, речь была про выборку по одному измерению.
    логично, что индекс используется, когда идёт выборка по всем измерениям

    Ответы: (111) (116)
  75. (110) [smile=:D] я пока в ТЖ не лазил
    запрос руками пишу: отличие картинок (109) и (106) в том, что в 109 - я поставил условие по дате.

    Ответы: (112)
  76. (111) разверни ещё в левом дереве листик "Keys", что там? _Period?

    Ответы: (114)
  77. (0) Проверил по експлану, при порядке индексов Склад1,Товар1 происходит выборка только одной записи.
    Не происходит выбора всех товаров по одному складу, а потом отсеивание по товару.
    Отсюда вывод: не важно в каком порядке стоят измерения.

    Ответы: (121)
  78. (112) что ты такое говоришь.... там же место для FK, что 1с-ка никогда не делала )
    хотя, мечты-мечты

  79. 4 запроса (текст запроса выдернул с ТЖ, чтобы точно было то, что 1с-ка передает): 1. условие по всем измерениям; 2,3,4 - условия по очереди по первому, второму, третьему измерению.
    вывод - индекс используется всегда....
    вопрос открыт "а влияет ли порядок"
    планИсполнения4.png

    Ответы: (118)
  80. andrewks выборку по одному измерению.

    andrewks по всем измерениям

    я правильно понял, что ты хочешь чтобы в выбираемых полях "одно поле"?

    Ответы: (117)
  81. (116) ну, именно в этом случае индекс же был в пролёте )

    Ответы: (121)
  82. sf вывод - индекс используется всегда....

    и то хорошо

  83. хотя он всё равно ругается на некоторые отсутствующие индексы.
    вот интересно, он из обычного индекса быстрее будет выбирать, чем из кластеризованного?
    с другой стороны, кластеризованный состоит из обычных индексов, так что не факт.
    с третьей стороны - чего тогда ругается? )

    Ответы: (120)
  84. andrewks хотя он всё равно ругается на некоторые отсутствующие индексы.

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

    andrewks кластеризованный состоит из обычных индексов,

    это откуда инфа?

    Ответы: (122)
  85. andrewks ну, именно в этом случае индекс же был в пролёте )

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

    вообще про кластерный написано про кластерный:
    "Creates an index in which the logical order of the key values determines the physical order of the corresponding rows in a table. "
    "Создает индекс, в котором логический порядок значений ключа определяет физический порядок соответствующих строк в таблице."

    т.е. когда условие по периоду я добавил оно и понятно, что index seek (отобрал записи по периоду и среди них уже скан). ну опять же вывод можно сделать как

    admin govnoforuma Отсюда вывод: не важно в каком порядке стоят измерения.

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

  86. sf это откуда инфа?

    ну, из определения-же

    Ответы: (123)
  87. (122) где-то обман. потому что:

    andrewks (106) Clustered index scan...

    Ответы: (124) (126)
  88. (123) надобно разобраться с первым полем в кластеризованном индексе - почему оно серенькое (_Period)

    Ответы: (125)
  89. andrewks почему оно серенькое (_Period)

    где?

  90. (123) по табличкам с малым числом записей (менее 1500 записей), оптимизатор может и не обнюхивать индекс, ограничиваясь тупым перебором.

    Ответы: (127)
  91. (126) наверное у меня больше 1500 записей, раз index scan и index seek на картинках. А вообще, есть хинты как от индекса оптимизатор отучать же. Наверное неспроста.
    Ваше мнение, порядок измерений важен или нет?

    Ответы: (128) (129)
  92. +(127) у меня 91 тыс записей. для чистоты эксперимента до 900тыс сейчас догоню.

  93. (127) Скажем так, особо не вникал. Слишком много условий нужно проверять, состав реквизитов, состав индексов, да на различных объемах, прочее влияющее. Но рекомендации, про "сдвинуть ближе к началу часто используемое", читал, прочитанному верю. Влияет. Но влияет как? - на одном запросе - туда (быстрее), а на другом, к этому же регистру, но с другим составом вытягиваемых данных - обратно (медленнее). И что мы будем с этим делать?

    Ответы: (130)
  94. Идун а на другом, к этому же регистру, но с другим составом вытягиваемых данных - обратно (медленнее)

    сомнительно ) да и сабж другой. это тема другого срача

  95. 17.11.2014 18:12:41 отредактировано sf

    все, порядок не только важен, но и важно накладывая условия накладывать на измерения сверху вниз без пропусков:
    т.е. если регистр: склад - номенклатура- серия,
    а у вас есть только склад и серия, то запрос выполнится быстрее , если дополнительно указать номенклатуру.

    Ответы: (132)
  96. (131) где скрины?

    Ответы: (133)
  97. (132) это не так просто. как сделать скрин с "operator cost" (посываю голову пеплом - в предыщие разы не смотрел) ?
    скрин вот, третий запрос самый дорогой, в нем пропущено "промежуточное" измерение. по цене у меня оператор получился в 1000 раз дороже. ПланИсполнения5.png

    Ответы: (134)
  98. (133) статистики обновлял после каждого перемещения измерений?

    Ответы: (135)
  99. (134) конечно нет. Я даже не перемещал измерения. Я оставил только два с примерно одинаковой селективностью.

    Ответы: (136)
  100. (135) не зачет.

    Ответы: (137)
  101. (136) почему?

или зарегистрируйтесь чтобы ответить!