(Возврат на основную страницу)

 

Содержание номера за Апрель 2009 год

SQL Server
для
 администраторов

Апрель 2009
№ 4 (34)

Рон Толмейдж

Сценарии для работы с индексами в SQL Server 2000

Разрешение взаимоблокировок в SQL Server 2000. Часть 2

Редактор SQL, предназначенный для разработчиков баз данных

Дэнни Ли

Оптимизация на основе данных о характере использования в SQL Server 2008 Analysis Services

 

 

Сценарии для работы с индексами в SQL Server 2000

Рон Толмейдж (Ron Talmage)

Индексирование таблиц — самый эффективный способ оптимизации выполнения запросов к данным SQL Server. Нередко, для поддержки различных вариантов поиска, таблице требуется несколько индексов. И только в одном-единственном случае индексы, построенные для больших таблиц, напротив, становятся помехой. Массовое копирование данных в таблицу выполняется гораздо быстрее, если у нее нет индексов вообще или хотя бы отсутствует кластеризованный индекс. В подобных ситуациях имеет смысл удалить и затем восстановить индексы посредством сценариев Transact-SQL. Из этой статьи вы узнаете, как генерировать такие сценарии при помощи хранимых процедур на языке Transact-SQL. Описанный здесь подход оказывается более надежным и менее трудоемким, нежели применение средств для генерации сценариев из состава SQL Server Enterprise Manager.

Недавно я участвовал в проекте, одна из задач которого состояла в переносе нескольких больших таблиц базы данных с одного сервера на другой. Для экспорта данных мы выбрали команду bcp.exe, а для импорта их в новую базу — оператор BULK INSERT. Чтобы импорт выполнялся эффективнее, мы решили, что у новых таблиц не будет вообще никаких индексов или (как минимум) кластеризованного индекса.

Обратившись вначале к средствам работы со сценариями Enterprise Manager, мы столкнулись с некоторыми проблемами, — в частности, для получения сценария, включающего, помимо индексов, только определения первичного ключа и уникальности, — ничего более, — приходилось выполнять множество операций копирования/вставки. На самом деле нам требовался сценарий, создающий таблицы без индексов, а затем еще и сценарий, который добавил бы все необходимые индексы (кластеризованный — первым) уже после загрузки данных в таблицы.

Я нуждался в настраиваемом, модифицируемом, а также позволяющем задавать порядок индексов инструменте для работы со сценариями. Можно было бы обратиться непосредственно к объектной модели SQL­DMO и создавать сценарии, вызывая ее методы, как это, собственно, и делает Enterprise Mana­ger, но, скорее всего, на этом пути нас поджидали бы аналогичные трудности. Вместо этого я разработал набор процедур на языке Transact­SQL, который и привожу здесь после усовершенствования и тестирования.

Использование системных функций вместо системных таблиц

Стандарты программирования на языке Transact-SQL предлагают избегать прямых запросов к системным таблицам и обращаться к свойствам объектов базы данных при помощи системных функций (по возможности). Применение таких встроенных функций Transact-SQL, как ObjectProperty() или IndexProperty(), обеспечивает независимость кода от недокументированных изменений системных таблиц, которые могут быть включены в пакет обновления или в новую версию. В отличие от функций ServerProperty() и DatabasePropertyEX(), функции ObjectProperty() и IndexProperty() необходимо выполнять в базе данных, содержащей интересующие вас объекты. Конечно, если потребуется изменять контекст базы данных прямо в коде, придется воспользоваться динамическим SQL.

Разделители строк

Правила языка SQL, относящиеся к разделителям строк, несколько причудливы. В соответствии со стандартом ANSI SQL в качестве разделителей (ограничителей) строк нельзя использовать двойные кавычки, хотя можно применять одинарные. Напротив, нестандартные имена, которые содержат запрещенные символы, например пробел, следует заключать в двойные кавычки, иначе такие имена будут восприняты как некорректные. Однако прежние версии Transact-SQL воспринимали двойные кавычки как обычный разделитель строк, поэтому в команду SET был добавлен параметр QUOTED_IDENTIFIER, позволяющий указать, какому из стандартов — ANSI SQL или прежнему T-SQL — следовать. В версиях SQL Server 7.0 и 2000 этот параметр по умолчанию установлен в ON, и двойные кавычки не могут служить ограничителями для строк. Открывающая и закрывающая квадратные скобки были включены Microsoft в версию SQL 7.0, чтобы отделять имена таблиц и столбцов вне зависимости от значения параметра QUOTED_IDENTIFIER. Поэтому код, приведенный в статье, использует квадратные скобки, а не двойные кавычки. На самом деле я никогда не использую двойные кавычки, поэтому неважно, какое значение будет иметь параметр QUOTED_IDENFITER для приведенных здесь процедур и для сформированных с их помощью сценариев.

Разрешение взаимоблокировок в SQL Server 2000. Часть 2

Рон Толмейдж (Ron Talmage)

Методы разрешения взаимоблокировок

Основными методами, применяемыми для разрешения взаимоблокировок, являются:

•    Устранение запросов несовместимых блокировок

•    Перераспределение транзакций во времени

•    Изменение последовательности запросов ресурсов

•    Изменение уровня изоляции

Устранение запросов несовместимых блокировок

Не исключено, что некоторые запросы к данным пытаются наложить слишком много блокировок или даже ненужные в конкретном случае блокировки, а в результате становятся участниками взаимоблокировок. Такое случается, если предложение WHERE недостаточно ограничивает выборку, допуская данные, которые, в сущности, не нужны. Например, запрос может считывать целую таблицу или диапазон строк, хотя на самом деле требуются данные только одной строки. Запросы к данным иногда пытаются получить или удержать блокировки неподходящего типа, если без необходимости включены такие подсказки, как HOLDLOCK или UPDLOCK.

Перераспределение транзакций во времени

Иногда помогает перераспределение транзакций во времени. Взаимоблокировки возникают тогда, когда время выполнения транзакций совпадает, причем совпадает с большой точностью. Чем длиннее транзакции, тем выше вероятность взаимоблокировки, следовательно, ситуация может улучшиться, если вы уменьшите транзакции по объему операций или сократите их, оптимизировав по продолжительности. Попробуйте организовать транзакции так, чтобы они вообще не пересекались во времени. Не исключено, что последовательное выполнение заданий пакетной обработки окажется эффективнее, чем параллельное, возможно, такие задания следует запускать, когда пользователи отключены.

Изменение последовательности запросов ресурсов

Для «мультиресурсных» взаимоблокировок, в которых участвуют только монопольные блокировки, следует убедиться, что доступ к ресурсам производится в одном и том же порядке. Хранимым процедурам, обращающимся к набору таблиц, стоит соблюдать это, достаточно общее, правило. Изменение порядка запросов ресурсов обычно не помогает в случае смешанных «мультиресурсных» взаимоблокировок типа «X­S», поскольку они происходят как раз тогда, когда обе транзакции обращаются к ресурсам в одинаковой последовательности (табл. 1).

Изменение уровня изоляции

Чтобы разрешить особо упорные взаимоблокировки, иногда приходится изменять уровень изоляции. Для «моноресурсных» взаимоблокировок конверсии можно понизить уровень изоляции начальных блокировок, исключив уровень SERIALIZABLE или подсказки HOLDLOCK. В случае смешанных «мультиресурсных» блокировок типа «X­S» воспользуйтесь подсказкой блокировки для запросов к данным, применяющим совмещаемые блокировки, то есть для операторов SELECT. Указание NOLOCK понижает уровень изоляции запроса к данным, а команда SET ISOLATION LEVEL — уровень изоляции всей транзакции:

SET ISOLATION LEVEL READ UNCOMMITTED

Если чтение транзакцией незафиксированных, неподтвержденных данных вас не устраивает, примените указание READPAST, тогда запросы к данным, использующие разделяемые блокировки, пропустят («обойдут стороной») заблокированные ресурсы. В отличие от варианта с понижением уровня (транзакции/запроса к данным) незафиксированные данные считываться не будут. В общем случае, при разрешении смешанных «мультиресурсных» взаимоблокировок типа «X­S» подсказка READPAST обеспечивает большую «чистоту» результата по сравнению с подсказкой NOLOCK.

Взаимоблокировки могут стать досадной помехой функционированию активной системы, построенной на транзакциях. Но обратившись к утилите SQL Server Profiler и к выходной информации флага трассировки 1204, вы одолеете даже самые стойкие из них.

(Использование нового уровня изоляции SQL Server 2005/2008 — snapshot isolation позволяет развести чтение и запись данных по совершенно разным объектам и дает возможность существенно сократить число взаимоблокировок, возникающих на конфликте чтение/запись. — Прим. ред.)

* См. Рон Толмейдж. Разрешение взаимоблокировок в SQL Server 2000. Часть 1 // SQL Server для администраторов. 2009. № 3.

Редактор SQL, предназначенный для разработчиков баз данных

 

Elmue — редактор SQL, оснащенный функциями синтаксического анализа, редактирования и исполнения кода, создания резервной копии базы данных, сравнения таблиц, формирования сценариев и замера времени (рис. 1).

Возможности

SqlBuilder — очень удобный, мощный и интеллектуальный инструмент, написанный на языке C# и предназначенный для всех разработчиков баз данных.

•    SqlBuilder значительно упрощает работу с серверами SQL.

•    В частности, SqlBuilder предназначен полностью заменить примитивные и неудобные приложения Query Analyzer и Enterprise Manager, входящие в состав Microsoft SQL Server.

•    SqlBuilder снабжен сложным синтаксическим анализатором Syntax Parser, который не только раскрашивает команды SQL цветным шрифтом, но также автоматически преобразует неаккуратно написанный код в удобочитаемый. Длинные операторы SQL, такие как SELECT, автоматически (и интеллектуально, то есть отражая логику оператора) разбиваются на несколько строк с отступами. Синтаксический анализ производится параллельно с вводом текста. Обычно подобная функциональность присуща только дорогостоящим инструментам.

•    SqlBuilder автоматически считывает с сервера хранимые процедуры, представления, функции и триггеры и позволяет редактировать и сохранять их.

•    Любой оператор SQL может быть исполнен — результат отразится как скалярное (единственное) значение или как таблица/таблицы.

•    Чтобы выполнить фрагмент SQL­кода, представленного на экране, достаточно выделить этот фрагмент и нажать комбинацию клавиш CTRL+E.

•    Операторы SQL запускаются в отдельном потоке, поэтому графический интерфейс пользователя (GUI) не «зависает», даже если код SQL выполняется очень долго.

•    Для каждого файла и системного объекта имеется собственный буфер отмены Undo, работающий только с содержимым «своего» файла или объекта и при одновременном редактировании другого файла.

•    Все процедуры, представления, функции, триггеры и определения таблиц можно очень быстро (моментально) сохранить в виде файлов *.sql. (DataBase Backup).

•    При необходимости поиск текстовой строки выполняется непосредственно на сервере во всех процедурах, представлениях, функциях и триггерах (DataBase Search).

•    SqlBuilder позволяет командам разработчиков использовать системы контроля версий Subversion или CVS для хранения процедур, функций и т. п., измененных на сервере со времени выпуска последней версии, а также автоматически создавать один большой объединенный файл SQL, выполнив который клиенты смогут обновить свой сервер до новой версии. Файл, включающий все изменения для новой версии, создается одним щелчком мыши.

•    Все функции редактора SQL доступны посредством клавиатуры (см. кнопку «Help» (Справка)).

•    SqlBuilder замеряет время выполнения оператора SQL с точностью до 1 мс. Таким образом, сопоставляя «скорость» исполнения различных операторов, можно оптимизировать SQL­код.

•    Если к тому же запустить оператор SQL при помощи комбинации клавиш CTRL+B, то предварительно будет очищен кэш сервера (DBCC FREE­PROC­CACHE...). Таким образом замеряется время, необходимое для первоначального (то есть до сохранения сервером плана запроса в кэше) выполнения оператора SQL. В подобной ситуации оператор может выполняться в десять (и более) раз дольше!

•    Если выполнить два запроса SELECT или EXECUTE одновременно, в результате вернется набор данных, состоящий из двух таблиц. Тогда можно сравнить эти две таблицы на полное совпадение. SqlBuilder сообщит о несоответствии результатов, даже если различается только порядок строк. При необходимости SqlBuilder удалит все одинаковые строки из таблиц, оставив только расхождения. Таким образом, становится очевидно, к чему привели изменения, внесенные в процедуру, — возвращает ли процедура те же самые данные, что и до модификации.

•    Результаты запроса можно экспортировать в файл HTML или лист Excel.

•    Если программа, открывающая файлы с расширением *.sql, еще не назначена, то в дальнейшем файлы SQL будут открываться в редакторе Sql­Editor. Если же программа по умолчанию для файлов SQL уже существует, это назначение останется в силе, но в контекстном меню Проводника появится новый пункт «Open with SqlBuilder» (Открыть при помощи SqlBuilder).

•    При самом первом открытии приложения Sql­Buil­der для него добавляется ярлык — как в главное меню, так и на панель быстрого запуска. Если ярлык не нужен, достаточно удалить его, — больше ярлык создаваться не будет.

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

•    Это живой проект. Последующие версии обязательно будут выложены на сайте http://netcult.ch/elmue.

Ограничения

•    Должна быть установлена платформа .NET Frame­work 1.1.

•    Мы ни разу не пытались компилировать SqlBuilder в среде Visual Studio 2005. Поскольку Microsoft никогда не заботится о совместимости собственного программного обеспечения с прежними версиями, не исключено, что вам придется внести в код некоторые изменения. Пожалуйста, не сообщайте о проблемах в среде Visual Studio 2005! Если вы компилировали программу не в среде Visual Studio 2003, где все выполняется превосходно, это ваша вина! (Нам удалось успешно скомпилировать проект в среде VS2005. В процессе конвертирования из VS2003 в VS2005 мастер создал архивную копию исходников. — Прим. ред.)

•    Мы не пробовали работать с сервером баз данных, отличным от Microsoft SQL Server. Возможно, модифицировав часть кода, вы приспособите проект для Oracle.

Применение

Выберите папку для текущей версии своего серверного проекта. SqlBuilder создаст в рабочем каталоге два подкаталога — DatabaseBackup и Scripts (рис. 2, 3).

SqlBuilder помещает в рабочий каталог XML­файл с настройками сервера (именем сервера, именем пользователя, паролем и т. п.). Если вы хотите работать с несколькими серверами SQL, создайте рабочий каталог для каждого из них.

Настоятельно рекомендуется всегда добавлять временную папку для экспериментов с командами SQL, не хранящимися в системе контроля версий. На следующем шаге добавьте файлы SQL или системные объекты, которыми собираетесь манипулировать (рис. 4).

Вне зависимости от того,

•    введете ли вы имя для нового файла SQL или

•    выберете ли в раскрывающемся списке имя уже существующей процедуры или

•    введете ли имя для новой функции,

SqlBuilder добавит это имя к списку файлов в главном окне (рис. 5).

Между добавлением файла и добавлением системного объекта имеется существенное различие. Крайне важно, чтобы вы осознали следующее.

Добавление системного объекта

Добавление системного объекта — такого, как процедура, функция, представление или триггер, — означает, что все изменения, внесенные в код SQL, сохраняются на сервере! SqlBuilder создает в вашем рабочем каталоге пустой файл (например, fn_GetUserById.func), вообще не содержащий никакого кода SQL! (Если вы добавите комментарий, он будет сохранен локально в этом файле.)

Добавление файла

С другой стороны, когда вы добавляете «File» (Файл) (Test.sql, как на рисунке выше), все изменения, внесенные в код SQL, сохраняются локально в этом файле. Применяйте тип «File» только для кода SQL, добавляющего данные в таблицы (INSERT), обновляющего данные в таблицах (UPDATE), изменяющего определения таблиц или удаляющего (DROP) системные объекты. Не используйте «File» для хранения определений процедур, функций и т. п.!

Для любого из объектов SqlBuilder создаcт в подпапке папки Scripts соответствующий файл. Папка Scripts включает отдельную подпапку для каждой базы данных (рис. 6).

Как работать с системой контроля версий CVS/Subversion

Вы вместе со своими коллегами можете включить все содержимое папки Scripts в систему контроля версий. Когда новая версия будет готова, достаточно щелкнуть кнопку «Build Script» (Построить сценарий), и SqlBuilder создаст один большой составной сценарий на языке SQL. В этот сценарий войдут:

•    cодержимое (неизмененное) всех файлов (того, что вы добавляли как «File») и

•    последние версии всех процедур, функций, представлений и т. п., считанные непосредственно с вашего SQL Server.

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

Работа с комментариями

Комментарии, относящиеся к процедурам, функциям и т. п., предназначены только для внутреннего использования вами и вашими коллегами! Они не добавляются в составной сценарий, равно как и не хранятся на сервере. Перед тем как щелкнуть кнопку «Build Script» («Построить сценарий»), следует переупорядочить список файлов и объектов, перетащив мышью его элементы. Составной сценарий компонуется в том же самом порядке, в котором расположены элементы списка. Если составной сценарий создает новую процедуру, зависящую от новой функции, необходимо сначала создать функцию, а затем — процедуру, чтобы избежать ошибок SQL Server, могущих возникнуть у ваших клиентов. Воспользуйтесь полем комментария, чтобы не упустить подобные нюансы. Например, «Эта процедура зависит от fn_GetUserByID!».

Резервное копирование базы данных

Чтобы не потерять проделанную работу, советую как минимум раз в неделю обращаться к кнопке «Database Backup» (Резервное копирование базы данных), а также включить всю папку DatabaseBackup в систему контроля версий. Даже если на вашем SQL Server используется резервное копирование, которому вы полностью доверяете, копирование SqlBuilder имеет свое преимущество, — вы получаете возможность сравнивать процедуры, функции, представления и т. п. с более ранними версиями при помощи встроенных средств CVS/Subversion, и таким образом видите, какие процедуры изменились и какие именно корректировки были в них внесены по отношению к более ранним версиям.

Все файлы в папке резервного копирования имеют дату их создания на SQL Server. К сожалению, Micro­soft SQL Server не хранит дату последней модификации.

Редактор SQL

Воспользуйтесь кнопкой «Help» (Справка), чтобы ознакомиться со всеми комбинациями клавиш, применяемыми в редакторе SQL (рис. 7)!

Редактор SQL помещает каждое изменение в буфер Undo, на котором не отражается параллельная правка другого файла. При помощи комбинации клавиш CTRL+Z вы в любой момент вернетесь к предыдущему рабочему состоянию.

Выполнение кода

Вы можете выделить любой фрагмент кода SQL и выполнить его посредством комбинации клавиш CTRL+E. Если никакая часть кода не выделена, то исполняется весь код целиком. Эта возможность предназначена только для файлов (Files). Поэтому рекомендуется использовать временный рабочий каталог (Temp working directory) с некоторыми временными файлами (Temp files). Если в качестве результата возвращается скалярное (единственное) значение или запрос вообще не возвращает данных, это будет отображено в нижней части основного окна. Если результатом являются одна или несколько таблиц, они выводятся в окне ResultView (рис. 8).

Время выполнения всегда показывается с точностью до одной миллисекунды. Чтобы посмотреть время выполнения после очистки серверного кэша, достаточно вместо комбинации клавиш CTRL+E воспользоваться комбинацией CTRL+B.

Сравнение таблиц

В окне ResultView присутствует кнопка «Compare» (Сравнить), по щелчку которой выполняется сравнение содержимого двух таблиц. Для этого необходимо отправить на сервер две команды одновременно. Например:

EXEC pr_GetUserData 877
EXEC pr_GetUserData_Modified 877

SQL Server вернет набор данных, состоящий из двух таблиц. Если pr_GetUserData — хранимая процедура и pr_GetUserData_Modified — та же самая процедура, только модифицированная, вы увидите, как внесенные изменения отразились на возвращаемом процедурой результате.

Синтаксический анализатор SQL

Синтаксический анализатор SQL — это сердцевина приложения и к тому же наиболее сложная его часть. Разработать синтаксический анализатор для кода HTML или C++ чрезвычайно просто по сравнению с созданием синтаксического анализатора SQL, что представляет собой настоящую проблему. В то время как другие языки программирования построены по строгим синтаксическим правилам (например, в HTML каждый тег открывается подстрокой <ТЕГ>, а закрывается подстрокой </ТЕГ>, или в C++ все операторы представлены в форме функция(аргумент, aргумент); и к тому же оканчиваются точкой с запятой), SQL — это «язык» без правил.

•    Не существует способа определить, где заканчивается оператор. Наиболее сложный оператор SELECT может включать предложение WHERE, а может и не включать. Также он может иметь или не иметь предложение JOIN и т. п. Этот оператор закачивается тогда, когда заканчиваются все его предложения.

•    Разрывы (переносы) строк могут встретиться в любом месте, а могут и полностью отсутствовать.

•    Скобки являются необязательной частью операторов и могут появиться (или не появиться) также практически в любом месте.

•    Некоторые элементы языка (например, LEFT) представляют собой как ключевое слово (в предложении JOIN LEFT), так и функцию (как left(string, count)).

В конце концов, SQL — вообще не «язык» программирования. Поэтому случается, что из­под «пера» неопытных программистов выходит не читабельный код, а «черт знает что такое». Синтаксический анализатор SqlBuilder способен привести в порядок самый неудобоваримый код SQL.

Вот пять последовательных шагов работы анализатора:

1.  Сначала анализатор выполняет разбор собственно текста SQL, выделяет команды, ключевые слова, функции, типы данных, операторы, строки, числа, комментарии и т. п., для каждого из этих элементов создает экземпляр объекта ParseItem и помещает его в двунаправленный связный список.

2.  Потом анализатор разбирает все скобки и разносит их содержимое на несколько строк, если оно достаточно объемно.

3.  Затем анализатор при помощи рекурсии выполняет разбор отдельных сложных операторов, таких как SELECT, CASE, CREATE, BEGIN, END,....

4.  На следующем шаге анализатор разбирает и корректирует все разрывы (переносы) строк.

5.  И, наконец, анализатор заполняет объект RtfHtml­Builder (см. далее) разобранными данными, чтобы создать из них документ RTF, код HTML или простой текст.

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

Класс «Defaults»

В проект SqlBuilder входит класс с именем Defaults. С его помощью вы задаете стандартные значения настроек программы в соответствии со СВОИМИ предпочтениями, — в том числе цвета шрифта для кода, разобранного синтаксическим анализатором, время ожидания или сервер SQL, выбираемый по умолчанию, до того, как пользователь укажет сервер явно…

Специальные элементы управления

В проект SqlBuilder включено несколько классов для реализации специальных элементов управления. Вы можете скопировать эти классы и использовать их и в других приложениях C#.

RichTextBoxEx

Этот класс является производным от класса Rich­Text­Box и дополняет его следующими функциями:

•    Диалоговым окном «Search and Replace» (Найти и заменить).

•    Диалоговым окном «Goto Line» (Перейти к строке).

•    Отображением текущих строки и позиции символа в строке состояния.

•    Расширенными возможностями прокрутки.

•    Не вызывающей мерцания и сохраняющей позицию курсора полной заменой RTF­содержимого элемента управления.

•    Буфером для отмены (Undo).

•    Сверхбыстрым созданием RTF посредством Rtf­Html­Builder.

RtfHtmlBuilder

Если вы когда­либо использовали готовый элемент управления RichTextBox фирмы Microsoft и пытались отобразить в нем раскрашенный текст, то уже знаете, что код вида:

richTextBox.SelectionColor = Color.Red;
richTextBox.SelectionIndent =
5;
richTextBox.AppendText("Text“);
....

работает очень медленно. Настолько медленно, что пользователь вынужден ждать 20 секунд при выводе текста объемом 50 KB, — просто невероятно!

RtfHtmlBuilder

Сверхбыстрый класс построителя для RTF, HTML и простого текста.

rtfBuilder.SelectionColor = Color.Red;
rtfBuilder.SelectionIndent = 5;
rtfBuilder.AppendText("Text");
.....
string s_Rtf = rtfBuilder.BuildRtf(new Font("Microsoft Sans Serif", 17));
richTextBoxEx.ReplaceRtf(s_Rtf); // замена текста без мерцания

ListViewEx

Этот класс является производным от класса ListView и позволяет пользователю изменять порядок элементов списка, просто перетаскивая их мышью.

DataGridEx

Этот класс умеет как рисовать разноцветные ячейки элемента DataGrid, так и многое другое.

PasswordTextBox

Этот класс позволяет вводить пароли, которые невозможно отследить при помощи средств для слежения API Spy или .NET Spy. Пароль хранится внутренним образом в виде 128­ми зашифрованных байтов. В процессе набора пароль отображается в поле ввода обычным текстом, в остальных ситуациях представляется 12 звездочками независимо от настоящей длины пароля.

P.S.: Вы можете загрузить и другие проекты Open Source с сайта http://netcult.ch/elmue.

Лицензия

Эта статья, равно как относящиеся к ней исходный код и файлы, лицензирована под GPL (http://www.opensource.org/licenses/gpl­license.php).

Оптимизация на основе данных о характере использования в SQL Server 2008 Analysis Services

Дэнни Ли (Denny Lee)

 

С момента появления Microsoft SQL Server Analysis Services одним из методов оптимизации производительности запросов было использование возможности оптимизации на основе характера использования. Разработчики могут создавать свои OLAP-кубы и секции кубов, а затем устанавливать агрегаты для кубов с низким процентом агрегирования. Зачастую разработчики устанавливали агрегаты для своих секций на 0%-5%. После того как OLAP-база данных была внедрена на рабочие серверы, должен быть проведен период бета-тестирования, для того чтобы пользователи поработали с кубом и сохранили компоненты запросов к кубу. После этого разработчики могут создать агрегаты, основываясь на запросах пользователей, как правило оптимизируя самые медленные запросы. Эти агрегаты могут существенно повысить производительность изначально медленных запросов. В SQL Server 2008 Analysis Services был включен усовершенствованный алгоритм оптимизации на основе характера использования, который помогает Analysis Services создавать более качественные агрегаты.

(Возврат на основную страницу)

Hosted by uCoz