05.10.2006, 13:45 | #1 |
Участник
|
1. Удали ключи, которые используются исключительно для сортировки.
2. Помещай fields Bool, Option и Date в конце ключа. 3. Не делай поддержку SIFT в маленьких и временных (Temporary) таблицах. 4. При организации циклов вводи новую переменную для изменения переменной, на которой построен цикл. 5. Не используй FIND(-)/FIND(+), если можно использовать FINDFIRST/FINDLAST. 6. Чем меньше количество ключей в таблице, тем лучше работает SQL Server: не надо хранить в памяти состав ключей. 7. Быбирай всегда ключ с наивысшей селективностью. В противном случае есть вероятность того, что SQL Server перейдет на сканирование таблицы (Clustered Index Scan), либо выберет неоптимальный ключ. 8. Не применяй FlowFields в повседневных, часто используемых формах, тем более в табличных формах. Применяй принцип Display on Demand. 9. В формах, отображающих большие таблицы, не оствавляй свойство SourceTablePlacement по умолчанию (Saved), а устанавливай (First/Last). Буду признателен всем, кто протестирует мой Tool на сайте http://www.mibuso.com/dlinfo.asp?FileID=755 и пришлет свои замечания. |
|
|
За это сообщение автора поблагодарили: mira (1). |
05.10.2006, 17:32 | #2 |
Участник
|
Tool очень хороший. Огромное спасибо за его разработку.
Пользую практически с момента выхода. Лишний раз убедился, что большинство тяжелых таблиц у меня имеют оптимальные (или близкие к оптимальным) ключи. А меньшинство было отловлено с помошью тула и приведено в порядок. Но один сильно навороченный отчет проглотить эта штаку не смогла. В том отчете количество CalcFields составляло 18 полей, и по видимому - тут он и сдох. Также прискорбно, что Ref-структуры не отслеживаются. |
|
12.10.2006, 10:02 | #3 |
Участник
|
Цитата:
4. При организации циклов вводи новую переменную для изменения переменной, на которой построен цикл.
|
|
12.10.2006, 11:49 | #4 |
Участник
|
Действительно, я выразился не удачно.
Представьте себе цикл REPEAT - UNTIL построен на переменной Customer типа Record, т.е.: IF Customer.FIND('-') THEN REPEAT ......... UNTIL Customer.NEXT=0; Если вам нужно внутри цикла произвести изменения в таблице Customer, то используйте для этого новую переменную CustomerNew, а не ту, на которой построен цикл. |
|
12.10.2006, 12:23 | #5 |
Участник
|
зачем?
|
|
12.10.2006, 14:42 | #6 |
Участник
|
С моей точки зрения - тут так.
Если не накладывалось никаких фильтров и ренджей и не использовался SetCurrentKey - то можно и в той же переменной менять, по которой крутится цикл. Речь идет о modify, первичный ключ не трогаем. Если же изменяется значение полей, входяших в состав фильтра либо используемого ключа - то тут лучше "мухи отдельно, котлеты отдельно". |
|
12.10.2006, 15:36 | #7 |
Участник
|
вообще - ко всем советам есть претензии.
перечитал. точно ко всем. 4й совет, если действительно konrad понял правильно, надо читать как "не изменяй поля, входящие в текущий ключ". ("а если надо - заводи отдельную переменную") ну, наверное для новичка может быть неочевидным. |
|
12.10.2006, 16:23 | #8 |
Moderator
|
Цитата:
1. Удали ключи, которые используются исключительно для сортировки
Цитата:
2. Помещай fields Bool, Option и Date в конце ключа.
Цитата:
5. Не используй FIND(-)/FIND(+), если можно использовать FINDFIRST/FINDLAST.
Цитата:
6. Чем меньше количество ключей в таблице, тем лучше работает SQL Server: не надо хранить в памяти состав ключей.
Другое дело, если происходит работа с SIFT - в этом случае действительно лучшие отключить рассчет сумм для ненужных комбинаций составного ключа (SIFTLevelsTomaintain) Цитата:
8. Не применяй FlowFields в повседневных, часто используемых формах, тем более в табличных формах. Применяй принцип Display on Demand.
|
|
12.10.2006, 16:41 | #9 |
Участник
|
дополняю tyrexa, раз уж начал..
Цитата:
3. Не делай поддержку SIFT в маленьких и временных (Temporary) таблицах.
Цитата:
4
Цитата:
7. Быбирай всегда ключ с наивысшей селективностью. В противном случае есть вероятность того, что SQL Server перейдет на сканирование таблицы (Clustered Index Scan), либо выберет неоптимальный ключ.
Цитата:
9. В формах, отображающих большие таблицы, не оствавляй свойство SourceTablePlacement по умолчанию (Saved), а устанавливай (First/Last).
|
|
13.10.2006, 02:59 | #10 |
Участник
|
Спасибо всем за замечания. Несомненно, эта дискуссия будет способствовать лучшему пониманию сути.
Ну а теперь попробую отстоять свою точку зрения. 1. По поводу ключей, используемых исключительно для сортировки. Цитата:
А как же тогда пользователь будет сортировать?
Eliminate the maintenance of indexes that are only designed for sorting purposes. SQL Server will sort the result set without these indexes. 2. По поводу Option Field Цитата:
Option не обязательно, поскольку это обычное целочисленное поле
Redesign indexes so that their selectivity becomes higher. Remember to not place Boolean and option fields at the beginning of an index and always put date fields towards the end of the index. Furthermore, indexes like Posting Date,Customer No.,… must be avoided because the index is like an entire book and the chances that the query optimizer would pick this index are quite small. Indexes like Document Type,Customer No.,… have very low selectivity on the first key. You could create a new index Customer No.,Document Type, … and maintain it on SQL Server while you turn off the maintenance of the original index on SQL Server. 3.По поводу Не используй FIND(-)/FIND(+), если можно использовать FINDFIRST/FINDLAST. Цитата:
В общем случае лучше пользоваться FINDSET. При этом нужно держать в уме, что c использованием этих команд по большому счету не выигрывается
SQL Server пытается определить происходит ли чтение записей в цикле или это всего лишь запрос на единичную запись. Здесь часто возникают проблемы, особенно в случае применения конструкции WHILE FIND('-') вместо REPEAT UNTILL NEXT. Поэтому SQL Server склонен к Set Based Queries и посылать ответ в виде Recordset вместо Single record . Таким образом использование этих функций может быть крайне неэффективным и зачастую снижает Performance. Поэтому начиная с версии 4.00 стали доступны функции FINDFIRST/FINDLAST/FINDSET. Теперь вы можете сделать оптимальный выбор в зависимости от задачи. Вряд ли кто либо воспользуется FIND(+) в известной конструкции: IF LedgEntry.FIND('+') THEN NextEntryNo := LedgEntry."Entry No." + 1 ELSE NextEntryNo := 1; если гораздо эффективнее FINDLAST. Что касается преемственности версий, то это совершенно другой вопрос. Microsoft Business Solutions-Navision использует эти функции только в новых, а не модернизируемых обьектах. 4. По поводу Не делай поддержку SIFT в маленьких и временных (Temporary) таблицах. Цитата:
Вообще ни о чем. Что такое маленькая таблица? при чем тут временная?
Examples of temporary tables are Sales Line, Purchase Line, Warehouse Activity Line, and similar tables. SQL Server can retrieve sums directly from the ‘source’ table when the SIFT indexes are not maintained. If the data set within the filter is small, the sum is calculated quickly and at the same time all the updates of the ‘source’ table are performed more quickly because Navision does not have to update all the associated SIFT tables. 5. По поводу количества ключей в таблице. Additionally, if you reduce the number of indexes, SQL Server will not have to keep these in memory, thereby increasing page life expectancy and improving performance. Maintaining fewer indexes can mean better performance. SQL Server Query Optimizer вырабатывает решения на основе накапливаемого опыта запросов. Кстати, он может применить сканирование таблицы даже в случае идеального ключа, если сами записи сильно асимметричны. Не надо "смущать" Query Optimizer большим количеством ключей с одной и той же комбинацией полей. Необходимо также учитыватьтот фактор что, чем больше ключей, тем больше потери времени на обновление SQL индексов при изменении записей. 6. По поводу Не применяй FlowFields в повседневных, часто используемых формах, тем более в табличных формах.. Цитата:
Собственно почему не применяй? Только из-за вероятности, что пользователь поставит фильтр на вычисляемое поле?
7. По поводу Цитата:
возникают сомнения в понимании автором SIFT технологии
На сегодня достаточно. Пора спать. |
|
13.10.2006, 10:51 | #11 |
Участник
|
Собственно не понимаю, о чем спор. Если объяснить доступно новичкам те или иные пункты первого поста, не отправляя их к документации - это одно. Если оспорить сами пункты между гуру - это другое.
С моей точки зрения - все приведенные рекомендации абсолютно верные. Некоторые из них неочевидны из-за лаконичных формулировок, но после вдумчивого рассмотрения становятся понятны. Подтверждается двухлетней практической работой в направлении оптимизации навижн sql. |
|
13.10.2006, 12:10 | #12 |
Moderator
|
Цитата:
1. По поводу ключей, используемых исключительно для сортировки.
А как же тогда пользователь будет сортировать? При работе с SQL Server эти ключи не нужны. Цитата:
2. По поводу Option Field
Option не обязательно, поскольку это обычное целочисленное поле Предпочтительнее выдвигать вперед Code Field или Integer, если есть такая возможность. Цитата:
3.По поводу Не используй FIND(-)/FIND(+), если можно использовать FINDFIRST/FINDLAST.
Цитата:
5. По поводу количества ключей в таблице.
Additionally, if you reduce the number of indexes, SQL Server will not have to keep these in memory, thereby increasing page life expectancy and improving performance. Maintaining fewer indexes can mean better performance. Цитата:
6. По поводу Не применяй FlowFields в повседневных, часто используемых формах, тем более в табличных формах..
Собственно почему не применяй? Только из-за вероятности, что пользователь поставит фильтр на вычисляемое поле? Потому что, это вычисляемые поля. При каждом переходе от одной записи к другой, вы запрашиваете результат вычисления, который вам может быть и не нужен. |
|
13.10.2006, 13:37 | #13 |
Участник
|
По первому пункту я бы сформулировал требование так:
Не ставьте галку MaintainSQLIndex на ключах, используемых только для сортировки. Разумеется, это не относится к первичному ключу По третьему пункту добавил бы следующее: Не ставьте галку MaintainSIFTIndex на любых ключах в таблицах, нормальное состояние которых (таблиц) - пустое. Это таблицы 81, 14820, 14825 и т.д - журналы, буферы и т.д. |
|
13.10.2006, 13:48 | #14 |
Участник
|
Согласен
|
|
13.10.2006, 14:57 | #15 |
Участник
|
Я бы добавил пункт 10:
По возможности не допускай множественного обновления значений SumIndexFields в пределах одной транзакции. Проведи расчеты используя временные таблицы и после этого один раз обнови данные на сервере. |
|
15.10.2006, 00:02 | #16 |
Участник
|
Цитата:
Собственно не понимаю, о чем спор
Дело в том, что ВСЕ советы В ПРИНЦИПЕ правильные. Но либо настолько неудачно сформулированы, либо верны с такими оговорками, что становятся скорее ВРЕДНЫМИ. Еще никак не мог отделаться от ощущения "где-то я это видел". Оказывается эти советы - весьма вольный перевод документа "Minimizing the Impact on SQL Server", который сам-то в свое время произвел на меня впечатление примерно такое "мы дико извиняемся за плохо выполненную работу по переводу навижен на SQL, но вот некоторые советы, которые _возможно_ вам помогут". Потому что вышел поздно и потому что советы были уж больно банальные. Еще немного полемики Цитата:
Examples of temporary tables are Sales Line...
Цитата:
По поводу Option Field
Цитата:
Microsoft Business Solutions-Navision использует эти функции только в новых, а не модернизируемых обьектах
Цитата:
по поводу сифтов
Цитата:
по поводу 8 и 9
Напоследок. Советы 1,3,6. К сожалению, в навижен нет возможности установить порядок сортировки, не создавая ключа. Поэтому в качестве перевода этих советов: - сделал новый ключ - сними обе галки (SQL и SIFT). Включение этих галок - процесс творческий, требует серьезной аналитической работы. Потом включишь, если понадобится. Советы 2,7. Относятся не к созданию ключей, а к индексации таблиц. Такие ключи надо строить, предварительно поработав с запросами к базе, а не "по советам". Подумай, попробуй, сделай и семь раз проверь, а потом следи за базой первое время. Прочти и периодически перечитывай документы по производительности от MBS. Они написаны очень аккуратно и корректно. Научись в конце концов использовать SQL Profiler, Client Monitor и понимать план запроса, который показывает Query Analyzer. Цитата:
На сегодня достаточно. Пора спать.
|
|
16.10.2006, 11:18 | #17 |
Участник
|
Формулировки, конечно, не очень удачные, особенно первый пункт. Вместо "удали" надо было бы "сними галочку с MaintainSQLIndex".
Но тем не менее, состоялось обсуждение, приблизившее нас к лучшему пониманию темы. Очень надеюсь, что наше полное взаипонимание в вопросе "пора спать" не сводится к пожеланию мне вечного сна. Спасибо. |
|
16.10.2006, 12:03 | #18 |
Участник
|
Цитата:
Очень надеюсь, что наше полное взаипонимание в вопросе "пора спать" не сводится к пожеланию мне вечного сна
|
|
09.02.2007, 16:58 | #19 |
Участник
|
У меня выскакивала ошибка Overflow under type conversion of Text to Text в кодюните 70200 в функции
NoteIndexUseCalcSums в строках <div class='CALtop'>C/AL</div><div class='CAL'> FOR N:= 1 TO FieldsNo DO BEGIN IF STRPOS(FieldsArray[N],VarNameCalcSums) > 0 THEN FieldsArray[N] := COPYSTR(FieldsArray[N],STRLEN(VarNameCalcSums)+2); FieldsArray[N] := DELCHR(SELECTSTR(N,FieldsStr),'=','"'); FieldsArray[N] := DELCHR(FieldsArray[N],'<>',' '); END; </div> В какой именно не знаю, т.к. при включённом дебагере вылетал навижен Вроде бы вылечилось увеличением длины текстовой переменной FieldsArray до 100 |
|
09.02.2007, 17:30 | #20 |
Участник
|
В этом же куске выскакивает ошибка о переполнении количества элементов массива FieldsArray. Щас буду увеличивать
|
|