19.12.2011, 21:52 | #1 |
Талантливый разгвоздяй
|
Индексы таблицы InventSettlement
Кто-нибудь знает правильные ответы на вопросы:
Знаю, что можно удалить записи с Cancelled=NoYes::Yes, сейчас вопрос в том, имеет ли такая оптимизация право на жизнь и какой будет эффект. |
|
19.12.2011, 22:15 | #2 |
Administrator
|
Цитата:
Теоретически, при сортировке по индексу (в порядке полей, указанных в индексе) - мы можем уменьшить количество записей, внутри которых осуществляется поиск. Т.е. написав where cancelled = NoYes::No мы отсекаем кучу записей... Но и куча остается. Оставшееся количество все равно велико (нам индекс радикально не помог), а значит оптимизатор будет искать иные индексы для поиска. Пример. Вы хотите в библиотеке найти книжку автора Пупкина, выпущенную в РФ. Как Вы будете сначала искать - по фамилии или по стране выпуска? (Предположим, что в библиотеке есть книжки, выпущенные только в СССР и РФ). При этом - книжек, выпущенных в РФ заведомо меньше. Скорее всего Вы будете искать книжку по фамилии и наплюете на страну издания (т.е. на первое место в индексе поиска поставите не страну, а фамилию). Также посчитает и оптимизатор. Также, обращаю внимание - что в идеале - индекс нужен по всем полям, входящим в условие WHERE, а также в сортировку / группировку. При этом в индексе должны быть на первых местах наиболее селективные поля (т.е. поля, количество значений в которых наиболее уникально в таблице). В случае библиотеки - это фамилия. Поэтому индексы по полям-енумам вообще бессмысленны . Но иногда они нужны, чтобы оптимизатору "подсказать" взять нужный индекс. Вот поэтому и нет индекса по этому полю. Выборок только по этому полю нет, а включение его в другие индексы возможно, ... но он будет где-нибудь в конце и его роль будет минимальна. Цитата:
Сообщение от Kabardian
Стоит ли добавить индекс, если в таблице InventSettlement более чем 40 млн записей?
Честно потратил 10-15 минут на поиск, но вроде никто никогда не задавал таких вопросов. Знаю, что можно удалить записи с Cancelled=NoYes::Yes, сейчас вопрос в том, имеет ли такая оптимизация право на жизнь и какой будет эффект. Удаление записей конечно же даст эффект. Искать станет проще (среди меньшего количества записей). Закрытие склада ускорится во времени. Также рекомендую еще дефрагментировать табличку, а то "бегать" по разбросанному файлу на диске - тоже скорости не добавляет. А для дефрагментации нужно сделать кластерный индекс. Я делал кластерный индекс по следующим полям (список полей соответствует порядку полей в индексе): TransRecId, TransDate, Cancelled
__________________
Возможно сделать все. Вопрос времени Последний раз редактировалось sukhanchik; 19.12.2011 в 22:21. |
|
|
За это сообщение автора поблагодарили: gl00mie (4), Kabardian (4). |
19.12.2011, 22:30 | #3 |
Administrator
|
Цитата:
Скорее тут нужно в индекс добавлять наиболее селективные поля без енумов. А выборки стараться "причесывать" под существующие индексы. Иногда ничего не значащая сортировка в выборке может существенно повысить производительность выборки только из-за того, что оптимизатор возьмет другой индекс.
__________________
Возможно сделать все. Вопрос времени |
|
19.12.2011, 22:33 | #4 |
Участник
|
Цитата:
|
|
|
За это сообщение автора поблагодарили: Kabardian (2). |
19.12.2011, 22:42 | #5 |
Administrator
|
Цитата:
Цитата:
__________________
Возможно сделать все. Вопрос времени |
|
19.12.2011, 22:42 | #6 |
Талантливый разгвоздяй
|
Цитата:
Сообщение от sukhanchik
Для ответа на сей вопрос - нужно понять - что нам даст индекс по этому полю.
Теоретически, при сортировке по индексу (в порядке полей, указанных в индексе) - мы можем уменьшить количество записей, внутри которых осуществляется поиск. Т.е. написав where cancelled = NoYes::No мы отсекаем кучу записей... Но и куча остается. Оставшееся количество все равно велико (нам индекс радикально не помог), а значит оптимизатор будет искать иные индексы для поиска. Кроме того, я пока еще не весь код просмотрел и нашел хотя бы один более или менее часто используемый запрос, где поиск не сужался бы по полям, по которым уже существует индекс. Не стал бы без необходимости кидаться создавать индексы, т. к. они расходуют место на диске и иногда могут превышать размер индексируемых данных. |
|
19.12.2011, 22:49 | #7 |
Administrator
|
Цитата:
Microsoft вон пошел в АХ 2012 по пути нормализации и кучи джойнов. Но это заведомо даст проигрыш в производительности на том же оборудовании. Так что тут как раз переживать не стоит.
__________________
Возможно сделать все. Вопрос времени |
|
19.12.2011, 23:05 | #8 |
Талантливый разгвоздяй
|
Цитата:
Естественно, имеется ввиду выполнение таких работ на переходный период - когда закончатся условия франчайзингового договора и появится возможность заключить с аутсорсером прямой контракт. Последний раз редактировалось Kabardian; 19.12.2011 в 23:08. |
|
|
За это сообщение автора поблагодарили: sukhanchik (2). |
19.12.2011, 23:22 | #9 |
Участник
|
Ну если на первом месте объем БД, то проще вычистить из таблички отмененные записи и сделать reorganize. И места меньше займет и индекс не потребуется, так как индексировать нечего будет.
|
|
20.12.2011, 09:03 | #10 |
Модератор
|
Когда тюнил у себя Inventory value \ Aging отчеты, закончилось все тем что Cancelled было добавлено в большинство индексов (Cancelled = NoYes::No практически во всех запросах участвует). Более того, оно сейчас первым в кластерном индексе поставлено
__________________
-ТСЯ или -ТЬСЯ ? |
|
|
За это сообщение автора поблагодарили: Kabardian (2). |
20.12.2011, 09:09 | #11 |
Участник
|
|
|
20.12.2011, 09:21 | #12 |
Модератор
|
Я, чтобы сомнениями не мучаться, прогоняю с секундомером и SET STATISTICS IO ON основные операции (закрытие \ отмена \ отчеты ) на реплике рабочей БД ДО и ПОСЛЕ
__________________
-ТСЯ или -ТЬСЯ ? |
|
20.12.2011, 10:03 | #13 |
Участник
|
И как результат ? Неужели нормально все ?
|
|
20.12.2011, 14:20 | #14 |
Талантливый разгвоздяй
|
Интересное мнение насчет индексов было у fed.
Цитата:
Сообщение от fed
А это вообще не на аксаптовском уровне происходит. И даже не на уровне трейсинга SQL-операторов в SQL Profiler. Вот представь себе: У тебя есть таблица персонала. Есть куча индексов, один из которых по полю Пол. Ты говоришь - удалить сотрудника с employeeId=='Иванов И.И.'. Система находит по индексу emplIdIdx физический адрес записи и фетчит ее. Далее - надо удалить из всех индексов ключи, которые на эту запись ссылаются. Система рассчитывает значения индексных ключей (по данным из записи) и пытается найти и удалить все индексные ключи. Для этого она ПЕРЕБИРАЕТ все индексные ключи со значением равным вычисленному до тех пор, пока не наткнется на ключ, ссылающийся на нужную запись (то есть с сохраненным в индексном входе Row_Id==Row_ID нашей записи). Если индекс уникален, то этот перебор не требуется. Если относительно уникален (ну скажем - номер паспорта без серии) - то перебор будет недолгим. А вот если это индекс по полю типа Пол (два возможных значения) - перебор будет медленным и печальным. Собственно - по этому в книжках и не советуют строить индексы по полям с 2-5-10 возможными значениями - обновление такой индекс затормозит, а при выборке редко будет нужен. Но тем не менее - иногда приходится строить индексы по достаточно часто повторяющемуся полю. Даже если на каждое значение будет приходиться порядка 200-300 записей - все равно обновление тормозить будет изрядно.
Насколько я знаю - некоторые БД пытались решить эту проблему за счет того, что индекс подспудно сортировался по сочетанию ключ+физический адрес записи (ROW_ID). (То есть - значение ссылки на запись становилась некой виртуальной частью ключа). Однако - на практике это приводило к изрядным проблемам, поскольку приводило к усиленной перебалансировке дерева страниц при вставке новых записей. Кроме того - при реорганизации и упаковке таблиц, это усложняло перестроение индексов. Так что - насколько я понимаю, в текущих версиях и SQL Server и Oracle используется именно такой подход к удалению ключей, который я описал... |
|
20.12.2011, 15:06 | #15 |
Участник
|
Цитата:
Сообщение от Kabardian
Интересное мнение насчет индексов было у fed.
2 Vadik Если Cancelled входит в кластерный индекс, да еще на перевом месте (или на втором, после DataAreaId?), то имеет ли смысл добавлять его в другие индексы (на последнее место, правильно?)?
__________________
Axapta v.3.0 sp5 kr2 |
|
|
За это сообщение автора поблагодарили: Kabardian (4). |
20.12.2011, 18:41 | #16 |
Участник
|
Цитата:
Мне бы Вашу уверенность. Если посчитать совокупные расходы, то железки вообще золотые оказываются. Кроме того, очень больша проблема убедить руководство что-то закупить из железок, особенно если проблему можно решить уменьшив размер данных. Цитата:
Еще как стоит. Я вот сейчас начал очередной цикл борьбы за свободное место на диске. Опять места не хватает (кое-что освободил, но этого хватит максимум на 1 год). А закупить - никто денег не дает
__________________
- Может, я как-то неправильно живу?! - Отчего же? Правильно. Только зря... |
|
20.12.2011, 19:23 | #17 |
Administrator
|
Цитата:
Сообщение от Владимир Максимов
Закрытие склада обычно выполняется раз в месяц или еще реже. Если будет тормозить, то это печально, конечно, но раз в месяц можно и потерпеть. А вот насчет размера...
Мне бы Вашу уверенность. Если посчитать совокупные расходы, то железки вообще золотые оказываются. Кроме того, очень больша проблема убедить руководство что-то закупить из железок, особенно если проблему можно решить уменьшив размер данных. Плюс еще момент. Объем данных, который дают индексы может быть на порядок меньше объема данных, который можно потереть без последствий для системы (InventSumTTSLog, *ParmTable, *ParmLine и т.д.). Поэтому тут надо все взвешивать. Цитата:
Сообщение от Владимир Максимов
Это общая политика Microsoft. Если не ошибаюсь, где-то в статьях Джоэля Спольски вычитал чем они руководствуются. Дескать пока будешь оптимизировать код, железо разовьется настолько, что его производительность перекроет потери от не оптимального кода. Тогда какой смысл оптимизировать?
А в целом - согласен, но с оговоркой. Какой бы высокопроизводительный сервер не был - все равно на нем можно сделать мертвую блокировку. А это означает, что идеала никогда не достичь - и все равно оптимизацию до определенного уровня нужно поддерживать. (Правило 80%/20%). Опять-таки - начальство охотнее пойдет на апгрейд системы, если он потребует минимальных затрат (особенно на железки)
__________________
Возможно сделать все. Вопрос времени |
|
20.12.2011, 20:12 | #18 |
Участник
|
Цитата:
Цитата:
Диски лежат не сами по себе, а в стойке (полке). А стойки закупаются далеко не каждый год. А через пару лет найти диски нужной марки для конкретной стойки - уже проблема. "Антиквариат", понимаешь ли Значит, надо закупать уже и новые стойки к новым дискам или искать "антикварные" диски по очень дополнительной цене. Это со стороны железа. Теперь смотрим со стороны администратора. Кроме самой базы нужен еще BackUp. Затем нужна база для разработки. Еще одна база для тестирования. Идельный вариант, иметь еще одну копию базы. А еще может быть база для отчетов. А еще копии базы отчетов. А еще... Вот и получается, что нужно докупать, минимум, в 5-кратном размере. Ну, т.е. если надо 100ГБ на рабочую базу, значит, придется раскошелится на 500ГБ для дополнительных копий базы. В общем, хочешь получить "мелочь", но вокруг этой "мелочи" возникает масса дополнительных условий. Цитата:
Это в теории. На практике так не получается. Суммарные (итоговые) затраты обычно очень велики. Но вот если удастся разбить затраты на части (этапы внедрения или этапы обновления), то вот в этом случае пробивать легче. Разовый платеж относительно небольшой, а что там по итогам года (или нескольких лет) - уже другой вопрос Проблема как раз в том и состоит, что процесс увеличение дискового пространства на части не делится. "Я бы взял частями, но мне нужно сразу" (с)
__________________
- Может, я как-то неправильно живу?! - Отчего же? Правильно. Только зря... |
|
|
За это сообщение автора поблагодарили: sukhanchik (2). |
21.12.2011, 02:13 | #19 |
Модератор
|
Цитата:
Цитата:
на последнее место, правильно ?
__________________
-ТСЯ или -ТЬСЯ ? |
|
|
За это сообщение автора поблагодарили: AndyD (5). |
Теги |
inventsettlement, быстродействие, закрытие склада, производительность, индекс |
|
|