Рассылка закрыта
При закрытии подписчики были переданы в рассылку "Вопросы и ответы по MS SQL Server" на которую и рекомендуем вам подписаться.
Вы можете найти рассылки сходной тематики в Каталоге рассылок.
MS SQL Server - дело тонкое...
Информационный Канал Subscribe.Ru |
#204<< #205 |
СОДЕРЖАНИЕ СОВЕТЫ Повышение доступности SQL Server 2000: Failover кластеры. (Продолжение) По материалам статьи Microsoft: SQL Server 2000 High Availability Series: Implementing Failover Clustering Содержание
Возврат на основной узел после отработки отказа
В кластере с одним экземпляром, зачастую нет необходимости после отказа возвращать экземпляр на первоначальный
узел. Если Вы используете симметричные серверы, которые предназначены для одного приложения, их работа будет
выполняться одинаково на любом из узлов. Возвращение экземпляра назад приведёт только к лишнему простою. Настройка автоматического возврата в заданное время
1. Нажмите кнопку Start, выберите пункт Programs, а затем запустите оснастку Cluster Administrator.
1. Нажмите кнопку Start, выберите пункт Programs, а затем запустите Cluster Administrator. Восстановление узла кластера после полного выхода из строя (катастрофы) Если один из узлов кластера полностью потерял работоспособность в результате серьёзного отказа (краха) или катастрофы, Вам, возможно, придется восстанавливать отказавший сервер. Используйте перечисленные ниже шаги и процедуры для того, чтобы восстановить работу этого сервера в кластере после отказа. Восстановление сервера после краха
1. На выжившем узле, удалите потерпевший крах узел из состава виртуального сервера. Если Вы имеете на узле более
одного виртуального сервера, внесите такие изменения во всех виртуальных серверах. Удаление узла из виртуального сервера
1. Вставьте CD диск SQL Server 2000 Enterprise Edition.
1. Нажмите кнопку Start, выберите Programs, а затем запустите Cluster Administrator.
1. Переустановите Windows, подключитесь к серверу - контроллеру домена и примените самые последние сервисные
пакеты для Windows, установленном на новых аппаратных средствах. Добавление восстановленного узла в виртуальный сервер
1. Вставьте CD диск SQL Server 2000 Enterprise Edition в привод CD-ROM любого узла кластера. Вы можете добавить
восстановленный узел в виртуальный сервер с любого узла кластера.
Для получения подробной информации о темах, описываемых в этой статье, обратитесь к следующим документам:
SQL Server: соглашения при программировании баз данных, советы и лучшие методики
По материалам статьи Vyas Kondreddi:
SQL Server Database Coding Conventions, Best Practices and Programming Guidelines
Базы данных являются сердцем и душой многих приложений на предприятиях, и очень важно обращать особое внимание на программирование баз данных. Я видел много случаев, когда программирование баз данных пускается на самотек, т.к. считается, что это что-то легкое и может быть сделано любым пользователем. Это неверно. Для лучшей работы с базами данных Вам нужны настоящий администратор баз данных и специалист по программированию баз данных, причем не важно, что вы используете: Microsoft SQL Server, Oracle, Sybase, DB2, или что-то еще! Если у Вас нет специалистов по базам данных во время разработки, это часто оканчивается тем, что базы данных становятся узким местом при повышении производительности системы. Я решил написать эту статью, чтобы соединить вместе лучшие методы программирования баз данных, так, чтобы это было полезно и администраторам, и разработчикам баз данных. Здесь представлены советы и методики, позволяющие повысить качество разработки, производительность и простоту обслуживания. Этот список сейчас еще далеко не полный, и будет постоянно обновляться. Хочу высказать отдельное спасибо Tibor Karaszi (SQL Server MVP) и Linda (lindawie) за то, что они нашли время прочитать эту статью и выдать свои предложения по ее улучшению. - Утвердите соглашения по наименованию объектов базы данных, сделайте их стандартом для всей вашей организации, и будьте последовательны в их использовании. Это поможет сделать Ваш код более читабельным и понятным. Нажмите на эту ссылку, чтобы увидеть соглашения по наименованию объектов базы данных, которых я придерживаюсь. - Убедитесь, что Ваши данные находятся хотя бы в 3 нормальной форме. В то же время, производительность запросов не должна страдать. Небольшая денормализация помогает быстрому выполнению запросов. - Создавайте подробные комментарии в Ваших хранимых процедурах, триггерах и особенно в SQL скриптах, когда что-либо не является очевидным. Это сделает Ваш код понятным для других программистов. Не переживайте за длину Ваших комментариев, т.к. это не повлияет на производительность, в отличие от других интерпретаторов, таких, как ASP 2.0. - Не используйте выражение SELECT * в Ваших запросах. Всегда указывайте названия столбцов после оператора SELECT, например: SELECT CustomerID, CustomerFirstName, City. Этот способ обеспечивает меньшее количество дисковых операций и лучшую производительность. - Старайтесь избегать серверных курсоров, насколько это возможно. Всегда используйте 'подход, основанный на выборках' вместо 'процедурного подхода' для доступа к данным и их изменения. Часто можно избежать применения курсоров, пользуясь командой SELECT. Если не получается избежать использования курсора, то используйте цикл WHILE. Я проводил сравнение и пришел к выводу, что цикл WHILE обычно работает быстрее, чем курсор. Но чтобы заменить курсор циклом WHILE, Вам понадобится столбец (первичный или уникальный ключ), чтобы уникально идентифицировать каждую строку. По моему мнению, первичный или уникальный ключ должна иметь каждая таблица. Нажмите на эту ссылку, чтобы увидеть несколько примеров использования цикла WHILE. - По возможности избегайте создавать временные таблицы при обработке данных, потому что создание временных таблиц означает большее количество дисковых операций. Вместо временных таблиц лучше максимально используйте дополнительные возможности SQL, представления, табличные переменные SQL Server 2000 и вторичные таблицы. - Старайтесь избегать использовать специальные символы в начале слова при поиске при помощи оператора LIKE, так как это приводит к сканированию индекса, что противоречит цели создания этого индекса. Следующее выражение приводит к сканированию индекса (index scan), тогда как второе выражение приводит к поиску в индексе (index seek):
SELECT LocationID FROM Locations WHERE Specialities LIKE '%pples' Также избегайте использовать в поиске операторы неравенства <> и NOT, т.к. это тоже приводит к сканированию индекса. - Используйте вторичные таблицы (derived tables) когда только возможно, так как они выполняются быстрее. Обратите внимание на следующий запрос, который выдает вторую наибольшую зарплату из таблицы Employees:
SELECT MIN(Salary) Тот же запрос может быть переписан с использованием вторичной таблицы, как показано ниже, и будет выполняется в 2 раза быстрее, чем предыдущий запрос:
SELECT MIN(Salary) Это всего лишь пример, и результаты Ваших запросов могут отличаться в различных ситуациях в зависимости от структуры базы данных, используемых индексов, объема данных, и т.п. Поэтому рассматривайте все возможные варианты написания запроса и используйте наилучший из них. - Когда Вы разрабатываете Вашу базу данных, всегда помните о производительности. Вы едва ли сможете улучшить производительность позже, когда ваша база данных будет находиться в рабочем режиме, т.к. это требует перестройки таблиц и индексов, переписывания запросов, и т.д. Используйте план выполнения запросов в Query Analyzer или команды SHOWPLAN_TEXT или SHOWPLAN_ALL для анализа Ваших запросов. Убедитесь, что Ваши отчеты выполняют поиск по индексу (index seek) вместо сканирования индекса (index scan) или таблицы (table scan). - Сканирование таблицы или индекса - это очень плохо и должно избегаться везде, где это возможно. Создавайте нужные индексы для нужных столбцов. - Добавляйте имя владельца перед именем таблицы, т.к. это повышает читабельность и позволяет избежать путаницы. Microsoft SQL Server Books Online указывает на то, что добавление имени владельца в имя таблицы даже помогает при повторном использовании плана исполнения, увеличивая производительность. - Добавляйте SET NOCOUNT ON в начало ваших SQL скриптов, хранимых процедур и триггеров при их выполнении в рабочем режиме, т.к. это убирает сообщения типа '(1 row(s) affected)' после выполнения команд INSERT, UPDATE, DELETE и SELECT. Это увеличивает производительность хранимых процедур, снижая трафик. - Используйте более читабельные ANSI-Standard объединения (joins) вместо объединений в старом стиле. С ANSI объединениями выражение WHERE используется только для фильтрации данных, тогда как с объединениями в старом стиле выражение WHERE используется и для объединения, и для фильтрации. В первом из следующих двух запросов используется объединение в старом стиле, а во втором - объединение с новым синтаксисом ANSI:
SELECT a.au_id, t.title
SELECT a.au_id, t.title - Не указывайте перед именами Ваших хранимых процедур "sp_". Приставка sp_ зарезервирована для системных хранимых процедур, которые поставляются вместе с SQL Server. Если процедура начинается с sp_, то SQL Server в первую очередь пытается найти ее в базе данных master, потом ищет по указанным базе данных или владельцу, после этого ищет среди процедур с владельцем dbo. Поэтому Вы действительно можете сэкономить время на поиске хранимых процедуры, избегая приставки "sp_". Представления в основном используются, чтобы показать определенные данные определенным пользователям, которым нужны эти данные. Представления также используются для ограничения доступа к базовым таблицам через выдачу прав только на использование представлений. Еще одно полезное свойство представлений - это то, что они упрощают запросы. Заключите Ваши часто используемые сложные объединения и расчеты в представление, чтобы не повторять эти объединения и расчеты во всех Ваших запросах. Вместо этого Вы просто сделаете выборку из представления. - Используйте пользовательские типы данных (User Defined Datatypes), если какой-либо столбец постоянно встречается в таблицах, чтобы тип данных этого столбца совпадал во всех этих таблицах. - Не позволяйте Вашим клиентским приложениям запрашивать данные или манипулировать данными напрямую, используя команды SELECT или INSERT/UPDATE/DELETE. Вместо этого создайте хранимые процедуры и дайте Вашим приложениям доступ к этим процедурам. Это делает политику доступа к данным прозрачной и единой для всех модулей Вашего приложения, и одновременно сосредотачивает бизнес-логику внутри базы данных. - Старайтесь не использовать типы данных TEXT и NTEXT для хранения текстовой информации больших объемов. Тип данных TEXT имеет некоторые врожденные проблемы. Например, Вы не можете напрямую писать или изменять текстовые данные, используя команды INSERT или UPDATE. Вместо Вы вынуждены использовать специальные команды, такие, как READTEXT, WRITETEXT и UPDATETEXT. Существует также множество ошибок, возникающих при репликации таблиц, содержащих столбцы с текстовыми данными. Поэтому если Вам не нужно хранить больше 8 килобайт текста, используйте типы данных CHAR (8000) или VARCHAR(8000). - Если у Вас есть выбор, не храните двоичные или графические файлы (Binary Large Objects - BLOBы) внутри базы данных. Вместо этого храните в базе данных путь к двоичному или графическому файлу, хранящемуся где-нибудь на сервере. Получать эти большие двоичные файлы и манипулировать ими удобнее вне базы данных. В конце концов, база данных вообще не предназначена для хранения файлов. - Используйте тип данных CHAR только для столбцов с ограничением NOT NULL. Если столбец CHAR позволяет хранить значение NULL, то это рассматривается в SQL Server 7.0+ как столбец с фиксированной длиной. Столбец с типом данных CHAR(100), в котором разрешено хранение значений NULL, занимает все 100 байт, что приводит к неоправданной потере дискового пространства. Поэтому используйте в этой ситуации VARCHAR(100). Конечно, столбцы переменной длины обрабатываются несколько дольше, чем столбцы с фиксированной длиной. Для получения оптимального варианта тщательно выбирайте между CHAR и VARCHAR в зависимости от длины данных, которые вы собираетесь хранить. - По возможности избегайте динамических SQL запросов. Динамический SQL медленнее, чем статический SQL, т.к. SQL Server вынужден создавать план исполнения каждый раз во время работы. Можно воспользоваться операторами IF и CASE, чтобы избежать использования динамического SQL. Другим большим недостатком использования динамического SQL является то, что он требует от пользователей иметь прямые права доступа ко всем объектам в динамическом запросе, например, к таблицам и представлениям. Обычно, пользователи имеют доступ к хранимым процедурам, которые ссылаются на таблицы, но не напрямую к этим таблицам. В этом случае динамический SQL не работает. Например, пользователь dSQLuser добавлен в базу данных pubs и имеет доступ к процедуре dSQLproc, но не имеет доступа ни к одной таблице в базе данных pubs. Процедура dSQLproc выполняет команду SELECT на таблице titles, и это работает. Другое выражение в этой процедуре запускает тот же SELECT на таблице titles, используя динамический SQL, и это не удается из-за следующей ошибки:
Server: Msg 229, Level 14, State 5, Line 1 Чтобы воспроизвести эту проблему, используйте следующие команды:
sp_addlogin 'dSQLuser' Теперь подключитесь к базе данных pubs, используя логин dSQLuser, и выполните процедуру dSQLproc, чтобы увидеть проблему. ОКОНЧАНИЕ СЛЕДУЕТ
AWE Memory SQL Server Performance Tuning Tips Самые популярные темы недели
Недостатки MSSQL
транзакционная репликация и начальный снапшот Базы данных: Введение в теорию и методологию.
|
#204<< #205 |
http://subscribe.ru/
E-mail: ask@subscribe.ru |
Адрес подписки |
Отписаться |
В избранное | ||