SQL.RU
 client/server technologies
 Главная | Документация | Статьи | Книги | Форум | Блоги | Опросы | Гостевая | Рассылка | Работа | Поиск | FAQ |
   
#353<<  #354  >>#355

СОДЕРЖАНИЕ

1.СТАТЬИ
1.1.Технологии Push и Pull при работе с linked servers в Microsoft SQL Server
2.ССЫЛКИ НА СТАТЬИ
2.1.Статьи на русском языке
2.2.Англоязычные статьи
3.ФОРУМ SQL.RU
3.1.Самые популярные темы недели
3.2.Вопросы остались без ответа
 

 

СТАТЬИ

Технологии Push и Pull при работе с linked servers в Microsoft SQL Server

Автор: Михаил Смирнов

Для обеспечения взаимодействия нескольких серверов Microsoft SQL Server наиболее часто используется технология linked-серверов. При этом, типичной является задача обмена данными между linked-серверами. В данной статье я проведу краткий сравнительный анализ технологий push и pull для решения задачи передачи новых данных.

Провести такой анализ проще всего на примере. Пусть у нас есть два сервера – сервер-источник (SourceServer) и целевой сервер (DestServer). В качестве примера рассмотрим задачу, когда нам необходимо передать таблицу Customers c сервера-источника на целевой сервер.

Технология Push

Технология Push характеризуется “заталкиванием” данных с исходного сервера на целевой сервер. Т.е. SQL-запрос для передачи таблицы Customers будет выполняться на исходном сервере и выглядеть так:

insert into DestServer.Northwind.dbo.Customers select * from Customers

Для того, чтобы понять, как такой запрос будет обработан SQL Server’ом, необходимо воспользоваться SQL Server Profiler.
На исходном сервере запрос выполняется в неизменном виде –

insert into DestServer.Northwind.dbo.Customers select top * from Customers go

Однако, на целевом сервере все совсем не так. На нем выполняются следующие запросы -

set implicit_transactions on go declare @P1 int set @P1=1 declare @P2 bigint set @P2=8400823175122854 exec sp_getschemalock @P1 output, @P2 output, N'"Northwind"."dbo"."Customers"' select @P1, @P2 go declare @P1 int set @P1=180150000 declare @P2 int set @P2=2 declare @P3 int set @P3=4 declare @P4 int set @P4=-1 exec sp_cursoropen @P1 output, N'select * from "Northwind"."dbo"."Customers"', @P2 output, @P3 output, @P4 output select @P1, @P2, @P3, @P4 go exec sp_cursor 180150000, 4, 0, N'Northwind.dbo.Customers', @CustomerID = N'ALFKI', @CompanyName = N'Alfreds Futterkiste', @ContactName = N'Maria Anders', @ContactTitle = N'Sales Representative', @Address = N'Obere Str. 57', @City = N'Berlin', @Region = NULL, @PostalCode = N'12209', @Country = N'Germany', @Phone = N'030-0074321', @Fax = N'030-0076545' go exec sp_cursor 180150000, 4, 0, N'Northwind.dbo.Customers', @CustomerID = N'ANATR', @CompanyName = N'Ana Trujillo Emparedados y helados', @ContactName = N'Ana Trujillo', @ContactTitle = N'Owner', @Address = N'Avda. de la Constitucion 2222', @City = N'Mexico D.F.', @Region = NULL, @PostalCode = N'05021', @Country = N'Mexico', @Phone = N'(5) 555-4729', @Fax = N'(5) 555-3745' go exec sp_cursor 180150000, 4, 0, N'Northwind.dbo.Customers', @CustomerID = N'ANTON', @CompanyName = N'Antonio Moreno Taqueria', @ContactName = N'Antonio Moreno', @ContactTitle = N'Owner', @Address = N'Mataderos 2312', @City = N'Mexico D.F.', @Region = NULL, @PostalCode = N'05023', @Country = N'Mexico', @Phone = N'(5) 555-3932', @Fax = NULL go exec sp_cursorclose 180150000 go IF @@TRANCOUNT > 0 COMMIT TRAN Go set implicit_transactions off go

Видно, что при вставке на удаленный сервер, SQL Server выполняет следующие операции:

  • Открывает распределенную транзакцию, включая режим неявных транзакций.

  • Открывает курсор и вставляет записи последовательно одну за другой, а не все сразу, как в случае обычной вставки, без использования linked-серверов.

Последовательную вставку каждой записи также можно заметить, если на целевом сервере создать триггер на INSERT – триггер будет срабатывать столько раз, сколько записей существует во вставляемом наборе.
Для примера – следующий триггер на таблице Customers:

CREATE TRIGGER dbo.I_Customers ON dbo.Customers AFTER INSERT AS BEGIN declare @InsertedCount int, @TotalRows int select @InsertedCount = count (*) from inserted select @TotalRows = count (*) from Customers insert into CallsCount (InsertedCount, TotalRows) values (@InsertedCount, @TotalRows) END

В этом триггере CallsCount - это вспомогательная таблица, которая поможет подсчитать сколько раз триггер был запущен. Она содержит два поля – InsertedCount – кол-во записей в таблице inserted и TotalRows – общее кол-во записей в таблице Customers на момент срабатывания триггера.
После выполнения предыдущего запроса на вставку выборка из таблицы CallsCount дает следующий результат:

InstertedCount

TotalRows

1

1

1

2

1

3

Здесь видно, что триггер был вызван 3 раза. При этом каждый раз в таблице inserted была одна запись, а кол-во записей в таблице Customers увеличивалось постепенно. Это еще раз доказывает то, что записи вставляются последовательно, одна за одной.

Можно провести интересный эксперимент, изменив триггер следующим образом:

ALTER TRIGGER dbo.I_Customers ON dbo.Customers AFTER INSERT AS BEGIN declare @InsertedCount int, @TotalRows int select @InsertedCount = count (*) from inserted select @TotalRows = count (*) from Customers insert into CallsCount (InsertedCount, TotalRows) values (@InsertedCount, @TotalRows) if @TotalRows = 3 rollback tran END

Т.е. таким образом можно как бы попытаться откатить вставку третьей строки. Однако, после запуска запроса на вставку, при наличии такого триггера, обе таблицы – Customers и CallsCount будут пустыми – в них не будет не только третьей записи, но и вообще ни одной.
Причина этого видна в перехваченной последовательности запросов - SQL Server объявляет распределенную транзакцию. Вызывая rollback tran в триггере мы откатываем не только данный триггер, но и всю транзакцию вставки. Это, вообще говоря, логично, так как при этом работа триггера выглядит так же как и при вставке не из удаленного сервера, с той лишь разницей, что вызывается он несколько раз. Именно для обработки таких ситуаций SQL Server и объявляет распределенную транзакцию. Побочным эффектом такой транзакции является длительная блокировка таблицы Customers на целевом сервере на все время вставки.
Все эти эффекты не имеют важного значения, если между серверами передаются небольшие объемы данных. Однако, последовательная вставка курсором большого кол-ва записей может занимать довольно длительное время, добавляя ко всему прочему блокировку таблиц на все это время. В качестве примера можно попробовать передать большой справочник, состоящий примерно из 130 000 строк.

insert into DestServer.Northwind.dbo.Dictionary select * from Dictionary

На тестовом сервере это привело к 130 000 запросам на вставку и заняло примерно 370 секунд. В дальнейшем это значение будет сопоставлено с результатами работы технологии Pull.

Технология Pull

При использовании технологии pull запрос на вставку данных выполняется на целевом сервере. При этом происходит «втягивание» данных от сервера-источника.
Такой запрос, выполняющийся на целевом сервере, выглядит так:

insert into Customers select * from SourceServer.Northwind.dbo.Customers

Если воспользоваться SQL Server Profiler, то на целевом сервере он будет выполняться в неизменном виде -

insert into Customers select * from SourceServer.Northwind.dbo.Customers go

На сервере-источнике при этом будет выполнен следующий запрос -

set implicit_transactions on go declare @P1 int set @P1=1 declare @P2 bigint set @P2=8381016049028902 exec sp_getschemalock @P1 output, @P2 output, N'"Northwind"."dbo"."Customers"' select @P1, @P2 go declare @P1 int set @P1=2 exec sp_prepexec @P1 output, NULL, N'SELECT Col1028,Col1027,Col1026,Col1025,Col1024, Col1023,Col1022,Col1021,Col1020,Col1019,Col1018 FROM (SELECT Tbl1001."CustomerID" Col1018, Tbl1001."CompanyName" Col1019, Tbl1001."ContactName" Col1020, Tbl1001."ContactTitle" Col1021, Tbl1001."Address" Col1022, Tbl1001."City" Col1023, Tbl1001."Region" Col1024, Tbl1001."PostalCode" Col1025, Tbl1001."Country" Col1026, Tbl1001."Phone" Col1027, Tbl1001."Fax" Col1028 FROM "Northwind"."dbo"."Customers" Tbl1001) Qry1029' select @P1 go exec sp_unprepare 2 go exec sp_releaseschemalock 1 go IF @@TRANCOUNT > 0 ROLLBACK TRAN Go set implicit_transactions off go

Здесь видно, что при такой технологии курсор не используется. Вместо этого применяется пакетная вставка записей – всех за один раз. Это же доказывает нам и использование триггера. После выполнения запроса таблица CallsCount содержит всего одну запись -

InstertedCount

TotalRows

3

3

Из этого также видно, что в запрос выполнялся всего один раз, в таблице insterted было 3 записи и в саму таблицу Customers также было вставлено 3 записи.

insert into Dictionary select * from SourceServer.Northwind.dbo.Dictionary

Если попытаться замерить время, которое сервер тратит на вставку записей таким образом на примере большого справочника из 130 000 строк, то следующий запрос на том же сервере выполняется 30 секунд, что в 12 раз быстрее, чем при использовании технологии Push.

Сравнительные данные

В следующей таблице приведены сравнительные данные этих двух технологий

 

Push

Pull

Запрос

Выполняется на сервере-источнике.
Пример:

insert into DestServer.Northwind.dbo.Customers
select * from Customers
 

Выполняется на сервере-приемнике.
Пример:

insert into Customers
select * from SourceServer.Northwind.dbo.Customers

Вставка

Курсором, по одной записи.

Пакетно. Все записи за один запрос.

Триггер

Срабатывает для каждой вставляемой записи.

Срабатывает один раз для всех вставляемых записей.

Скорость

Низкая, так как записи вставляются одна за одной.

Высокая (в десятки раз быстрее), так как все записи вставляются за один запрос.

Заключение

Из всего вышесказанного следует, что технология pull обеспечивает более высокую производительность, чем технология push и является более предпочтительной.

Я с радостью рассмотрю любые комментарии и вопросы по данной тематике.

Мои координаты доступны на сайте www.msmirnov.ru

Михаил Смирнов
Руководитель проектов.

[В начало]

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

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

Два поколения Visual Studio разрабатываются одновременно
InfoWorld
К концу этого года в Microsoft собираются выпустить Orcas, крупное обновление платформы разработки ПО Visual Studio, а уже год спустя - еще одну версию, имеющую кодовое имя Rosario. По словам специалистов корпорации, основное внимание в Rosario будет уделено функциям управления жизненным циклом приложений, реализуемым наборами клиентских компонентов Team System и серверных Team Foundation Server. В числе совершенствуемых и разрабатываемых - инструменты тестирования и обеспечения качества, а также развитые средства анализа кода. Rosario разрабатывается уже сейчас, параллельно с Orcas. Важной особенностью Rosario станет возможность вовлечения ИТ-персонала и бизнес-аналитиков в процесс разработки приложений. CTP-версия Rosario выйдет примерно в одно время с финальной Orcas. В последней появились такие новшества, как технология Language Integrated Query (LINQ), облегчающая программисту доступ к данным, и поддержка рефакторинга кода в Visual Basic. Team Foundation Server в Orcas позволит снабжать код аннотациями и оставлять внутри кода комментарии с автоматическим указанием их авторства. Microsoft также объявила о приобретении турецкой компании devBiz Business Solutions, разработчика Web-интерфейса для Team Foundation Server, получившего название TeamPlain Web Access for Team System. Web-клиент для TeamServer будет предлагаться на сайтах TeamPlain и MSDN пользователям Team Foundation Server бесплатно, а со временем он войдет в состав набора приложений Power Tools, расширяющих возможности Team Foundation Server. В Microsoft напоминают, что в этом году среда разработки Visual Studio отмечает свое десятилетие.

RAID 0 против WD Raptor: кто быстрее?
Дмитрий Чеканов
У энтузиастов есть неписаное правило: жёсткий диск Western Digital WD1500 Raptor является идеальной моделью для настольных ПК, если вам нужна максимальная производительность. Но этому пути могут последовать далеко не все пользователи, поскольку тратить $240 на жёсткий диск ёмкостью всего 150 Гбайт - решение не очень привлекательное. Остаётся ли Raptor лучшим выбором? Цена не менялась уже многие месяцы, причём за такие деньги можно легко купить пару 400-Гбайт накопителей. Не настало ли время сравнить производительность современных RAID массивов с Raptor?

Рефакторинг баз данных: эволюционное проектирование
Скотт В. Эмблер, Прамодкумар Дж. Садаладж
В настоящей книге приведены рекомендации, касающиеся того, как использовать методы рефакторинга для усовершенствования баз данных. Она посвящена описанию процедур проектирования базы данных с точки зрения архитектора объектно-ориентированного программного обеспечения, поэтому представляет интерес и для разработчиков прикладного кода, и для специалистов в области реляционных баз данных. В книгу включены многочисленные советы и рекомендации по улучшению качества проектирования базы данных. Значительное место уделено описанию того, как действовать в тех практических ситуациях, когда база данных уже существует, но плохо спроектирована, или когда реализация первоначального проекта базы данных не позволила получить качественную модель. Прежде всего книгу можно использовать в качестве технического руководства для разработчиков, непосредственно занятых на производстве. С другой стороны, она представляет собой теоретическую работу, стимулирующую дальнейшие исследования в направлении объединения объектно- ориентированного и реляционного подходов.

SQL Server 2005 Service Pack 2 - оценка НЕУД! Очередная заплата
Александр Гладченко
Чехарда с фиксами SP2 продолжается, не успели мы накатить на сервера один из вариантов SP2, как вышел огромный пакет заплат (build 3152), для которого тоже пришлось искать технологические окна в загрузке серверов (это особенно "весело" с учётом выхода Windows Server 2003 Service Pack 2). Вы будете смеяться, но это ещё не всё… Позавчера появилась на свет ещё одна заплата, которая тоже весит с добрую сотню мегабайт (к радости провайдеров), и которая тоже объявлена критичной. Вот ссылки на соответствующие статьи Базы Знаний и Центра Загрузки:

SQL Server 2005: вебкасты и обучение
Александр Гладченко
По материалам информационного бюллетеня Microsoft для компаний-разработчиков в России. SQL Server 2005 предоставляет разработчикам значительное количество инструментов, упрощающих и ускоряющих процесс создания решения на его основе. На портале по SQL Server 2005 для загрузки и просмотра доступнен ряд обучающих вебкастов по XML-технологиям, интеграции с Visual Studio 2005, .NET Framework. Важно отметить, что на этом ресурсе представлены такие материалы, как серия учебников для начинающих разработчиков в 10 частях, написанная известным экспертом SQL Server, посвятившей множество статей и докладов темам масштабируемости и надежности баз данных - Kimberly L. Tripp.

Неограниченные виртуальные лицензии SQL Server 2005 SP2
Брайан Моран
Компания Microsoft запустила в производство пакет обновления SQL Server 2005 SP2. Надеюсь, читатели уже подготовили стратегию развертывания, познакомившись с содержимым предварительного технического обзора SP2 Community Technology Preview (CTP). Если этого не сделано, то пора приступить к решению этой задаче, чтобы заранее подготовиться к вопросам, которые могут задать начальник, пользователи и разработчики. Полный загружаемый модуль и набор сопутствующей документации можно получить по адресу http://www.microsoft.com/technet/prodtechnol/sql/2005/downloads/servicepacks/sp2.mspx.

Уменьшение размера базы данных tempdb в SQL Server
Microsoft
В данной статье приведены три способа, которые можно использовать для уменьшения размера базы данных tempdb до значения, которое будет меньше последнего заданного размера. Первый способ предоставляет полный контроль над размером файлов базы данных tempdb, но требует перезапуска сервера SQL Server. Второй способ позволяет уменьшить размер базы данных tempdb в целом с некоторыми ограничениями, которые могут потребовать перезапуска сервера SQL Server. Третий способ позволяет уменьшить размер отдельных файлов базы данных tempdb. Последние два способа требуют, чтобы в процессе операции уменьшения размера с базой данных tempdb не производилось никаких действий.

Перемещение баз данных между компьютерами с SQL Server
Microsoft
В данной статье приведены пошаговые инструкции по перемещению пользовательских баз данных Microsoft SQL Server и наиболее распространенных компонентов SQL Server между компьютерами с SQL Server.

Отслеживание блокировок в SQL Server 2005 и SQL Server 2000
Microsoft
Данная статья представляет собой вариант следующей статьи по Microsoft SQL Server 7.0, обновленный с учетом особенностей Microsoft SQL Server 2000 и более поздних версий SQL Server: 251004http://support.microsoft.com/kb/251004/ Отслеживание блокировок в SQL Server 7.0 (Эта ссылка может указывать на содержимое полностью или частично на английском языке)

Удаление повторяющихся строк из таблицы в SQL Server
Microsoft
Таблицы Microsoft SQL Server никогда не должны содержать повторяющихся строк и неуникальных первичных ключей. Ради краткости в этой статье первичные ключи иногда называются просто ключами. Повторяющиеся ключи нарушают целостность объектов и должны быть запрещены в реляционной системе. SQL Server содержит ряд механизмов, обеспечивающих целостность объектов, включая индексы, ограничения UNIQUE, ограничения PRIMARY KEY и триггеры.

Динамическая нумерация строк в запросе SELECT языка Transact-SQL
Microsoft
В данной статье рассказывается о том, как динамически ранжировать строки при выполнении запроса SELECT с помощью гибкого способа, который отличается более высоким быстродействием в сравнении с процедурным решением и может оказаться единственным возможным способом выполнения данной задачи. Нумерацию и ранжирование строк обычно выполняют с помощью процедур. Эти решения обычно основаны на использовании циклов и временных таблиц, то есть циклов и курсоров SQL Server. Предлагаемая в данной статье методика основана на автообъединении, при этом обычно выбирается отношение "больше, чем" и определяется, сколько раз каждый элемент конкретного множества данных удовлетворяет отношению "больше, чем" при сравнении множества с самим собой.

Инструкция. Начало работы с Microsoft JDBC
Microsoft
В этой статье описывается процесс подключения к серверу SQL Server 2000 с помощью драйвера Microsoft SQL Server 2000 для JDBC.

Вышло несколько новых версий дополнительных компонент SQL Server 2005
Александр Гладченко
29 марта 2007г. стал доступен для скачивания пакет Microsoft Report Viewer Redistributable 2005 SP1, предназначенный для встраивания технологии отчётов в пользовательские приложения. Скачать: ReportViewer.exe

Слово о бедном LINQ-е 2...
Иван Бодягин
Ну, приступим, собственно, к описантю функционала. Начнем, пожалуй, с конца, уж простите за банальность, так будет проще рассказывать об остальном... =)

Собственный поиск на search.live.com/macros
Александр Гладченко
Недавно появилась пробная версия настраиваемого макросами поиска, который очень удобно использовать для поиска информации на тематических ресурсах. Фактически же, Вы может создать собственную поисковую систему, ориентированную на Ваши нужды и потребности! Зачем это надо? Объясню - дело в том, что поисковые системы ищут везде, даже там, где искомой информации может не быть по определению. С другой стороны, часто приходиться искать не имея чётких критериев поиска, что выливается в огромные, многостраничные списки найденных в интернете страниц, подавляющее большинство из которых просто "мусор". Зная же потенциальные источники интересующей Вас информации, можно ограничить поиск только этими ресурсами, что сделает результирующую выборку намного чище.

Новая жизнь недокументированной команды DBCC DBTABLE
Александр Гладченко
Давно уже, ещё с версии 6.5, была замечена эта команда. Назначение её в том, что она выводит ряд групп системных метаданных, относящихся к указанному параметром имени или идентификатору базы данных. Например, в листинге (который включается специальным флагом трассировки) Вам могут встретиться такие абривеатуры: DBT (DB Table) и FCB (File Control Block).

[В начало]

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

Merge Internals: How to Determine Pending Merge Changes
replicationanswers.com
I had intended to write some merge articles for some time now which help to explain a little more about what goes on behind the scenes. So, this is the first in two or three articles just for merge geeks like myself :)

Heads-up on another Merge Replication Bug in SQL Server 2005 involving Dummy Updates
Discovered by Patrick Molijn and investigated by Frank Schaafsma
This is another quick article provided by Patrick Molijn who has discovered another worrying bug in SQL Server 2005: In order to synchronise two merge replicated databases(non-convergence) we use the sp_mergedummyupdate stored procedure. It appears that this sp is missing an essential check!

Cost Threshold for Parallelism Option
SQL-Server-Performance.com
Using parallelism to execute a SQL Server query has its costs. This is because it takes additional overhead to run a query in parallel than to run it serially. But if the benefits of running a query using parallelism is higher than the costs, then using parallelism is a good thing. In most cases this is true, but not in all cases.

OR Queries in MDX
Chris Webb
I'm always happy to hear from readers of this blog (you can find my contact details at http://www.crossjoin.co.uk/contact.html) and happy to take requests for subjects to blog about. For example I got an email from Joseph Boschert the other week asking if I could post something about OR queries in MDX and since this is a subject that comes up on a fairly regular basis and can be quite confusing I agreed.

ORM Part 2 - ORM Basics
Dejan Sarka
In our natural, speaking language, we use statements of fact or, in logic, propositions about entities of interest, asserted to be true. The idea behind Object Role Modeling (ORM) is that you simply write down all the facts. The tool then converts those facts to a conceptual ORM diagram and produces logical and physical diagrams out of that ORM diagram. ORM pictures the world in terms of objects that play roles. Data elements are not combined into tables a priori. Descriptions of data-element relationships serve as input to a table-building algorithm. ORM thereby incorporates normalization the methodology.

SSIS - Using a Script Component as a Source
Phil Brammer
Just a quick tutorial on using a script component as a source… Follow the link for screenshots.

T-SQL: A T-SQL Poser - Part 3
Jamie Thomson
A couple of weeks ago I posed a T-SQL problem here and later some possible solutions here. You should probably read those posts before you read this. In a nutshell I wanted to concatenate values from multiple rows into a comma-delimited list. In the second post a I promised a performance comparison of the two main solutions that were put forward and that's what this post is for.

Check Constraints: Like George Costanza, Sometimes you need to do the Opposite!
Jeff Smith
It's been a while, so let's open up the old mailbag! Jeremy writes: Can you spare a few minutes to show me a possible way to restrict a column in a table using a check constraint to only allow characters in a given range of the ASCII table? I'm interested in filtering ASCII (numbers 0-31 decimal). Thanks!

Database Mirroring (Part 1) - Performance Base Line and Network stuff
Tony Rogerson
Database mirroring is a really cool technology introduced in SQL Server 2005 to simplify log shipping and give greater availability and data redundancy at the database level, in this article I talk about the various modes of operation, how it works, discuss statements (INSERT, UPDATE, DELETE, CREATE INDEX, ALTER INDEX REORGANIZE which replaces DBCC INDEXDEFRAG etc...) and there effect on logging. I also look at in depth at how performance of your online system can be significantly impacted by latencies in network performance and how to overcome or reduce some of these problems.

CASE function in SQL Server - part II
Muthusamy Anantha Kumar
Part I of this series illustrated how to use simple case functions in queries. In Part II of the series, I am going to discuss how to use case functions in different types of scenarios.

Copy-only backups: Another useful tool in SQL Server 2005
Greg Robidoux
A new feature added to SQL Server 2005 is the ability to create copy-only backups. The advantage to this type of backup is that it doesn't interfere with your regular scheduled backup sequences, if you need to create another backup file outside of your regular backup processing.

Automate your Database Maintenance using SMO
Allen White
The most important thing you can do as a database administrator is perform regular database maintenance. This includes regular backups, database integrity checks and optimizations. In SQL Server 2000, Microsoft provided a way to create maintenance plans, which used xp_sqlmaint, to perform all these tasks. In SQL Server 2005, maintenance plans are defined using Integration Services packages, which generate Transact-SQL statements to perform similar tasks. If you only have a few servers it's fairly easy to walk through the dialogs to set up your maintenance plans and SQL Server Agent will perform the maintenance based on the schedule you've defined.

A Common Architecture for Loading Data
Mark Balasundram
Importing data files is always a challenge for a DBA, especially when the files might vary in format. Having one codebase is important and new author Mark Balasundram brings us the template for a high performance application to do just that.

SQL Server 2005 Security Best Practices - Operational and Administrative Tasks
Bob Beauchemin
Security is a crucial part of any mission-critical application. This paper describes best practices for setting up and maintaining security in SQL Server 2005.

Sales Order Workshop Part IV
Jacob Sebastian
In the fourth installment of this series, Jacob Sebastian moves on to SQL Server 2005 and the new XML capabilities that make working with XML data easier than ever.

How did Random I/Os Outperform Sequential I/Os?
Linchi Shea
Recently, when I was doing some I/O performance tests on an I/O path, I found that 8K random reads (and writes) significantly and consistently outperformed 8K sequential reads (and writes) in terms of I/O throughput (megabytes per second). I was puzzled.

Delivering on SQL Server
Stefan Delmarco
Having been at the sharp end of many successful SQL Server solutions, I believe there are some fundamental principles that all successful SQL Server installations have in common. Whilst the challenges in delivering an enterprise-scale database-intensive application can be wide and varied, there are a few basic practises that will give you the best possible chance of success.

Article: SQL Server 2000 Partitioned Views
Stefan Delmarco
Partitioned views are a feature in SQL Server 2000 that allows an additional level of abstraction to be introduced between the orthogonal view of the data and its storage in an underlying table. In this article we explore what a partitioned view is, how it is created and accessed and, most importantly, what advantages it brings to the table.

Article: VARCHAR(MAX)
Stefan Delmarco
VARCHAR(MAX), NVARCHAR(MAX) and VARBINARY(MAX) are the SQL Server 2005 replacements for TEXT, NTEXT and IMAGE large. Not only are the replacements far better named than their SQL Server 2000 counterparts, they are also far easier to use. However, before we start rejoicing in their virtues, a word of caution. Just because you can now assign a 2GB string to a local variable doesn't mean you should! The ease with which large-value data types can be accessed and manipulated means that we have a greater need to treat the data responsibly and be aware that we could be handling a large amount of data in a local variable. It is now more important to be aware that you could be moving mountains of data in some very innocent looking TSQL. We must make sure we don't use these powerful capabilities inappropriately. "With great power comes great responsibility" - Spiderman!

SQL Server 2000 Hash Indexes
Stefan Delmarco
Hash indexes bring together a number of SQL Server 2000 features to deliver a technique to allow the indexing of wide columns.

Introducing Common Table Expressions (CTEs)
Stefan Delmarco
The concept of CTEs has been around in SQL Server for a long time. Anyone who's used derived tables before will immediately recognise and understand CTEs. Think of CTEs as formalised sub-queries or temporary views that can be defined and referenced in a single TSQL statement.

The APPLY Operator
Stefan Delmarco
UDFs are less well-known than stored procedures (SPs) and are often overlooked by inexperienced SQL developers. BOL has a good write-up on how to choose between SPs and UDFs. For the context of this article, a brief overview of UDFs:

The PIVOT Operator
Stefan Delmarco
SQL Server 2005 introduces the PIVOT operator to the TSQL stable. The intention of this operator is to make it easier to transform unique values in rows into columns and aggregate the resulting data. Anyone familiar with Excel pivot tables or Access cross-tab queries will immediately be able to visualise what pivot tables look like. Prior to SQL Server 2005, the only way to transform data, in the manner provided by PIVOT, was to use a number of SELECT...CASE statements. As we'll see, the PIVOT operator has not given us functionality that was not possible before. However, it has made pivoting data much easier to perform and far more readable.

The UNPIVOT Operator
Stefan Delmarco
Completing the discussion on the PIVOT operator is its antonym, the UNPIVOT. However, I would argue that the UNPIVOT operator has been misnamed by Microsoft as it creates the mistaken impression that PIVOT -> UNPIVOT -> PIVOT gets you back to where you started. From BOL:

TABLESAMPLE Clause
Stefan Delmarco
When I first same across TABLESAMPLE I had visions of some advanced index hints that allowed fine grained control over table statistics (distribution, ranges, density, etc.). Unfortunately not. As per Occam's Razor the simplest explanation is the correct one. It just... returns a sample from the specified table...?

Covariant Generic List
Stefan Delmarco
He introduction of generics in .NET 2.0 has opened up a whole new approach to class design in C#. The first, and most obvious, benefit generics provide is strongly typed containers. We no longer have to keep casting, boxing / unboxing, to / from object for ArrayList items anymore. However, with the power of generics come a few limitations. This article explores some subtle restrictions in covariance with generics.

When a String Is Not a String
Stefan Delmarco
This article was inspired by a seemingly innocent bit of code that caused a performance problem in a very unexpected way. It is the kind of code that you'd find in many samples. Unfortunately, it has a potential flaw that is only exposed when large data volumes are present.

The NEWSEQUENTIALID Function
Stefan Delmarco
The NEWSEQUENTIALID system function is an addition to SQL Server 2005. It seeks to bring together, what used to be, conflicting requirements in SQL Server 2000; namely identity-level insert performance and globally unique values.

SQL Provisioning Tool (SQL Server 2005 SP2)
Andy Leonard
At the end of the SQL Server 2005 SP2 installation you may be prompted to launch the SQL Provisioning Tool. This utility makes members of the local administrators group SQL Server sysadmins - which is cool, especially if your instance security is Windows Authentication only.

Damaged Indexes in SQL Server
Glenn Berry
If you ever see a message like this in the Windows Event log or in the SQL Server log: "Could not find the index entry for RID 'xxxxxxx' in index page 1:10098766, index ID 5, database 'ngdatabasename'"

SQL Server 2005 ranking functions - ROW_NUMBER()
Martin Poon
ROW_NUMBER() is a new function that is added to the SQL Server 2005 T-SQL syntax. ROW_NUMBER() is used to assign ranks to the result of a query. The basic syntax is

SQL Server 2005 ranking functions - RANK(), DENSE_RANK(), NTILE()
Martin Poon
RANK(), DENSE_RANK() and NTILE() are newly added functions in SQL Server 2005 T-SQL syntax. Another ranking function is ROW_NUMBER() that I have blogged earlier.

List of logins with creation dates
Martin Poon
If you have installed the *client tools* of SQL Server 2005, you can use SQL Server Management Studio to connect to your SQL Server, open the security node, and right click to apply filter settings for showing the logins. There exists a filter criterion for login creation date.

How to alert on system errors
Simon Sabin
Alerts in SQL server rely on the error being logged to the event log. Not all system messages are logged which means you can't alert on them. In SQL 2000 you could hack the sysmessages table, however in SQL2005 you can't.

Working with Transactions in ADO.NET
Joydip Kanjilal
A transaction is a group of operations combined into a logical unit of work that is either guaranteed to be executed as a whole or rolled back. Transactions help the database in satisfying all the ACID (Atomic, Consistent, Isolated, and Durable). Transaction processing is an indispensible part of ADO.NET. It guarantees that a block of statements will either be executed in its entirety or rolled back,( i.e., none of the statements will be executed). Transaction processing has improved a lot in ADO.NET 2.0. This article discusses how we can work with transactions in both ADO.NET 1.1 and 2.0 versions.

SQL Server 2005 - Index optimization best practices
sqlmaster
In SQL Server 2000 for index defragmentation DBCC DBREINDEX and DBCC INDEXDEFRAG statements are used, as you are aware defragmentation on table does not yield performance gains in every case. Every scenario is different. Similarly, determining when you should run the defragmentation statements requires analysis. Run DBCC SHOWCONTIG to determine index fragmentation and the decision of whether to use DBCC DBREINDEX or DBCC INDEXDEFRAG is based on your availability needs and the hardware environment. Few times Updating statistics is useful but it will be a side effect of DBCC DBREINDEX, which is not the case with DBCC INDEXDEFRAG. You can increase the effectiveness of DBCC INDEXDEFRAG by running UPDATE STATISTICS. Refer to this KBA to troubleshoot any slow performance on the application and defragment best practices white paper.

Build Your Skills: Test SQL Server 2000 clustering in VMware
Steven Warren
SQL Server 2000 is a robust and complicated product, especially when you are using it in a clustered setup. Properly deploying and managing it requires a reliable testing environment, but that can be costly. An economical alternative is to build a clustered SQL 2000 testing environment using VMware.

SQL Server 2005 - concurrency & locking with ASP.NET applications
Sqlmaster
One of my Developer asked how to handle the concurrency and locking on one application where ASP.NET is used, by default the SQL Server 2005 behavior that allows Pessimistic & Optimistic locking for concurrency.

Upgrading Your MCDBA
Brian Moran
It's been ages since I last talked about Microsoft certification programs, but a recent email message from the MCDBA program reminding me of the upgrade path available to me got my creative juices flowing. I thought that if I've been too busy to worry about upgrading my certification to SQL Server 2005, it's likely that many other SQL Server 2000 MCDBA professionals have also been too busy. So this week, we'll briefly explore the new certifications for SQL Server 2005 and some of the upgrade options that exist if you're currently a SQL Server 2000 MCDBA. But first, let's examine the value of Microsoft certification in general. I'm somewhat laissez-faire on the topic. I've run across "certified professionals" who I'd barely trust to swap out the power cord on a server, whereas some of the most talented IT pros I've met couldn't care less about certification. So debating the relative value of Microsoft certification is something I decided to stop worrying about several years ago. But I typically recommend that you get it. I sense that certification tends to be most beneficial to novice and intermediary professionals because some companies are hesitant to hire junior or mid-level people who don't have a certification. So an MCDBA can certainly help land a mid-level job. . . .

The Search For Microsoft Researcher Jim Gray
Charles Babcock
It's not unheard of for recreational sailors to go missing off the California coast. The U.S. Coast Guard searches for them, executing precisely aligned grid patterns around their last known location. After that, if they're not found, they're considered gone.

Retrieving Information from Active Directory with SSIS
John Welch
I was recently asked to help someone retrieve information from Active Directory for use in SSIS. My initial thought was "This shouldn't be too difficult. I know there is an OLE DB driver for Active Directory, so it should just be a matter of hooking up a few components." As it turns out, it took a few hours of painful trial and error to get something working. Also, at the end of it all, I found a different approach that was as simple as I had originally envisioned it. Hopefully, this will save some time for the next person needing to do this.

Dynamic substrings based on control table
Phil Brammer
Last night a user posted to the SSIS Forum a situation where he needed to be able to dynamically substring one field based on the substring rules contained in a table. So I put together a package that does just this. Before we go there though, I just want to mention that there are many ways, progmatically of course, to tackle this problem. The example below strictly follows my interpretations of Bill's challenge. There is a better way by using the split() function, but never-the-less here's the example using substring().

Recommendations for using SQL Server 2005 as the metadirectory data store for MIIS 2003 SP2 and for ILM 2007
Microsoft
This article describes the recommendations for using Microsoft SQL Server 2005 as the metadirectory data store for Microsoft Identity Integration Server (MIIS) 2003 Service Pack 2 (SP2) and for Microsoft Identity Lifecycle Manager (ILM) 2007.

EVENT NOTIFICATIONS: Monitoring blocked processes (and other events) - end to end how to set it up and make it work
Tony Rogerson
Prior to SQL Server 2005 we had to do a lot of monitoring to see what processes are blocking and what they are executing, this was always a pain. In SQL Server 2005 they introduced a technology called 'Event Notifications', numerous events fire within the SQL Server engine - these are all traceable or can be captured and plonked on a Service Broker queue. Don't be put off by this new technology, once you work out what to do and get the plumbing sorted its amazingly easy. The BLOCKED_PROCESS_REPORT event can be enabled (sp_configure), this event fires when a process is blocked for more than a configurable amount of time. Once fired the event data contains the input buffers of the waiter and the blocker - note, the chain can contain lots of spid's, the event only ever contains just two connections, for example if the head of the blocker chain is spid 90 and you have 3 blocked connections, spid 95 is waiting on spid 93 and spid 93 is waiting on spid 90 then you will get 2 reports - one containing spids 95 and 93 and one containing spids 93 and 90, like all everything else if we do the work we can get the complete chain.

Sync Services: How to partition data for your offline clients?
Rafik Robeal
Offline clients are not born equal; one client would like to sync a lot of server data while another client might just wish for its small share of rows that pertains to the task at hand. Sync services framework recognizes the need for data partitioning and so in this post I'll try to give some details on how to do that. Let's start by identifying two type of partitioning: vertical and horizontal.

Microsoft SQL 2005 Maintenance Wizard Part 3
Don Schlichting
This article focuses on the SQL Server 2005 Maintenance Plan Wizard for creating Database Backup operations. The Maintenance Plan Wizard is a graphical interface for creating a variety of database housekeeping tasks. In addition to Backup operations, maintenance items such as reorganizing data and index files, updating statistics and performing consistency checks can be performed. These tasks should be done on a regular basis to insure SQL performance and data integrity are optimized. All of these tasks can be executed using TSQL commands, however the Maintenance Plan Wizard makes selecting these tasks and their options easy. In addition, the Wizard will assemble all of your selected tasks into a reusable and customizable package.

Coalesce is not the answer to string concatentation in T-SQL
Rob Farley
I've seen many posts over the years about using the COALESCE function to get string concatenation working in T-SQL. This is one of the examples here (borrowed from Readifarian Marc Ridey).

Endpoint: What is it?
Sqlmaster
This was the question raised by a newbie DBA at my workplace! Endpoint in generic network terms they are the objects that represent a communication point between the server and client. In SQL Server as per the Authentication mode (Windows only & mixed) the endpoints are automatically created depending upon the network protocol that are enabled. In general the Named-pipes and TCP/IP that accepts the Tabular Data Stream packet which is a default communication format for Microsoft data access components.

Tracing Deadlocks
Shiv Kumar
New Author! Deadlocks aren't the most common problem but they happen they can really degrade performance. Shiv works through how to nail down what is causing the deadlock.

Quality Control with SQL Server
Steve Jones
What's going on with SQL Server? Quite a few problems with patches reported lately. Steve Jones comments on what he sees happening.

Dynamic management function query to view disk I/O pressure
Louis Davidson
The sys.dm_io_virtual_file_stats dynamic management function returns I/O statistics for data and log files [MDF and LDF file], with two parameters, one for database_id and another for the file_id. This function will help you to identify I/O file level.

Using Service Broker to Communicate With Other Database Servers
Dinesh Asanka
In this article, we are going to discuss the Service Broker, another new feature in SQL Server 2005. In simple terms, Service Broker is a distributed messaging framework, or MSMQ (Microsoft Message Queue), in SQL Server 2005. Using this new feature, you will be able to add reliable, scalable, asynchronous functionality to your database applications.

SQL Server 2005 Analysis Services Operations Guide
Elizabeth Vitt
This white paper describes how application developers can apply performance-tuning techniques to their Microsoft SQL Server 2005 Analysis Services Online Analytical Processing (OLAP) solutions.

Microsoft adds new hotfix option for SQL Server users
Mary Jo Foley
Microsoft is adding a new hotfix option for its SQL Server customers similar to the one it began phasing in for Exchange Server users earlier this year.

Microbenchmarking
Ashit
Microbenchmarking is the art of testing your machine's basic configuration like disk latency, memory latency, CPU performance using series of tests. You can find more details at: Types of benchmarks How do you assess the performance of a new machine with SQL Server? Do you run industry standard benchmarks like TPCC and TPCH? If you cannot run those yourself then what are the tests that you run. What are some of the tests that can can assess metrics like disk IO performance, CPU speed or memory speed? You could use simple TSQL batches to access some of the metrics without running your workload. Below are some of the simple tests.

Making Fast Load really fast on clustered indexed tables with SSIS
Alberto Ferrari
I have been so used to use int identity fields as primary key for any table and to believe it's the fastest way to define a clustered primary key that I never thought this can cause serious performance problems to SSIS. Until I tested it and discovered that int identity primary keys are among the slowest way to insert huge amount of data with SSIS. In the post I'll describe the technique that - from my tests - is the fastest way to insert data into tables with clustered index using SSIS.

SSIS lookup transform gotcha
Kristian Wedberg
We recently used the lookup transform to retrieve foreign keys in a data warehouse project, and were plain lucky to notice the following issue:

Database Snapshots and SSIS
Kristian Wedberg
Did you think SQL Server 2005 database snapshots were really cool, but wondered how useful they were in practice? Building a Data Warehouse, here's an ideal use for them:

SSIS and "Cursor Operation Conflict"
Kristian Wedberg
Watch out for this feature, not a bug thingy: In a Data Flow Task, my OLE DB Destination started to fail intermittently for no appearent reason. The error message was "Cursor Operation Conflict". Some head scratching later I discovered that the SQL Server 2005 database instance had had it's "no count" connection option changed to ON (the default after installation is OFF.) It seems that ADO expects getting back row counts, and gets confused when they're missing. Here's the culprit:

SSIS RetainSameConnection bug and SP2
Kristian Wedberg
We have an AS400 source system and can only use ODBC connections to access it. We also need to set RetainSameConnection to true since we're initializing the AS400 connection with a number of temporary aliases that will be used by later Data Flows and Execute SQL Tasks.

How to Check Whether the Final Query Plan is Optimized for Star Join Queries?
Queryproc
The star join optimization technique is an index based optimization designed for data warehousing scenarios to make optimal use of non-clustered indexes on the huge fact tables. The general idea is to use the non-clustered indexes on the fact table to limit the number of rows scanned from it. More details of index based star join optimization can be found at http://blogs.msdn.com/bi_systems/pages/164502.aspx.

Impersonation isn't dangerous
David LeBlanc
I was called to task because in Writing Secure Code for Windows Vista, I asserted that from the standpoint of a service, the impersonation privilege isn't dangerous. SeImpersonate is one of the newer privileges in Windows, and has only been put there since Windows 2003 (and is in XP SP2). Basically, the attack it is trying to prevent is one where you can get a higher-level process to connect to some resource you have, impersonate them, and escalate privilege. This can happen in a number of ways:

Don't Impersonate If You Don't Have To
David LeBlanc
Previously, I claimed that impersonation wasn't dangerous - to the impersonator - this is NOT true for the one being impersonated if it's a high level account - it's actually a fairly hazardous thing to be doing, since a lot of people make mistakes doing it, and either forget to check for failure and do things anyway, or forget to drop impersonation when they're done. The thing is that if you _don't_ impersonate, you'll create opportunities for luring attacks - oh, joy.

Automating SQL Express Backups
Brian Knight
SQL Express allows you to distribute a free edition of SQL Server with your applications. There are an enormous amount of 3rd party applications that use it and MSDE (it's SQL Server 2000 equivalent) for their data repository such as Sharepoint (by default). Generally speaking, the user may not even know they have the software on their workstation since it doesn't install anything on their Programs menu. The main weakness in SQL Express is that it doesn't have a scheduling tool. In this set of scripts, you'll receive a canned solution for automating backups of SQL Express. The same logic can be applied to MSDE by changing SQLCMD to OSQL in the batch file. No other syntax used is SQL Server 2005 specific.

Administration and Optimization: SQL Server Profiler for Analysis Services Queries
William Pearson
One of the tools that help us to see some of the "action behind the scenes" of Analysis Server is familiar to those of us who have worked with the Database Engine / RDBMS side of MSSQL Server. SQL Server Profiler, a graphical tool that allows system administrators to monitor events within an instance of Microsoft SQL Server, can assist us in monitoring events within Analysis Services, as well. Moreover, the Profiler can aid us in using the captured information to determine the effectiveness with which our local Analysis Services installation is utilizing resources, and to investigate the conditions that result in suboptimal performance. Using SQL Server Profiler to perform monitoring of this nature is a great way to examine query performance from both the SQL and MDX perspectives, both of which come into play within the combined processing and querying cycles through which an Analysis Services cube moves.

SQL Server Books Online: A Primer for New Users
Satya Jayanty
This article is for new users of SQL Server. I have been using SQL Server since 1997. In that time, I have seen the many changes that have occurred since the initial release of SQL Server version 4.2. Each new release is a thrill for every enthusiastic individual who works with Microsoft tools day-to-day. The release of SQL Server 2005 and Visual Studio 2005 is no exception. It includes a wide variety of useful tools for database administrators and developers.

Update Statistics <> Auto UPDATE STATISTICS option
Sqlmaster
On SSP forums I have looked at the question about Update Statistics and AUTO UPDATE STATISTICS option available on a SQL server database;

The DBA's Checklist for installation
Sqlmaster
The DBA checklist over here is a good one for the newbie DBAs and even experienced ones too, as sometime they forget the smaller things to check that might has impact on the issue.

Keyword Searching in SQL Server
Michael Ahmadi
Have you ever wanted to ensure that keywords in your data are easily searchable? Have you struggled with full-text search? New author Michael Ahmadi brings us an interesting idea for a keyword tracking and searching subsystem based on T-SQL and triggers.

Take an Exam, get TechNet
Steve Jones
It was mentioned recently in a guest editorial, and it bears repeating: TechNet Plus is a great subscription for testing your own software.

Using Views to Enforce Business Rules
David Moloney
A view is most commonly thought of as a SELECT statement. Most developers will simply create a view to "group" complex SELECT statements for reuse within another view or stored procedures. It makes typing easier! But the really power of views is their ability to implement business rules.

Cut development time with SQL Server 2005's synonyms
Tim Chapman
A synonym is a new object to SQL Server 2005. It is a way to give an alias to an already existing object. For example, if you have a table named SalesHistoryFromArchiveFiscalBusinessYear2005, you could create a synonym named Sales05 that points to that object. This means that instead of writing this query:

Bit by bit, 64-bit processors catching on
Jennifer Mears
At Fortis Health, servers powered by 64-bit Intel processors are used to run business analytics on - a capability the health insurer says will help keep it one step ahead of the competition. But Roger Jones, senior vice president and CIO at the Milwaukee firm, isn't looking at Itanium through rose-colored glasses.

Data type in audit record
Joe Celko
SQL Apprentice Question: I want my application to audit any data changes (update, insert, delete) made by the users. Rather than have an audit table mirroring each user table, I'd prefer to have a generic structure which can log anything. This is what I've come up with:

Newbie: a query to get back the closest number to user input number
Joe Celko
SQL Apprentice Question: have a situation where I need to return the name and salary of an employee closest to the salary entered by the user.

SQL Server 2005 Build List
Steve Jones
Steve Jones has compiled a list of the builds for SQL Server 2005 along with the hot fixes and Service Packs to which they apply

How to run a DLL-based COM object outside the SQL Server process
Microsoft
Microsoft SQL Server 6.5 or later provides the capability to load and run custom Component Object Model (COM) objects through a set of OLE Automation stored procedures or through extended stored procedures. By default, DLL-based COM objects are loaded as in process server, which means that the COM objects are not only loaded within the SQL Server process memory address space, but they also have full access to this memory address space. Therefore, a COM object loaded in the SQL Server process space must adhere to the same rules as any DLL file. There is a potential that a COM object could overwrite memory within the SQL Server process or leak resources, causing instability.

[В начало]

ФОРУМ SQL.RU

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

Microsoft SQL Server. Полезные алгоритмы от SQL.RU (+CD)
Производительность GUID
MS SQL Express ограничен для базы данных 4ГГБ ??
Проблема оптимизатора запросов MS SQL Server 2005
Оптимизация запросов с оператором like в условии
Создание критично-устойчивого сервера MS SQL Server 2005
Выгрузка в DBF
timeout при выполнении UPDATE одной записи в небольшой таблице небольшой базы данных
и снова deadlock :-(
Буферизация вставки данных
Помогите оптимизировать запрос.
способы написания SQL запросов
Последовательное выполнение хранимой процедуры
Сложный where
Производительность сервера SQL2000
Передёргивание Web Service из хранимой процедуры?
помогите с выборкой
Экспорт данных в SQL 2005 CE
Хранимая процедура: Потеря столбцов в результирующем наборе данных
Данные из 10 таблиц в XML

[В начало]

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

Связывание полей в Transform Data Task в ActiveX script
SQL Server Database Applications Profile Survey
Совместить две базы.
Подскажите тулзу для Smart Rename
SSIS http
SSIS и SP2
Перенесение проекта из SSMS в боевые базы?
Косяк с OPENROWSET
Пару вопросов по получению структуры бд
По логам ничего не пойму :(
SSIS: валится Source Script Component
репликация между SQL Server 2005 Enterprice Edition и SQL Mobile
книги о Notification Services, Reporting Services в SQL2K5?
VLDB Maintenance Practices and Problems?
Express 2005 и контекстное меню в SSMS
Mirrorong. Заставить Witness выполнять дополнительные действия при Failover
2005: как изменить значение @identityrangemanagementoption?
Delivering replicated transactions
Ключ -1 в SQl Analyzer
список таблиц - в каких они файлгрупах
В QA не отображаются параметры хранимок и функций
Extended proc и x64
Скорость при экспорте в dbf
Перенос диаграммы с SQL2000 на SQL2005
DTC под XP и SQL EXPRESS 2005 будет работать?
Как такое может быть?(SSIS package в Job'e)

[В начало]

#353<<  #354  >>#355
Rambler's Top100 Рейтинг@Mail.ru  Administrator: Обратная связь 
Copyright: SQL.Ru 2000-2013