Минимальное протоколирование. Индексы.

by Alexey Knyazev 30. сентября 2012 00:23
Минимальное протоколирование — это протоколирование только информации, необходимой для восстановления транзакции без поддержки восстановления на момент времени.
Эта особенность может быть очень полезна, когда необходимо сократить время на выполнение некоторых операций. Сегодня я хочу поговорить о минимальном протоколировании некоторых DDL-операции с индексом.

Минимально протоколируются следующие операции с индексами:
  • Операции CREATE INDEX (включая индексированные представления)
  • Операции ALTER INDEX REBUILD или DBCC DBREINDEX
  • Перестроение новой кучи DROP INDEX (если применимо)
[Ещё]

Tags: , , , , ,

SQL Server

READPAST и эскалация блокировок

by Alexey Knyazev 5. июня 2012 02:45
Сегодня я хочу поговорить о табличной подсказке READPAST, которая появилась впервые в SQL Server 2005. Эта подсказка указывает, что компонент Database Engine не считывает строки и страницы, заблокированные другими транзакциями. Если указан аргумент READPAST, то блокировки уровня строк будут пропускаться. Компонент Database Engine будет пропускать строки вместо блокировки текущей транзакции до тех пор, пока блокировки не будут сняты.

Например, предположим, что в таблице T1 есть один целочисленный столбец со значениями 1, 2, 3, 4, 5. Если транзакция A изменит значение 3 на 8, но еще не будет зафиксирована, то инструкция SELECT * FROM T1 (READPAST) возвратит значения 1, 2, 4, 5. Параметр READPAST главным образом используется для устранения конфликта блокировок при реализации рабочей очереди, использующей таблицу SQL Server. Средство чтения очереди, использующее аргумент READPAST, пропускает прошлые записи очереди, заблокированные другими транзакциями, до следующей доступной записи очереди, не дожидаясь, пока другие транзакции снимут свои блокировки.

Аргумент READPAST можно задать для любой таблицы, к которой обращается инструкция UPDATE или DELETE, и к любой таблице, на которую ссылается предложение FROM. Если аргумент READPAST задан в инструкции UPDATE, он применяется только при считывании данных для идентификации подлежащих обновлению записей вне зависимости от того, где он указан в инструкции. Аргумент READPAST для таблиц из предложения INTO инструкции INSERT задать нельзя. Операции чтения, в которых используется аргумент READPAST, не блокируются. Операции обновления или удаления, использующие аргумент READPAST, могут блокироваться либо при считывании внешних ключей или индексированных представлений, либо при изменении вторичных индексов.

Аргумент READPAST можно указывать только в транзакциях, выполняемых на уровнях изоляции READ COMMITTED или REPEATABLE READ. При указании подсказки READPAST в транзакциях, выполняемых с уровнем изоляции SNAPSHOT, она должна использоваться в сочетании с другими табличными подсказками, требующими блокировки, например UPDLOCK или HOLDLOCK.

Табличная подсказка READPAST не может быть указана, если параметр базы данных READ_COMMITTED_SNAPSHOT установлен в ON и выполняется одно из следующих условий.
  • Уровень изоляции транзакций сеанса имеет значение READ COMMITTED.
  • В запросе также указана табличная подсказка READCOMMITTED.
Чтобы в этих случаях указать подсказку READPAST, удалите табличную подсказку READCOMMITTED (если существует) и включите в запрос табличную подсказку READCOMMITTEDLOCK.


Всё, что написано выше является выдержкой из BOL, при этом хотелось бы особо подчеркнуть фразу, которую я выделил жирным:
Операции чтения, в которых используется аргумент READPAST, не блокируются.

Но так ли всё на самом деле? Или возможны исключения? Об этом чуть ниже.

[Ещё]

Tags: , , , ,

SQL Server

SET QUOTED_IDENTIFIER

by Alexey Knyazev 31. мая 2012 21:11
Сегодня я хотел бы поговорить о настройках SQL Server, инструкциях SET. При этом не обо всех инструкциях, а только о SET QUOTED_IDENTIFIER, т.к. эта инструкция таит в себе очень много интересных особенностей, о которых многие даже не догадываются.

Если вы считаете, что эта настройка только "Заставляет SQL Server следовать правилам ISO относительно разделения кавычками идентификаторов и строк-литералов. Идентификаторы, заключенные в двойные кавычки, могут быть либо зарезервированными ключевыми словами Transact-SQL, либо могут содержать символы, которые обычно запрещены правилами синтаксиса для идентификаторов Transact-SQL" , то эта статья для вас, ибо я развею ваши мифы о том, что эта инструкция такая безобидная.

[Ещё]

Tags:

SQL Server

24 Hours of PASS. Russian Edition. Undocumented SQL Server.

by Alexey Knyazev 16. апреля 2012 23:25


12 апреля 2012 состоялась первая беспрецедентная нон-стоп конференция 24 Hours of PASS. Russian Edition.

В рамках этого мероприятия я рассказывал про недокументированные возможности SQL Server. И, как и обещал, выкладываю свою презентацию и скрипты к ней.

24HoursofPASS_a.knyazev.pdf (368,31 kb)

24PASS_DEMO.zip (7,29 kb)


Другие доклады: [Ещё]

Tags: ,

SQL Server

Колоночные индексы, особенности использования

by Alexey Knyazev 27. марта 2012 20:30

01 марта 2012 года в рамках очередной встречи МСР-клуба г. Екатеринбург (http://www.ekbit.pro/), я читал доклад по теме "SQL Server 2012. Columnstore Indexes" - Columnstore-Index.pptx (2,11 mb).
Прошло совсем немного времени, но я уже получил несколько вопросов по теме моего доклада. Колоночные индексы - одна из ключевых новинок SQL Server 2012, но на данный момент документации в сети не так много, тем более на русском языке, поэтому я решил собрать все ключевые особенности, связанные с использование колоночных индексов (по мотивам http://social.technet.microsoft.com/wiki/contents/articles/3540.sql-server-columnstore-index-faq.aspx).
Кроме того, новая версия SQL Server 2012 уже доступна для скачивания по подпискам MSDN и TechNet. Редакции Microsoft® SQL Server® 2012 Express и Microsoft® SQL Server® 2012 Evaluation доступны всем.

Официальный выход запланированный на 01 апреля 2012.



[Ещё]

Tags: ,

SQL Server

История SQL Server от версии 1.0 до 11.0

by Alexey Knyazev 2. марта 2012 02:23

Tags: ,

SQL Server

ONLINE добавление нового столбца с DEFAULT в SQL Server 2012

by Alexey Knyazev 22. февраля 2012 00:55
В текущих версиях SQL Server ( SQL Server 2008R2 и ниже ) операция добавления нового столбца NOT NULL с DEFAULT-значением может занять значительное время, если таблица имеет большой размер. Для небольших таблиц эта операция допустима, но, когда объём данных в таблице велик, то мы получаем блокировку Sch-M для таблицы на длительное время, т.к. при этой операции происходит построчное заполнение нового столбца значением по умолчанию.

В SQL Server 2012 ситуация кардинально изменилась, теперь при добавлении в таблицу нового NOT NULL столбца с DEFAULT-значением мы не производим физического изменения данных построчно, а лишь изменяем таблицу на уровне метаданных, поэтому операция практически мгновенна.

[Ещё]

Tags: ,

SQL Server

Секционирование и влияние RANGE RIGHT/LEFT на разбиение и слияние

by Alexey Knyazev 14. февраля 2012 22:20
Секционирование делает большие таблицы и индексы более управляемыми, так как позволяет быстро и эффективно получать доступ к поднаборам данных и управлять ими, при этом сохраняя целостность всей коллекции. При использовании секционирования такие операции, как загрузка данных из системы OLTP в систему OLAP, занимают всего несколько секунд вместо минут и часов, затрачивавшихся на это в предыдущих версиях SQL Server. Операции обслуживания, выполняемые на поднаборах данных, также выполняются значительно эффективнее, так как нацелены только на те данные, которые действительно необходимы, а не на всю таблицу.
В SQL Server все таблицы и индексы в базе данных считаются секционированными, даже если они состоят всего лишь из одной секции. Фактически, секции представляют собой базовую организационную единицу в физической архитектуре таблиц и индексов. Это означает, что логическая и физическая архитектура таблиц и индексов, включающая несколько секций, полностью отражает архитектуру таблиц и индексов, состоящих из одной секции. Дополнительные сведения см. на MSDN.
При создании секционированной функции, мы указываем, к какой области интервала значений принадлежит аргумент boundary_value [ ,...n ] (к левой или правой). Сегодня я расcкажу, как выбор RANGE [ LEFT | RIGHT ] влияет на операции SPLIT/MERGE RANGE.
[Ещё]

Tags: , , , ,

SQL Server

Параметризованная процедура и гарантированный план запроса

by Alexey Knyazev 30. января 2012 00:07
- Процедура стала работать медленнее, чем обычно?
- Запрос выполняется быстро, а процедура, в которой подобный запрос, работает очень долго?
- У процедуры неоптимальный план запроса?

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

Тема не нова, но если вы это читаете, то моё время потрачено не зря.

[Ещё]

Tags: , , , , ,

SQL Server

Грязное чтение и несогласованные данные

by Alexey Knyazev 14. января 2012 23:48
В одной из предыдущих заметок в своём блоге я писал о ряде сюрпризов, к которым нужно быть готовым при использовании "грязного чтения" (уровень изоляции READ UNCOMMITTED) - http://www.t-sql.ru/post/nolock.aspx.

А именно:
  • "Фантомные" записи, которых нет в БД
  • Чтение не всех записей из таблицы
  • Чтение одной и той же записи несколько раз
Сегодня я покажу ещё один неприятный момент - это чтение промежуточного состояния изменяемой строки, т.е. при изменении записи в одной атомарной операции:
update MyTable 
set a = b
  , b = a
В другой транзакции с уровнем изоляции READ UNCOMMITTED можно прочитать запись, когда значение поля a уже равно b, а поле b ещё не изменено.
[Ещё]

Tags: , , , ,

SQL Server