MS SQL Server

  Все выпуски  

MS SQL Server - дело тонкое...


Информационный Канал Subscribe.Ru

#269<<  #270

СОДЕРЖАНИЕ

1.СТАТЬИ
1.1.Секционированные таблицы и индексы SQL Server 2005 (продолжение)
1.2.Использование статистики оптимизатором запросов Microsoft SQL Server 2005 (продолжение)
1.3.Репликация через Интернет или между доменами без доверительных отношений
2.ССЫЛКИ НА СТАТЬИ
2.1.Статьи на русском языке
2.2.Англоязычные статьи
3.ФОРУМ SQL.RU
3.1.Самые популярные темы недели
3.2.Вопросы остались без ответа
4.АНОНСЫ
4.1.Журнал "Алгоритм", третий номер

СТАТЬИ

Секционированные таблицы и индексы SQL Server 2005 (продолжение)

По материалам статьи Kimberly L. Tripp: SQL Server 2005. Partitioned Tables and Indexes
Перевод Алексея Сафонова

Объединение секционированных таблиц

Когда объединяются выровненные таблицы, SQL Server 2005 может выбирать между объединением таблиц за один шаг, либо в несколько этапов, когда вначале объединяются отдельные секции, а затем подмножества складываются. Но независимо от того, как объединяются секции, SQL Server всегда пытается оценить, насколько возможно исключить из объединения какие-нибудь секции.

[В начало]

Исключение секций

В следующем примере данные запрашиваются из таблиц Order и OrderDetails, созданных в предыдущем сценарии. Запрос возвращает данные о продажах только за третий квартал. Как правило, в третьем квартале потребительский спрос на товары невысок; однако в третьем квартале 2004 года, напротив, был зафиксирован один из самых высоких уровней объема продаж. В данном случае нам интересно, была ли (в третьем квартале) какая-либо взаимосвязь между объемами заказов и датами продаж. Для того чтобы гарантировать, что выровненные секционированные таблицы при объединении извлекают выгоду из исключения секций, Вы должны убедиться, что установили диапазоны секционирования для каждой из таблиц. В данном случае, поскольку первичный ключ (Primary Key) таблицы Orders является составным (OrderDate + OrderID), объединение между таблицами Order и OrderDetails должно производиться не только по равенству OrderID, но и по равенству дат. SARG (Search Argument - Аргумент Поиска) будет применен к обеим секционированным таблицам. В итоге, наш запрос будет выглядеть следующим образом:

SELECT o.OrderID, o.OrderDate, o.VendorID, od.ProductID, od.OrderQty FROM dbo.Orders AS o INNER JOIN dbo.OrderDetails AS od ON o.OrderID = od.OrderID AND o.OrderDate = od.OrderDate WHERE o.OrderDate >= '20040701' AND o.OrderDate <= '20040930 11:59:59.997' GO

На Рисунке 14 представлено несколько ключевых моментов, на которые стоит обратить внимание, изучая реальный или расчетный планы исполнения. Для этого нам придется воспользоваться SQL Server Management Studio. Обратите внимание на значения "Estimated Number of Executions" (расчетное количество выполнений) или "Number of Executions" (количество выполнений) для обеих таблиц. В нашем случае, мы рассматриваем один квартал, т.е. три месяца. Данные за каждый месяц располагаются в своей собственной секции, и поэтому поиск данных выполняется трижды - по одному разу для каждой таблицы.


Рисунок 14: Количество выполнений

Как можно увидеть из Рисунка 15, SQL Server устраняет все лишние секции и оставляет только те, которые содержат необходимые данные, для чего анализирует PARTITION ID:([PtnIds1017]). Вы можете задаться вопросом, откуда взялось выражение PtnIds1017? Если вы обратите внимание на значок "Constant Scan" в верхней части плана исполнения, то увидите что в списке аргументов у него VALUES(((21)), ((22)), ((23))). Это не что иное, как номера секций.


Рисунок 15: Количество выполнений

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

SELECT $partition.TwoYearDateRangePFN(o.OrderDate) AS [Partition Number] , min(o.OrderDate) AS [Min Order Date] , max(o.OrderDate) AS [Max Order Date] , count(*) AS [Rows In Partition] FROM dbo.Orders AS o WHERE $partition.TwoYearDateRangePFN(o.OrderDate) IN (21, 22, 23) GROUP BY $partition.TwoYearDateRangePFN(o.OrderDate) ORDER BY [Partition Number] GO

Из Рисунков 14 и 15 видно как происходит исключение секций. Если секционированные таблицы и индексы выровнены по отношению к таблицам, с которыми объединяются, то могут использоваться и другие методики оптимизации. SQL Server может выполнить "множественные" объединения, объединив вначале все секции.

[В начало]

Предварительное объединение выровненных таблиц

В приведенном ранее запросе SQL Server не только исключает лишние секции, но также производит объединение между оставшимися секциями - по отдельности. Помимо наблюдения за количеством обращений к таблицам во время исполнения запроса вы также должны были обратить внимание на значок "merge join". Если вы присмотритесь, то увидите, что объединение слиянием (merge join) также выполняется три раза.


Рисунок 16: Объединение секционированных таблиц

Обратите внимание, на Рисунке 16 представлен еще один элемент - "nested loops" (объединение "вложенных циклов"). Может показаться, будто это объединение выполняется после объединения слиянием, но на самом деле оказывается, что это объединение является избыточным. Идентификаторы секций к тому моменту уже были переданы для поиска в каждую из таблиц, и это заключительное объединение только сводит вместе две порции данных, удостоверяя, что каждая из них придерживается идентификатора секции, объявленного в начале (в выражении "Constant Scan").

[В начало]

Сценарий "Скользящее Окно"

Как только станут доступными данные следующего месяца (в нашем случае это Октябрь 2004), Вам потребуется руководствоваться определенной последовательностью действий, для того чтобы используя существующие файловые группы "двигать" ("включать"/"выключать") в них данные. По данному сценарию в файловой группе FG1 в настоящее время находятся данные за октябрь 2002. Теперь, когда появились данные за Октябрь 2004, у Вас есть два пути, в зависимости от доступного Вам дискового пространства и требований к архивации. Помните, чтобы "включение" или "выключение" секции из таблицы прошло быстро, оно должно затрагивать ИСКЛЮЧИТЕЛЬНО метаданные. Другими словами, новая таблица (источник или целевая - т.е. скрытая секция) должна быть создана в переключаемой файловой группе. Если Вы планируете продолжать использовать те же самые файловые группы, в данном случае FG1, то тогда Вы должны будете решить, как управлять дисковым пространством и требованиями к архивации. Если у Вас достаточно места на диске, то Вы можете загрузить текущие данные (октябрь 2004) в FG1, не удаляя данных, которые будут заархивированы (октябрь 2002).
Однако если у вас недостаточно дискового пространства для того, чтобы хранить данные за текущий месяц и месяц, который подлежит архивации, тогда вам придется сначала "выключить" старую секцию.
Вероятно, что Вы уже проводили архивацию. Хорошая практика архивирования заключается в том, чтобы создавать резервную копию файловой группы сразу же после того, как новая секция будет загружена и "включена" (а не перед "выключением"). Причина в том, что если на RAID-массиве вдруг произойдет сбой, файловую группу можно будет восстановить (restore) вместо того, чтобы перестраивать/перегружать данные (rebuild/reload). В нашем конкретном случае, поскольку база данных буквально недавно была секционирована, вы, вероятно, уже выполнили полное резервное копирование (full backup) после того, как структура секционирования была стабилизирована (полное резервное копирование базы данных - это не единственное решение; существует большое число различного рода стратегий резервного копирования, которые могут быть осуществлены в SQL Server 2005, а также предложений большей степени детализации резервного копирования и восстановления). Поскольку большая часть данных никогда не изменяется, вы можете архивировать только отдельные файловые группы после того, как они будут загружены. Фактически, это должно стать частью вашей стратегии секционирования. За дополнительной информацией по данной теме обратитесь к разделу BOL: "File and Filegroup Backups" in Administering SQL Server.
Теперь, когда стратегия выбрана, Вам необходимо разобраться в деталях процесса и синтаксиса. Возможно что-то вам покажется сложным. Тем не менее, полный цикл процесса будет идентичным для каждого месяца. Все что будет меняться, так это только даты. Используя динамический SQL, Вы можете легко автоматизировать весь процесс. Вот основные шаги:

  • Управление "включаемой" каскадной таблицей

  • Управление второй каскадной таблицей ("выключаемой")

  • Исключение старых данных из секционированной таблицы и добавление новых

  • Удаление каскадных таблиц

  • Резервное копирование файловой группы

Рассмотрим каждый из шагов более детально. Дополнительно каждый шаг содержит примечания, помогающие автоматизировать процесс с помощью динамического SQL.

[В начало]

Управление "включаемой" каскадной таблицей

  1. Создайте каскадную таблицу - эта таблица является будущей скрытой секцией. Она должна иметь ограничение целостности для того, чтобы ограничивать свои данные только допустимыми для будущей секции таблицы значениями. Возможно, из соображений производительности вы захотите загрузить данные в неиндексированную кучу (heap) безо всяких ограничений целостности и затем только добавить ограничение целостности (см. шаг 3) WITH CHECK перед включением таблицы в секционированную таблицу.

    CREATE TABLE SalesDB.[dbo].[OrdersOctober2004] ( [OrderID] [int] NOT NULL, [EmployeeID] [int] NULL, [VendorID] [int] NULL, [TaxAmt] [money] NULL, [Freight] [money] NULL, [SubTotal] [money] NULL, [Status] [tinyint] NOT NULL, [RevisionNumber] [tinyint] NULL, [ModifiedDate] [datetime] NULL, [ShipMethodID] [tinyint] NULL, [ShipDate] [datetime] NOT NULL, [OrderDate] [datetime] NOT NULL, [TotalDue] [money] NULL ) ON [FG1] GO

    Автоматизация: эту таблицу будет легко создать, поскольку это всегда будет текущий или только что завершившийся месяц. Структура каскадной таблицы должна соответствовать структуре существующей таблицы, таким образом, основное изменение для каждого месяца будет касаться имени таблицы. Тем не менее, Вы можете использовать одно и то же имя для каскадной таблицы каждый месяц, поскольку она не должна существовать после того, как будет добавлена в секцию. Каскадная таблица все еще будет существовать после того, как вы загрузите данные в секционированную таблицу, но вы можете удалить ее, как только загрузка данных завершится. Кроме того, должен меняться диапазон дат. Поскольку Вы работаете с типом данных datetime, а у него существуют проблемы округления времени, Вы должны быть готовы программно определить нужное значение в миллисекундах. Самый простой способ вычислить верхнее граничное значение месяца - это взять месяц, с которым вы работаете, прибавить к нему 1 месяц, и затем отнять 2 или 3 миллисекунды. Вы не можете вычесть только 1 миллисекунду, поскольку 59.999 округлится до .000 - а это уже будет первым днем следующего месяца. Вы можете вычесть 2 или 3 миллисекунды, поскольку -2 миллисекунды округлят значение до .997, а -3 равняется .997; .997 - применимое значение, которое может быть сохранено. Следующий пример поможет вам получить корректное значение верхней границы вашего диапазона.

    DECLARE @Month nchar(2), @Year nchar(4), @StagingDateRange nchar(10) SELECT @Month = N'11', @Year = N'2004' SELECT @StagingDateRange = @Year + @Month + N'01' SELECT dateadd(ms, -2, @StagingDateRange)

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

    SELECT ps.name AS PSName, dds.destination_id AS PartitionNumber, fg.name AS FileGroupName FROM (((sys.tables AS t INNER JOIN sys.indexes AS i ON (t.object_id = i.object_id)) INNER JOIN sys.partition_schemes AS ps ON (i.data_space_id = ps.data_space_id)) INNER JOIN sys.destination_data_spaces AS dds ON (ps.data_space_id = dds.partition_scheme_id)) INNER JOIN sys.filegroups AS fg ON dds.data_space_id = fg.data_space_id WHERE (t.name = 'Orders') AND (i.index_id IN (0,1)) AND dds.destination_id = $partition.TwoYearDateRangePFN('20021001')

  2. агрузите в каскадную таблицу данные. Если файлы согласованы, то тогда этот процесс следует поручить оператору BULK INSERT.
    Автоматизация: этот процесс является самым сложным, для автоматизации. Вы должны будете удостовериться, что все файлы были загружены, кроме того, Вы можете захотеть загружать их параллельно. Для управления этим процессом Вы могли бы создать таблицу, которая сохраняла бы треки профайлера с информацией о том, какие файлы были загружены и где они располагаются. Вы могли бы создать job в SQL Agent, который проверял бы поступление файлов каждые несколько минут, забирал новые файлы, а затем выполнял бы множественные операторы bulk insert.

  3. Как только данные загрузятся, Вы сможете добавить ограничение целостности. Для того чтобы данные считались "доверительными", ограничение целостности должен быть добавлено с опцией WITH CHECK. Опция WITH CHECK задается по умолчанию, поэтому ее не обязательно специально указывать, самое главное - не указать WITH NOCHECK.

    ALTER TABLE SalesDB.[dbo].[OrdersOctober2004] WITH CHECK ADD CONSTRAINT OrdersRangeYearCK CHECK ([OrderDate] >= '20041001' AND [OrderDate] <= '20041031 23:59:59.997') GO

  4. Проиндексируйте каскадную таблицу - она должна иметь такой же кластерный индекс, как и таблица, в которую планируется добавить секцию.

    ALTER TABLE [OrdersOctober2004] ADD CONSTRAINT OrdersOctober2004PK PRIMARY KEY CLUSTERED (OrderDate, OrderID) ON [FG1] GO

    Автоматизация: это - не сложный этап. Используя название месяца и информацию о файловой группе, полученную на шаге 1, Вы можете создать этот кластерный индекс.

ПРОДОЛЖЕНИЕ СЛЕДУЕТ

[В начало]

Использование статистики оптимизатором запросов Microsoft SQL Server 2005 (продолжение)

По материалам статьи Eric N. Hanso: Statistics Used by the Query Optimizer in Microsoft SQL Server 2005

Резюме статистики по строке

SQL Server 2005 использует патентованную технологию оценки селективности для условий с LIKE. Он формирует резюме статистики по частотности распределения подстроки в символьных полях (резюме по строке). Это относится к полям следующих типов: text, ntext, char, varchar и nvarchar. Использование резюме по строке помогает SQL Server точно оценить селективность условий с LIKE, где образец поиска может иметь любое количество знаков подстановки и в любой их комбинации. Например, SQL Server может оценивать селективность предикатов следующей формы:

Column LIKE 'string%' Column LIKE '%string' Column LIKE '%string%' Column LIKE 'string' Column LIKE 'str_ing' Column LIKE 'str[abc]ing' Column LIKE '%abc%xy'

Если в образце LIKE используется указанный пользователем символ замены (то есть, образец поиска имеет форму LIKE образец ESCAPE escape_character), то только в этом случае SQL Server 2005 угадывает селективность.
Всё это является развитием возможностей, присутствовавших в SQL Server 2000, который использовал угадывание для селективности по всем знакам подстановки, кроме оконечного в строке знака подстановки %, используемого в образце поиска LIKE, что ограничивало точность оценок. Если в первой строке возвращаемого DBCC SHOW_STATISTICS результата поле String Index имеет значение YES, это означает, что объект статистики включает в себя резюме по строке. Само содержание резюме по строке не показывается. Резюме по строке включает в себя дополнительную информацию, которая отличается от той, которая составляет гистограмму.
Для строк превышающих 80 символов, из строки извлекаются первые и последние 40 символов, происходит их конкатенация, после чего результат используется для создания резюме по строке. Следовательно, точная оценка частотности для тех подстрок, которые находятся в игнорируемой части строки, не возможна.

[В начало]

Статистика по вычисляемым полям

SQL Server 2005 поддерживает создание, обновление и использование статистики по вычисляемым полям, даже в тех случаях, когда сам запрос не содержит имени вычисляемого поля, а содержит его выражение (формулу). SQL Server 2000 мог создавать, обновлять и использовать статистику по вычисляемым полям только в автоматическом режиме, и только если вычисляемое поле указывалось в запросе явно.
Вы сможете пронаблюдать автоматическое создание статистики в SQL Server 2005 для вычисляемого поля в таблице Sales.SalesOrderHeader.TotalDue базы данных AdventureWorks, если выполните представленный ниже Transact-SQL скрипт:

USE AdventureWorks GO -- Удаляем всю статистику для Sales.SalesOrderHeader DECLARE c CURSOR FOR SELECT name FROM sys.stats WHERE object_id = object_id('Sales.SalesOrderHeader') AND auto_created <> 0 AND user_created <> 0 DECLARE @name NVARCHAR(255) OPEN c FETCH next FROM c INTO @name WHILE @@FETCH_STATUS = 0 BEGIN EXEC ('drop statistics Sales.SalesOrderHeader.' + @name) FETCH NEXT FROM c INTO @name END CLOSE c DEALLOCATE c -- Исполняем запрос к Sales.SalesOrderHeader, включающий выражение, -- эквивалентное вычисляемому полю TotalDue: -- ((isnull(([SubTotal]+[TaxAmt])+[Freight],(0))). SELECT * FROM Sales.SalesOrderHeader h, Sales.SalesOrderDetail d WHERE h.SalesOrderID = d.SalesOrderID AND (isnull(([SubTotal]+[TaxAmt])+[Freight],(0))) > 200000.00 ORDER BY TotalDue DESC -- Смотрим созданную статистику. -- Заметьте, что статистика создаётся для поля TotalDue даже не смотря на то, -- что его имя явно не фигурирует в запросе. sp_helpstats 'Sales.SalesOrderHeader'

SQL Server 2005 не поддерживает статистику по не сохраняемым вычисляемым полям, которые используют выражения CLR (common language runtime), например, вызывающих в выражении определяемую пользователем CLR - функцию. Для того, что бы собирать статистику по использующему CLR вычисляемому полю, это поле должно быть отмечено, как: PERSISTED.

[В начало]

Статистика по полям, основанным на определяемых пользователем CLR - типах данных

SQL Server 2005 поддерживает создание, обновление и использование статистики по полям, основанным на определяемых пользователем CLR - типах, если такой пользовательский тип данных поддерживает бинарное упорядочивание, иначе, статистика поддерживаться не будет. Тип данных поддерживает бинарное упорядочивание, если у атрибута SqlUserDefinedType, который является частью спецификации определения типов данных, опция IsByteOrdered установлена в "true". Когда тип поддерживает бинарное упорядочивание, это означает, что стандартная бинарная сортировка упорядочивает данные в семантически правильном порядке для этого типа.

[В начало]

Статистика и индексированные представления

Обычно, статистика не требуется для индексированных представлений. Это происходит потому, что подстановка индексированных представлений в план исполнения запроса происходит только после того, как все статистические данные для используемых в запросе таблиц и индексов будут присоединены к плану запроса. Есть одно исключение: статистика будет использоваться в том случае, когда в предложениях FROM присутствует ссылка непосредственно на представление, и применяется подсказка оптимизатору NOEXPAND. Обратите внимание, что возникнет ошибка и план не будет создан, если NOEXPAND задан для представления, которое не имеет индекса.
Из-за ограниченности применения, статистика по индексированным представлениям не создаётся после исполнения sp_createstats и не обновляется с помощью sp_updatestats. Зато автоматическое обновление и создание статистики применимо и к индексированным представлениям. Но, как отмечалось выше, такая статистика может быть востребована оптимизатором и собрана только в случае использования в запросе хинта NOEXPAND, вкупе с включённой опцией автоматического обновления/создания статистики (ON). Кроме того, существует возможность ручного сбора статистики для полей индексированны представлений, для чего нужно использовать команды CREATE STATISTICS или UPDATE STATISTICS.

ПРОДОЛЖЕНИЕ СЛЕДУЕТ

[В начало]

Репликация через Интернет или между доменами без доверительных отношений

По материалам статьи Paul Ibison: SQL Server Replication Across Domains and the Internet
Перевод Ирины Наумовой

Репликация через Интернет или домены, не имеющие доверительных отношений, обычно выполняется с использованием Виртуальной Частной Сети (VPN), и, следовательно, при этом используется такая же конфигурация как в LAN. В данной статье не рассматривается случай, когда VPN недоступна.
Не смотря на то, что считается правильным не выставлять порты SQL Server в Интернет, гибкость подобных коммуникаций очевидна. Такие сети защищаются с помощью брандмауэров, которые выделяют для серверов демилитаризованную зону DMZ/ECZ, что может стать причиной серьёзных проблем в репликации. Эта статья представляет собой только практическое руководство, поскольку описание сложной схемы конфигурации сетей могли бы сделать статью слишком большой.
Дополнительные соображения, которые необходимо учесть при настройке репликации в сетях без доверительных отношений:

  • При настройке подписчика, издатель на первых этапах может быть не виден в Enterprise Manager, и поэтому не может быть добавлен обычным способом.

  • После того, как снимок был создан, к нему обычно обращается агент дистрибуции (Distribution Agent), используя общий сетевой ресурс repldata, который будет недоступен через Internet.

  • Агенты репликации, обычно работают в контексте учетной записи пользователя Windows, олицетворяя дистрибутора/издателя; однако при попытке доступа к файлам снимка на издателе, в AD (активный, общий каталог - директория организации, основная сущность организации доверительных отношений на платформе Windows) этот пользователь Windows найден не будет.

Из этого следует необходимость некоторых изменений в конфигурации, призванных решить эти проблемы.

[В начало]

Настройка сети

Для организации подключения SQL Server, на издателе должен быть открыт доступ к порту, с которым работает этот сервис. По умолчанию используется порт 1433, в то время как FTP - протокол обмена файлами по умолчанию использует порт 21. Кроме того, правила доступа на эти порты через брандмауэр с IP-адресов подписчика должны предусматривать наличие у подписчика фиксированного IP-адреса, и он не должен получать его от службы выделения адресов DHCP.
В SQL Server 2005, репликация слиянием может работать через порт 443 (протоколы SSL/HTTP) - более подробно об этом будет в другой статье - но для нашего случая, безопасность обеспечивается при помощи следующих средств: аутентификации, брандмауэра и шифрования, если последнее необходимо.

[В начало]

Настройка публикации

Распределённая на издателе для пользователей сети папка Repldata, которая обычно используется для хранения файлов моментальных снимков использующаяся при инициализации подписок, будет недоступна - поскольку для входа в систему издателя будет использоваться гостевая учетная запись Windows (Guest), что также считается небезопасным - поэтому необходим альтернативный метод инициализации.
Таким методом является использование FTP или альтернативного местонахождения файлов снимка на подписчике. Для последнего случая, когда pull-подписка уже создана, она может быть настроена на использование локальной папки для хранения файлов снимка. Я часто использую этот метод, поскольку мои файлы снимка достаточно большие (> 40GB) и, таким образом, я экономлю время, делая все это вручную.
В основном, вначале я создаю снимок, потом вручную сжимаю папку с помощью архиватора WinZip 9.0, затем передаю эти файлы подписчику по протоколу FTP, и потом уже распаковываю их локально. После этого, при инициализации, я использую альтернативное местоположение снимка (@alt_snapshot_folder) на подписчике. Такой метод я использую по той причине, что сжатие снимка стандартным образом в CAB файл ограничено размером до 2GB.

Однако, эта статья посвящена использованию встроенного, автоматического метода передачи снимка через FTP, который настраивается на издателе на вкладке Snapshot Location свойств публикации. Если все подписчики настраиваются схожим образом (домены без доверительных отношений и т.д.) тогда на этой вкладке можно выбрать только второй переключатель сверху, не создавая снимок в стандартном местоположении. Папка для создания снимка находится внутри папки FTPROOT, а также должен быть выбран переключатель 'Subscribers can access this folder using FTP'.
Если Вы хотите использовать сжатие снимков, файлы снимка будут распаковываться на подписчике в папке для временных файлов системы "Temp", и Вы должны предусмотреть, чтобы для этих целей имелось достаточно свободного дискового пространства. Для клиента, путь к снимку - это будет путь от корня FTP - каталога, в нашем примере это: \TRSnapshot\ftp. Параметры входа в систему на издателе могут быть оставлены такими, каковы они по умолчанию - анонимный доступ (что не рекомендуется) или может быть выбрана регистрация для прошедших проверку подлинности пользователей Windows, которые имеют доступ на чтение из каталога FTPROOT - в нашем примере это учетная запись PaulI.

[В начало]

Настройка псевдонимов на подписчике

Для того чтобы подписчик 'видел' издателя, перед регистрацией издателя в Enterprise Manager, для него с помощью Client Network Utility должен быть создан псевдоним. Это обязательное условие, поскольку использование IP-адреса в EM позже может привести к разного рода ошибкам. Старайтесь соблюдать следующие рекомендации:

  1. Используйте TCP/IP, а не именованные каналы, иначе можно получить ошибку "SQL server does not exist or access is denied."

  2. Создайте псевдоним с таким же именем, как на издателе/дистрибьюторе.



[В начало]

Редактирование файла hosts на подписчике

Запрос подписчика к FTP должен иметь возможность правильно привязывать NETBIOS имя издателя/дистрибьютора к его IP - адресу. Поскольку у нас сеть не имеет доверительных отношений, то имени сервера издателя/дистрибутора не будет в службе имён локальной сети (DNS), с которой взаимодействует подписчик. Поэтому мы должны вручную добавить сопоставление имени удалённого сервера издателя/дистрибьютора его IP-адресу, что можно сделать в файле hosts на сервере подписчика, который расположен в каталоге C:\WINNT\system32\drivers\etc. После внесенных изменений, текст этого файла должен содержать представленные ниже строки, где DOHXXX-SQL - это условное NETBIOS - имя издателя/дистрибьютора.

127.0.0.1 localhost 62.6.139.105 DOHXXX-SQL

Если этого не сделать, то при инициализации подписчика посредством FTP, вы получите следующее сообщение об ошибке: "Message: The process could not connect to FTP site 'DOHCOL-SQL' using port 21".

[В начало]

Создание pull - подписки

При использовании мастера создания pull - подписки, в окне "Choose Publication" можно увидеть список публикаций издателя. На этой стадии, издателя можно зарегистрировать в EM, либо он уже должен быть там зарегистрирован. Если на предыдущих шагах все было сделано правильно, список публикаций должен быть виден. В качестве учетной записи агента репликации должна быть выбрана учетная запись SQL Server (можно и по-другому, но давайте пока не будем рассматривать этот вариант), уже добавленная в лист доступа публикации (PAL). Если подписчик зарегистрирован на издателе, это будет именованная подписка, иначе - анонимная. При установке, в окне формы Snapshot Delivery следует выбрать опцию "Download using FTP".

Сайт автора в Интернет: www.replicationanswers.com.

[В начало]

ССЫЛКИ НА СТАТЬИ

Статьи на русском языке

Security Configuration Wizard из Windows 2003 SP1
Брайан Комар
Удобный способ защиты серверов на базе ролей:...

Применение IPsec для защиты сети
Стив Райли
Три методики повышения степени защиты узлов:...

Расширения языка Transact-SQL
Александр Каленик
MSSQLServer: С тех пор как представители Microsoft объявили об интеграции кода CLR в SQL Server 2005, разработчики проявляют большой интерес к тому, как это скажется на разработке базы данных. Возникло предположение, что Transact-SQL уйдет со сцены. Однако это не так. Он по-прежнему остается единственным средством извлечения данных и манипулирования ими. Конечно, можно писать хранимые процедуры на других языках, таких как C#, но, если необходимо извлекать или изменять данные, мы вынуждены использовать Transact-SQL...

Осваиваем командную строку
Шон Дьюби
Обзор утилит командной строки Windows 2003:...

Утилиты мониторинга портов TCPView и TCPVCon
Марк Русинович
Преодолеваем ограничения Netstat:...

Англоязычные статьи

Code and Reporting Services project from DM-BI Integration Webcast
DMTeam
Here are the projects and sample code from the July 7, 2005 MSDN Webcast (Incorporating Data Mining into the Integration, Analysis and Reporting Components of Business Intelligence (Level 300)).

MDX Questions and Answers
Yukon BI by the Hitachi Consulting Yukon Team
Q. When someone creates a subcube in an MDX statement, where does AS store the subcube internally. Is there something like the relational tempdb for AS?

SQL Server Monitoring in 8 Steps: Lessons From the Field
Geert Vanhove
SQL Server database systems are more than ever before being chosen as the preferred backend database solution for large business’s critical systems. And SQL Server richly deserves this status. As a result of this, more users than ever before are blocked in their daily activity when the database is not available, or in a bad shape. It’s your responsibility as a DBA to know the health of your SQL Server so you can take proactive action to minimize chances anything bad happens to your system. But don’t panic. If you have the right tools in place, your system will tell you how it feels and will warn you well before it reaches the alarm phase. Through its performance behavior, you can spot potential problems not yet visible to the end-user. If, for example, for no reason response times of a certain query slow down from 100 to 500 ms, the end-user will not be alarmed, but you should

SQL Server XML Statistics and Execution Plans
Joe Chang
One of SQL Server’s deficiencies when using XML queries is the lack of statistics capability in the XML driver. This is surprising because the ODBC API contains a function for providing statistics on remote data sources. SQL Server defaults to the fixed assumed row count values for remote servers, which is unreasonably high for XML in a transaction processing environment. A query to a remote SQL Server however, does pass back requested statistics data

Using SQL Server 7.0/2000 in a Hyper-Threaded Environment
Benjamin Jones
I've just read a good article which discusses using SQL Server in a hyper-threaded environment http://support.microsoft.com/kb/322385. To cut a long story short, we recommend that the maxdop (maximum degree of parallelism) setting should remain equal to the number of physical processors that are being used

SQL Server version control
Hilary Cotter
Like the weather, SQL developers and database administrators talk about version control, but most of them don't do anything about it. Version control means managing the versions of the objects created and deployed in their SQL Server environments. Typically, this involves developers and DBAs checking scripts including object creation scripts into Visual Source Safe (VSS), or a similar version control software, when they create them and then checking them out and back in again when they make modifications

SQL Server Service Broker Examples
managed data
Recently there has been questions on some of the newsgroups about examples for SQL Server Service Broker. So, yesterday on a flight back to England I crofted up three different SQL Server projects as examples

Pet Peeves: Cursors
Michael Coles
Why are so many T-SQL developers so darn dependent on cursors? I’m constantly amazed at how many people just can’t get away from cursor-based logic in their SQL. 99.999% of SQL problems encountered by the average programmer in his/her lifetime do not need cursors. And 99.999% of the cursor-based hacks people come up with are slower and more complex than their set-based counterparts

Calculating Easter
Michael Coles
I recently had to create a SQL table representing a Calendar with various holidays noted on it for work scheduling purposes. One of the first challenges was figuring out on which day Easter falls each year

Calculating Floating Holidays
Michael Coles
This is a follow-up to the calculating Easter entry I posted yesterday. In this one we calculate "floating holidays", such as Thanksgiving (U.S.) and Memorial Day. Once again we need to use the udf_modulo function we created in the last entry. This function calculates the "true modulus" as opposed to the "remainder of division" we get with T-SQL's MOD operator (%)

Roman's Weekly SQL Server Tip - How to protect tables from being deleted, Part 2
Roman Rehak
A few months ago I wrote a tip showing you how you can make sure that a table doesn't get dropped by accident. At the time it generated a lot of feedback and comments in other blogs. The solution involved creating a dummy view using the "WITH SCHEMABINDING" clause. That solution is workable but it is somewhat kludgy, even though you can automate it if you wish so..

Attack of the predatory sales force
Simon Galbraith
Low-cost software is almost always a better solution, but if you must purchase the high-cost stuff, don’t get caught with blood in the water

Third in a series on Visual Studio setup
Phil Wilson
This article explains how to install a new version of your setup project using the Windows Installer update mechanism

An interview with Shawn Wildermuth
Douglas Reilly
Shawn Wildermuth is the “go-to guy” for information on ADO.NET. He is the author of Pragmatic ADO.NET: Data Access for the Internet World and numerous articles, is a Microsoft MVP, and works as an independent consultant in Atlanta

Done and Out
Steve Jones
for a week. I'm leaving for vacation and leaving SQLServerCentral.com in the capable hands of Andy. He'll be sending out some canned editorials as he's pretty busy at work, may be some interesting articles coming our way soon, so if things don't appear, it's his fault :)

Reducing Round Trips
Andy Warren
One of the best ways to reduce the load on your server and increase application responsiveness is to reduce the number of "round trips" your application makes. This article by Andy Warren shows you a few ways to increase your performance by reducing round trips

New SQL Server 2005 Feature: newsequentialid()
The SQL Doctor is In
Okay, so this is a really cool new little feature. A lot of concern with using GUIDs a keys was that they were reasonably random, and they made indexes wildly fragment as they were created. So this little feature allow us to make sure that guids created for a given table are always increasing (so we have less fragmentation, though the indexes can get balanced heavily to one end)

What is mscorsvw.exe and why is it eating up my CPU? What is this new CLR Optimization Service?
David Notario
mscorsvw.exe is precompiling .NET assemblies in the background. Once it's done, it will go away. Typically, after you install the .NET Redist, it will be done with the high priority assemblies in 5 to 10 minutes and then will wait until your computer is idle to process the low priority assemblies. Once it does that it will shutdown and you won't see mscorsvw.exe. One important thing is that while you may see 100% CPU usage, the compilation happens in a process with low priority, so it tries not to steal the CPU for other stuff you are doing. Once everything is compiled, assemblies will now be able to share pages across different processes and warm start up will be typically much faster, so we're not throwing away your cycles

Handling Simple Transactions in SQL Server Integration Services 2005
Jamie Thomson
SQL Server 2005 no longer has DTS. Instead, the next evolution of ETL tools from Microsoft is Integration Services, with many enhancements and capabilities, far beyond what was available in SQL Server 2000 DTS. New author Jamie Thomson brings us a look at the transaction capabilities of SQLIS in Yukon

Loading variable values from a file...
Kirk Haselden
This is another question that comes up a lot. How do I load a file's contents into a variable. This is one case where the script task comes in very handy

SSIS: How to do Upserts
Ashvini Sharma
This one came up earlier today. How would one do Upsert in the pipeline?

SSIS: Getting a value out of a file to use it in our package
Jamie Thomson's Blog
Someone recently asked on a newsgroup how they could grab hold of a value from a given field in the last row of a file. For example, in the file depicted below we would like to grab the value "Posh".

Training in U.K. and Paging SQL Server Data
Randy Dyess
This week finds me in Sunny England. Two words you wouldn’t normally see together but England’s weather has been getting hotter the last few years and this week has been a little warm for the London area. I am actually in Maidenhead as the instructor for a SQL Server 2005 Infrastructure Class. The material is basically the same as the material for the Ascend training, a nice overview of SQL Server 2005 enhancements from the relational side

Security Class Design Proceeding and Suspect Pages
Randy Dyess
Still here in Redmond designing the new security class and while it is very tiring, I think it will be worth it in the long run. I have had a chance to look over a few of the other classes and they do look like something that I would want to attend. These classes are different and I believe that they will be well received by the DBA community

Quiz: SQL Server 2005 XML 'exist' method
John Gallardo's Weblog
Among the features introduced in SQL Server 2005 is the new XML Datatype. You can use this guy to store both untyped and typed XML information and maintain the infoset fidelity of the document. We support a subset of the XQuery language which can be used to retrieve values from XML instances and reshape documents, amongst other things. One particularly useful, although sometimes confusing, piece of functionality is the "exist" method. The semantics are that if the XQuery statement evaluates to a node, then it returns true, if it evaluates to the empty set, then it returns false

Answer: SQL Server 2005 'exist' method
John Gallardo's Weblog
Last week I threw out a quick quiz about the XML datatypes 'exist' method. The reason it was at the top of my mind was that it was a mistake that I had made only a couple of days before. Not only that, but even a couple of my peers didn't recognize the mistake when I showed it to them. We all knew the rule, however we all managed to look at the same piece of code (albeit a bit more complicated than what I presented) and never notice the problem

FIX: Concurrency enhancements for the tempdb database
Microsoft
During object creation, two (2) pages must be allocated from a mixed extent and assigned to the new object. One page is for the Index Allocation Map (IAM), and the second is for the first page for the object. SQL Server tracks mixed extents by using the Shared Global Allocation Map (SGAM) page. Each SGAM page tracks about 4 gigabytes of data

INF: File Allocation Extension in SQL Server 2000 (64-bit)
Microsoft
The SQL Server 2000 Enterprise Edition (64-bit) release supports a new server startup option, -E. With the -E startup option, an administrator can increase the number of extents allocated per file in the filegroup during each iteration of the round robin cycle used to distribute extents across files. This extension may increase the performance for data warehouse (DW) applications by providing better data contiguity, and allowing the read-ahead mechanism to reduce the number of I/Os processed during sequential scans executed for DW queries

SQL injection attacks
Invincible Poison
An article on SQL injection attacks.

Understanding Object Ownership
Kathi Kellenberger
In SQL Server 2005, object ownership will have a different meaning, but since most of us work with SQL Server 2000, Kathi Kellenberger has written a good introduction to understanding how object ownership works and why you might want to follow certain practices

MSSQL Server Reporting Services: Mastering OLAP Reporting: Percent of Total - Chart Presentation Nuances
William Pearson
In this article, we will extend our percent of total solution to its presentation within a chart, combining the concepts involved with a few mechanical procedures about which I receive recurring questions via e-mails and forum insertions. We will use a pie chart, as it offers more "surface area" with regard to optional displays, but the same concepts apply in most cases to other chart types. We will begin at the point of dataset construction in the chart, and so I would recommend first creating the supporting Analysis Services components for the exercise based upon our previous article, Mastering OLAP Reporting: Percent of Total - Two Perspectives

Sql Server 2005 Partitioning
Yukonism
A very interesting an powerful feature of Sql Server 2005 is called Partitioning. In a few word this means that you can horizontally partition the data in your table, thus deciding in which filegroup each rows must be placed

Are you still using @@IDENTITY?
Mat Stephen's SQL Server WebLog
Are you still using @@IDENTITY? It seems many people are. If you are, are you aware that it might not always return what you expect? No? then read on. @@IDENTITY will return the last IDENTITY column value inserted across any scope in the current session. This means that if a trigger, or similar, were to insert a row in another table (T2), other than the one you're interested in (T1), inside the same transaction and after you insert into T1, you will get the Identity value of T2 instead of T1

Before installing your OS, think about the x64 edition first
Larry Chesnut
A growing number of people I talk to are planning to purchase new hardware in preparation for the November 7th release of SQL Server 2005. While getting new hardware to run new software doesn’t sound like a bad idea to me, I am always amazed how so few people understand the need to also consider the possibility of upgrading their OS as well

List Extended Properties for all Tables and Columns
Julian-Kuiters
Extended Properties in SQL Server give you the ablility to attach a comment or description to an object in the database. When you use Management Studio to add a Description to a table or column, it is stored as an Extended Properties with the name of MS_Description, and the object it relates to

Reading Text Files Into Tables
Pseudo-Random SQL
A while back, someone asked me how to read a text file and store it in a table in SQL Server. Here's a short script that reads a text file into a Temp Table, then performs a SELECT to return all the rows in the table as a resultset that can be accessed from VB.NET or C#.NET via a SqlDataReader or a SqlDataAdapter/DataSet. Note that each line read in is numbered in the table so we can keep them in the correct order

Using newid() to insert records in parent-child tables
Andrew Novick
In my project I have two (parent-child) tables that are bound by a primary key (PK)/foreign key (FK) relation. To insert new records in my tables, I would like to use the newid() function (in the PK of the parent and FK of the child). While this would work fine with the parent, the child records seem to have no information about the unique ID given by SQL to the parent record

Optimize SQL Server hardware performance
Jeremy Kadlec
Tuning SQL Server for performance is in many ways like constructing a house. You must find a suitable location with rich soil, build a solid foundation to support two or three levels, install the electrical and plumbing, finish the walls for painting and decorating, and finally conduct ongoing maintenance

Automate New Logins Creation
Leo Peysakhovich
There are times when a new application or time period requires the creation of a number of logins for your clients. This can be a time consuming process, but Leo Peysakhovich brings us a way to make this go quickly

Cross-Tab reports in SQL Server 2005
Muthusamy Anantha Kumar
Microsoft introduces new operators PIVOT and UNPIVOT in SQL Server 2005. Traditionally we create queries using the CASE statement and aggregate function in order to produce cross-tab reports. This article illustrates the usage of the new operators, PIVOT and UNPIVOT

Code Pages Supported by Windows -- Windows
Microsoft
The list below provides links to graphical representations, and textual listings, of each of the Windows codepages

SSIS Package-Protection Levels
Kirk Haselden
SQL Server 2005 Integration Services (SSIS) provides six package-protection options that pull together the concepts of sensitive-data protection and encryption

[В начало]

ФОРУМ SQL.RU

Самые популярные темы недели

Ваше мнение об упражнениях SELECT на http://sql.ipps.ru
Префиксы типов таблиц(t_), хр. процедур(p_), функций(f_), вьюшек(v_)... Нафик они нужны?
Прошу голосовать за SQL.RU в конкурсе Интернить 2005
точка- на запятую
запрос для тренда типа "а вчера в это же время"
SP4 - делитесь опытом
Принадлежность диапазону символов.
Сложный расчет разницы двух нарастающих итогов (расчет просрочки по платежам)
запрос с переменным числом параметров
Запрос переполняет tempdb!!!
Как такое сделать.
Хитрая таблица...
Стоит ли заводить префикс для таблиц, обозначающий что таблица - справочник?
Помогите построить сложный SELECT
Подскажите с репликацией
Удаление записей из большой таблицы
Почему не возвращается количество столбцов временной таблицы?
Проблемы с размером tempdb.mdf
Блокировка записей
ошибка на триггере с курсором

[В начало]

Вопросы остались без ответа

переключение QA на русскую раскладку если резалтсет в руск.кодировке
Как узнать сколько осталось места на ленте стримера?
Report Services: глюк с кодировкой?
OLE DB Csession проблема
Экспорт в XLS, TXT

[В начало]

АНОНСЫ

Журнал "Алгоритм", третий номер

Выложена электронная версия третьего номера журнала "Алгоритм". Общий размер архива около 1МБ, формат архива - zip.

В номере:

  • Интервью с В.Брылёвым aka Glory

  • Ключевые слова в языке C#
    Автор: В.Чужа.
    В этом цикле статей мы попробуем разобраться с ключевыми словами языка C#, пройдя по ним прямо по алфавиту и разобрав несколько примеров к каждому ключевому слову. Также потом посмотрим, какие изменения были внесены при появлении C# 2.0. Думаю, что такой подход будет полезен новичкам, начинающим программировать на этом языке.

  • Реализация простого WinSock приложения с использованием .Net или пишем шпиона своими руками
    Автор: А. Лиман.
    Автор не имеет цели написать полноценное клиент-серверное приложение. Для этого у него просто нет всех необходимых знаний. Но, тем не менее, он надеется, что статья получилась интересной.

  • Visual Studio 2005 Beta 1 - первый взгляд на среду разработчика
    Автор: В.Чужа.
    В статье описываются первые впечатления от работы с инструментом разработки программного обеспечения Visual Studio 2005. Статья не претендует на полный и всеохватывающий обзор этой среды, а предназначена лишь для тех, кому не посчастливилось ещё её увидеть.

  • Что должен знать правильный .Net разработчик
    Автор: С.Хансельман, перевод Н.Зимина.

  • О чистоте наших рядов или миф о чистоте .Net
    Автор: С.Хансельман, перевод и комментарии В.Чужи.
    На самом деле пропаганда платформы .Net, которая, безусловно, является одной из красивейших и удобнейших платформ с точки зрения разработчика, достигла такого этапа, когда действительно, без разбора нужно это или не нужно, стараются переписать всё "под .Net". При этом часто не учитывается тот момент, что и старое приложение работает вполне неплохо. Приложение, написанное на старой, испытанной технологии, кажется "устаревшим". И это звучит как приговор.

Первый номер можно скачать здесь, второй номер можно скачать здесь

[В начало]


Вопросы, предложения, коментарии, замечания, критику и т.п. оставляйте Виталию Степаненко и Александру Гладченко в форуме: Обсуждение рассылки

СЕМИНАРЫ  КОНФЕРЕНЦИИ

МИНИФОРМА
ПОДПИСКИ



ПУБЛИКАЦИИ  АРХИВ


Subscribe.Ru
Поддержка подписчиков
Другие рассылки этой тематики
Другие рассылки этого автора
Подписан адрес:
Код этой рассылки: comp.soft.winsoft.sqlhelpyouself
Отписаться
Вспомнить пароль

В избранное