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

СОДЕРЖАНИЕ

1.СЕМИНАРЫ
1.1.Data Mining & Особенности реализации учетных задач
1.2.Лекции для разработчиков Microsoft .NET
2.СОВЕТЫ
2.1.Блокировки SQL Server 7.0/2000 - теория и практика устранения проблем (продолжение)
2.2.За и против использования команды SELECT, представлений и хранимых процедур в SQL Server (окончание)
3.ССЫЛКИ НА СТАТЬИ
3.1.Статьи на русском языке
3.2.Англоязычные статьи
4.ФОРУМ SQL.RU
4.1.Самые популярные темы недели
4.2.Вопросы остались без ответа

СЕМИНАРЫ

Data Mining & Особенности реализации учетных задач

Дата: 19.11.2004г. 18:30
Место: г. Москва. Чапаевский пер., 14. Представительство Microsoft в России и СНГ.
Доклады:

1. Особенности реализации учетных задач в условиях существенной динамики бизнес-процессов. Андрей Гордиенко

2. Data Mining - возможности и приёмы использования. Заур Нуралиев

Для регистрации на семинар, пришлите письмо в свободной форме на адрес mssqlhelp@rambler.ru, с указанием Вашей фамилии, имени и отчества (полностью).

Количество мест в аудитории семинара ограничено, поэтому прошу Вас не откладывать регистрацию.

За день до даты проведения семинара, всем кто был успешно зарегистрирован, по электронной почте придёт письмо с подтверждением регистрации.

Для того, что бы пройти в помещение проведения семинара, при себе необходимо иметь паспорт или другое удостоверение личности.

Карта проезда в представительство Microsoft

[В начало]

Лекции для разработчиков Microsoft .NET

С 16 по 26 ноября в городах России (Томск, Новосибирск, Казань, Самара, Ростов) пройдет тур лекций для групп разработчиков Microsoft .NET при поддержке Microsoft Russia и INETA Europe. Участие в семинарах бесплатное.

Докладчики:

  1. Александр Ложечкин, DPE Microsoft Russia
  2. Андрей Филев, VP Murano Software, член европейского совета INETA (www.ineta.org)

Темы докладов:

  1. Доклад Александра Ложечкина (все города): “Использование Microsoft BizTalk Server 2004 для интеграции приложений и автоматизации бизнес-процессов”. В докладе рассматривается архитектура продукта, круг решаемых задач: интеграция приложений, автоматизация бизнес-процессов и т.д.
  2. Доклад Андрея Филева (Томск, Новосибирск): "Теория и практика рефакторинга C# кода". В своём докладе Андрей Филёв изложит основы рефакторинга, расскажет про автоматизированные средства рефакторинга, доступные C# программистам (Whidbey, iStudio), а также поделится передовым опытом разработки автоматизированного средства рефакторинга для C#.

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

Место и время проведения:

Томск, 16 ноября, вторник.
Новосибирск, 17 ноября, среда.
Казань, 19 ноября, пятница.
Самара, 25 ноября, четверг.
Ростов, 26 ноября, пятница.

Участие в семинаре бесплатное при предварительной регистрации на страницах групп разработчиков. Следите за дополнительной информацией.

[В начало]

СОВЕТЫ

Блокировки SQL Server 7.0/2000 - теория и практика устранения проблем (продолжение)

По материалам статьи KB224453 Understanding and Resolving SQL Server 7.0 or 2000 Blocking Problems
Перевод Ирины Наумовой

Введение
Сбор информации о блокировках
Получение информации с помощью профайлера (SQL Server Profiler)

Типовые сценарии нахождения и разрешения блокировок

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

Обзор результатов типовых сценариев поиска блокировок.

  • Использование таблицы sysprocesses для определения головного SPID в цепочке блокирования.

    Если Вы не укажите в скрипте быстрый режим "fast", тогда в результирующем наборе, в колонке "SPIDs at the head of blocking chains", Вы получите список всех SPID, блокирующих другие:

    
    SPIDs at the head of blocking chains
    spid  
    ------ 
    9
    10

    Если же Вы указали быстрый режим, Вы все еще можете идентифицировать по sysprocesses головные SPID в цепочке блокирования. Вот сокращенный результат выборки из sysprocesses:

    
    spid   status              blocked
    ----   --------            -------
    9      sleeping            0
    10     sleeping            0
    11     sleeping            13
    12     sleeping            10
    13     sleeping            9
    14     sleeping            12

    Здесь видно, что SPID 9 и 10 в столбце blocked имеют значение 0, а это означает, что такие SPID не заблокированы другими и поэтому являются головными SPID в своих собственных цепочках блокирования.

  • Анализ результатов, полученных из таблицы sysprocesses относительно головных SPID в цепочке блокирования.

    Важно оценить следующие поля sysprocesses:

    • Status - это поле определяет статус отдельного SPID. Как правило, статус sleeping означает что SPID закончил обработку запроса или пакета и ожидает от приложения следующего. Статус runnable показывает, что SPID в текущий момент выполняет запрос. В следующей таблице даны краткая информация о значениях поля status:

      Status

      Описание

      Background

      SPID выполняет фоновую задачу

      Sleeping

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

      Runnable

      SPID обрабатывает в текущий момент запрос или пакет

      Dormant

      Статус Dormant показывает, что процесс завершил выполнение RPC, высвобождает ресурсы, используемые в процессе выполнения RPC и ждет следующей команды

      Rollback

      SPID находится в процессе отката транзакции

      Defwakeup

      SPID ожидает ресурс, который находится в процессе освобождения. Поле waitresource указывает на ресурс в запросе

      Spinloop

      Процесс находится в состоянии ожидания после попытки установить короткую блокировку (spinlock), используемую для управления параллельным выполнением на SMP системах

    • Open_tran - это поле показывает уровень вложенности транзакций для отдельного SPID. Если значение больше 0, это означает, что SPID обрабатывает транзакцию и возможно одна из команд внутри транзакции удерживает блокировку.
    • Lastwaittype, waittype и waittime. Поле lastwaittype показывает последний или текущий тип ожидания SPID. Это поле появилось в SQL Server 7.0 и является строковым представлением поля waittype (которое представлено в шестнадцатеричном виде). Если значение waittype = 0x0000, SPID ничего не ожидает и поле lastwaittype равно предыдущему типу ожидания для этого SPID. Если значение поля waittype не равно нулю, то в поле lastwaittype записывается информация о текущем типе ожидания для SPID.
      Чтобы получить краткое описание различий между значениями полей lastwaittype и waittype, можно прочитать следующую статью базы знаний Microsoft: 244455 INF: Definition of Sysprocesses Waittype and Lastwaittype Fields (Описание полей Waittype и Lastwaittype таблицы sysprocesses).
      С помощью значения waittime можно отслеживать динамику создаваемых SPID блокировок Когда запрос к таблице sysprocesses возвращает значение в столбце waittime, которое меньше чем значение waittime из предыдущего запроса к sysprocesses, это означает, что предшествующая блокировка была наложена, а затем снята и теперь SPID ожидает с новой блокировкой, принимая ненулевой waittime). Это может быть проверено путем сравнения значения поля waitresource между выборками из sysprocesses.

    • Waitresource - это поле показывает ресурс, освобождения которого ожидает SPID. В таблице ниже представлен список значений поля waitresource, его формат и описание:

      Тип ресурса

      Формат поля waitresource

      Пример

      Table (Таблица)

      DatabaseID:ObjectID

      TAB: 5:261575970
      В данном случае, это база данных с ID=5, pubs, и ее объект с ID 261575970, это таблица titles

      Page (Страница)

      DatabaseID:FileID:PageID

      PAG: 5:1:104
      База данных с ID=5, pubs. ID файла равно 1, это первичный файл данных. Страница 104, эта страница принадлежит таблице titles

      Key (Ключ)

      DatabaseID:ObjectID:IndexID
      (Hash value for index key)

      KEY: 5:261575970:1 (5d0164fb1eac)
      База данных с ID=5, pubs. ID объекта 261575970, таблица titles, ID индекса 1, означает что это кластерный индекс и значение хэш-функции показывает значение индексного ключа для определенной строки

      Row (Строка)

      DatabaseID:FileID:PageID:Slot(row)

      RID: 5:1:104:3
      ID базы данных =5 (база данных pubs), ID файла =1(основная файловая группа), страница 104 принадлежит таблице titles, слот 3 указывает позицию строки на странице

      Compile (Компиляция)

      DatabaseID:ObjectID

      TAB: 5:834102012 [[COMPILE]]
      ID базы данных =5 (база данных pubs), ID объекта = 834102012 (это хранимая процедура). Показывает что SPID ожидает компиляции плана хранимой процедуры

    • Другие поля. Изучение полей sysprocesses может облегчить понимание сути проблемы. Количество полей для изучения определяется в зависимости от необходимости. Например, можно определить что проблема возникает только от некоторых клиентов (hostname), на некоторых сетевых библиотеках (net_library), когда выполнялся последний пакет (last_batch) и т.д. Для краткого описания полей sysprocesses, воспользуйтесь разделом "sysprocesses (T-SQL)" справочной системы SQL Server.
      ОБРАТИТЕ ВНИМАНИЕ: столбец SUID не включен в результат сценария блокирования, потому что это вычисляемый столбец, который используется только для обратной совместимости. Он не используется внутри SQL Server, и Вы можете получить снижение производительности, запрашивая этот столбец (потому что он вычисляется).

  • Изучение результата DBCC INPUTBUFFER

    Для каждого головного SPID в цепочке блокирования, или для тех SPID, у которых тип ожидания не равен нулю, в сценарии блокирования будет выполнена команда DBCC INPUTBUFFER, с помощью которой можно определить запрос, который выполняется в контексте данного SPID:

    
    DBCC INPUTBUFFER FOR SPID 9
    
    EventType       Parameters  EventInfo                  
    --------------  ----------  -------------------------------------------- 
    Language Event  0           update titles set title = title

    В большинстве случаев этот запрос как раз и является причиной блокировки. Однако, если внутри SPID выполняется транзакция, состоящая из нескольких запросов, то блокировка могла быть наложена предыдущим запросом, а не текущим. Поэтому следует использовать не только результаты, полученные с помощью inputbuffer, но и профайлер.
    ОБРАТИТЕ ВНИМАНИЕ: Поскольку сценарий блокирования состоит из нескольких шагов, то на первом шаге SPID может стать главой цепочки блокирования, но в момент выполнения DBCC INPUTBUFFER запрос может быть уже выполнен и блокировка будет снята, тогда INPUTBUFFER не сможет зафиксировать эту блокировку. Это показывает, что блокирование разрешается само для этого SPID и проблемы может и не возникнуть. В этом случае Вы можете запустить сценарий блокирования в быстром режиме, чтобы просмотреть содержимое входного буфера, пока он не очистился (хотя и в этом случае не гарантируется, что Вы получите нужный результат), либо можно отследить с помощью профайлера какие запросы выполняет SPID в этот временной промежуток.

Анализ данных, полученных с помощью профайлера

Изучение данных профайлера может повысить эффективность решения проблем с блокированием. Не понадобится собирать лишнюю информацию, и профайлер предоставляет возможности для более эффективного сбора данных. В диалоговом окне Properties (Меню FILE -->Properties), профайлер позволяет ограничить количество получаемых данных путем исключения лишних столбцов данных или событий, группировать данные и применять к ним фильтры. Вы можете осуществлять поиск по всей трассе или искать определенные значения определенного столбца данных. (Меню Edit-' Find). Также имеется возможность сохранять трассу в таблицу SQL Server (Меню File -' Save As -' Table).
Применяйте фильтр только к заранее сохраненному файлу трассировки. Когда Вы применяете фильтр к активной трассировке, Вы рискуете потерять данные, которые были получены до этого с момента запуска трассы. Сохраните сначала активную трассу в файл или таблицу (File ' Save As), затем откройте (File ' Open) и только потом применяйте фильтр. Когда Вы работаете с заранее сохраненным файлом трассы, профайлер не удаляет отфильтрованные данные из файла, а просто их не выводит, и Вы также можете добавлять или удалять события и колонки данных.

Что искать:

  • Какие команды выполняет SPID, являющийся головным в цепочке блокирования? Отфильтруйте данные трассировки для этого SPID (File'Properties'Filters и введите значение SPID). Вы также можете определить команды, которые выполнял SPID, в то время, пока блокировал другие. Включив в трассу событие Transaction можно легко определить время начала транзакции. Для этого можно просмотреть поле Text на предмет появления там операторов BEGIN, SAVE, COMMIT и ROLLBACK TRANSACTION. С помощью значения open_tran из таблицы sysprocesses, можно убедиться в том, что в трассе отражены все события транзакции. Знание команд, выполняющихся в контексте транзакции, позволяет определить, почему SPID удерживает блокировку.
    Помните, что Вы можете удалять события и колонки данных из трассы. Вместо того, чтобы отлавливать события и начала, и окончания, используйте одно из них. Если блокирующий SPID выполняет не хранимую процедуру, удалите одно из следующих событий: либо SP:Starting, либо SP:Completed, события SQLBatch и RPC будут показывать вызовы процедур. Выбирайте события SP только в случае если Вам нужно увидеть все уровни детализации.
  • Каково время выполнения запросов для SPID, являющегося головным в цепочке блокирования? Если Вы включите в трассу событие окончания (о нем рассказано выше), в колонке Duration будет показано время выполнения запроса. Это значение можно использовать для определения длительно выполняющихся запросов, которые приводят к блокировкам. Для определения причины медленного выполнения запроса, в трассу можно включить колонки CPU, Read, Writes, а также событие Execution Plan.

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

[В начало]

За и против использования команды SELECT, представлений и хранимых процедур в SQL Server (окончание)

По материалам статьи G. Vijayakumar Pros & Cons of Using SELECT, Views, and Stored Procedures in SQL Server
Перевод Виталия Степаненко

Хранимые процедуры

Мы создадим хранимую процедуру с одним параметром и посмотрим, чем она отличается от команды SELECT и представления.


CREATE PROC spDummyTable1 (@EmpID Int) AS
SELECT EmpID, EmpName FROM DummyTable1 WHERE EmpID = @EmpID

Теперь давайте выполним следующие команды, чтобы увидеть данные и информацию из кэша для хранимой процедуры spDummyTable1.


EXEC spDummyTable1 1
GO
SELECT cacheobjtype, refcounts, usecounts, sql
FROM master.dbo.Syscacheobjects
GO

Cacheobjtype

Refcounts

Usecounts

Sql

Executable Plan

1

1

spDummyTable1

Compiled Plan

2

1

spDummyTable1

SQL Server отображает скомпилированный и выполненный планы для хранимой процедуры spDummyTable1.

Давайте снова выполним ту же команду и посмотрим информацию в кэше.


EXEC spDummyTable1 1
GO
SELECT cacheobjtype, refcounts, usecounts, sql
FROM master.dbo.Syscacheobjects
GO

Cacheobjtype

Refcounts

Usecounts

Sql

Executable Plan

1

2

spDummyTable1

Compiled Plan

2

1

spDummyTable1

Значение Usecounts увеличилось. SQL Server использовал тот же скомпилированный план для команды SELECT и увеличил значение Usecounts выполненного плана. Один и тот же скомпилированный план будет использоваться все время, пока будет выполняться одна и та же хранимая процедура.

Давайте выполним ту же хранимую процедуру с другим значением параметра empid и взглянем на информацию в кэше.


EXEC spDummyTable1 3
GO
SELECT cacheobjtype, refcounts, usecounts, sql
FROM master.dbo.Syscacheobjects
GO

Cacheobjtype

Refcounts

Usecounts

Sql

Executable Plan

1

3

spDummyTable1

Compiled Plan

2

1

spDummyTable1

Значение Usecounts увеличилось. Хотя мы задали другое значение empid, SQL Server использовал тот же скомпилированный план для хранимой процедуры и увеличил значение Usecounts выполненного плана.

Теперь давайте выполним эту же хранимую процедуру с указанием владельца и взглянем на информацию в кэше.


EXEC dbo.spDummyTable1 5
GO
SELECT cacheobjtype, refcounts, usecounts, sql
FROM master.dbo.Syscacheobjects
GO

Cacheobjtype

Refcounts

Usecounts

Sql

Executable Plan

1

4

spDummyTable1

Compiled Plan

2

1

spDummyTable1

Никаких изменений. SQL Server использовал тот же скомпилированный план для хранимой процедуры и увеличил значение Usecounts выполненного плана.

Давайте выполним эту же хранимую процедуру другим пользователем. Я создал нового пользователя, 'user1', и дал ему права на выполнение хранимой процедуры spDummyTable1. Я открыл другой Query Analyzer и подсоединился, используя UID: user1; PWD : user1. После этого я выполнил следующую команду.


EXEC dbo.spDummyTable1 3
GO
SELECT cacheobjtype, refcounts, usecounts, sql
FROM master.dbo.Syscacheobjects
GO

Разные пользователи, выполняя хранимую процедуру с разным или одинаковым значением empid, используют тот же скомпилированный план и увеличивают значение Usecounts выполненного плана.

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


EXEC vijay.dbo.spDummyTable1 7
GO
SELECT cacheobjtype, refcounts, usecounts, sql
FROM master.dbo.Syscacheobjects
GO

Cacheobjtype

Refcounts

Usecounts

Sql

Executable Plan

1

5

spDummyTable1

Compiled Plan

2

1

spDummyTable1

Никаких изменений. SQL Server использовал тот же скомпилированный план для хранимой процедуры и увеличил значение Usecounts выполненного плана.

В результате можно сделать вывод, что хранимая процедура компилируется один раз, использует один и тот же скомпилированный план и увеличивает значение Usecounts выполненного плана. Хранимая процедура уже предварительно загружена в память для быстрого выполнения, что повышает производительность системы. Это действительно показывает нам важность хранимой процедуры по сравнению с командой SELECT и представлением.

Теперь давайте выполним следующую команду для очистки кэша перед экспериментированием с представлениями.


DBCC FREEPROCCACHE
GO

Представления

Мы создадим представление и посмотрим, чем оно отличается от команды SELECT и хранимой процедуры.


CREATE VIEW vwDummyTable1 AS 
SELECT EmpID, EmpName FROM DummyTable1
GO

Теперь давайте выполним следующие команды для отображения данных и информации в кэше для созданного представления vwDummyTable1.


SELECT EmpId, EmpName from vwDummyTable1
GO
SELECT cacheobjtype, refcounts, usecounts, sql
FROM master.dbo.Syscacheobjects
GO

Cacheobjtype

Refcounts

Usecounts

Sql

Executable Plan

1

1

()SELECT EmpID, EmpName FROM [vwDummyTable1]

Compiled Plan

2

2

()SELECT EmpID, EmpName FROM [vwDummyTable1]

SQL Server показывает скомпилированный план и выполненный план для представления vwDummyTable1.

Теперь давайте снова выполним ту же команду и взглянем на информацию в кэше.


SELECT EmpId, EmpName from vwDummyTable1
GO
SELECT cacheobjtype, refcounts, usecounts, sql
FROM master.dbo.Syscacheobjects
GO

Cacheobjtype

Refcounts

Usecounts

Sql

Executable Plan

1

2

()SELECT EmpID, EmpName FROM [vwDummyTable1]

Compiled Plan

2

2

()SELECT EmpID, EmpName FROM [vwDummyTable1]

Значение Usecounts увеличилось. SQL Server использовал тот же скомпилированный план для команды SELECT представления и увеличил значение Usecounts выполненного плана. Один и тот же скомпилированный план будет использоваться все время, пока мы будем выполнять ту же команду SELECT представления.

Теперь давайте добавим выражение WHERE в команду SELECT представления и взглянем на результаты в таблице master.dbo.Syscacheobjects.


SELECT EmpId, EmpName from vwDummyTable1 WHERE EmpID = 4
GO
SELECT cacheobjtype, refcounts, usecounts, sql
FROM master.dbo.Syscacheobjects
GO

SQL Server не использовал существующий план в кэше из-за изменения команды SELECT представления. SQL Server сгененировал новый план кэша для команды SELECT представления, оставив там и старый план.

Cacheobjtype

Refcounts

Usecounts

Sql

Executable Plan 1 1 (@1 tinyint)SELECT EmpID, EmpName FROM [vwDummyTable1] WHERE [EmpID]=@1
Compiled Plan 2 2 (@1 tinyint)SELECT EmpID, EmpName FROM [vwDummyTable1] WHERE [EmpID]=@1
Executable Plan 1 2 ()SELECT EmpID, EmpName FROM [vwDummyTable1]
Compiled Plan 2 2 ()SELECT EmpID, EmpName FROM [vwDummyTable1]

Давайте выполним ту же команду SELECT представления с другим empid и взглянем на результаты.


SELECT EmpId, EmpName FROM vwDummyTable1 WHERE EmpID = 8
GO
SELECT cacheobjtype, refcounts, usecounts, sql
FROM master.dbo.Syscacheobjects
GO

Cacheobjtype

Refcounts

Usecounts

Sql

Executable Plan 1 2 (@1 tinyint)SELECT EmpID, EmpName FROM [vwDummyTable1] WHERE [EmpID]=@1
Compiled Plan 2 2 (@1 tinyint)SELECT EmpID, EmpName FROM [vwDummyTable1] WHERE [EmpID]=@1
Executable Plan 1 2 ()SELECT EmpID, EmpName FROM [vwDummyTable1]
Compiled Plan 2 2 ()SELECT EmpID, EmpName FROM [vwDummyTable1]

Хотя мы задали другое значение empid, SQL Server использовал тот же скомпилированный план для команды SELECT представления и увеличил значение Usecounts выполненного плана. Разные пользователи могут выполнять команду SELECT представления с разными значениями empid, при этом будет использоваться тот же скомпилированный план и будет увеличиваться значение Usecounts выполненного плана.

Теперь давайте выполним ту же команду представления с указанием владельца в SELECT и взглянем на результаты.


SELECT EmpId, EmpName from dbo.vwDummyTable1 WHERE EmpID = 8
GO
SELECT cacheobjtype, refcounts, usecounts, sql
FROM master.dbo.Syscacheobjects
GO

Cacheobjtype

Refcounts

Usecounts

Sql

Executable Plan

1

1

(@1 tinyint)SELECT [EmpId]=[EmpId],[EmpName]=[EmpName] FROM [dbo].[vwDummyTable1] WHERE [EmpID]=@1

Compiled Plan

2

2

(@1 tinyint)SELECT [EmpId]=[EmpId],[EmpName]=[EmpName] FROM [dbo].[vwDummyTable1] WHERE [EmpID]=@1

Executable Plan

1

2

(@1 tinyint)SELECT EmpID, EmpName FROM [vwDummyTable1] WHERE [EmpID]=@1

Compiled Plan

2

2

(@1 tinyint)SELECT EmpID, EmpName FROM [vwDummyTable1] WHERE [EmpID]=@1

Executable Plan

1

2

()SELECT EmpID, EmpName FROM [vwDummyTable1]

Compiled Plan

2

2

()SELECT EmpID, EmpName FROM [vwDummyTable1]

Теперь мы получили еще 2 строки в кэше, потому что использовали разные имена владельцев в команде SELECT. SQL Server генерирует новый скомпилированный план и выполненный план для другого пользователя. Если этот пользователь выполнит команду SELECT больше одного раза, то будет использован этот же скомпилированный план и будет увеличено значение Usecounts выполненного плана.

Давайте выполним ту же команду SELECT представления с другим empid и проверим результат.


SELECT EmpId, EmpName from dbo.vwDummyTable1 WHERE EmpID = 6
GO
SELECT cacheobjtype, refcounts, usecounts, sql
FROM master.dbo.Syscacheobjects
GO

Cacheobjtype

Refcounts

Usecounts

Sql

Executable Plan

1

2

(@1 tinyint)SELECT [EmpId]=[EmpId],[EmpName]=[EmpName]
FROM [dbo].[vwDummyTable1] WHERE [EmpID]=@1

Compiled Plan

2

2

(@1 tinyint)SELECT [EmpId]=[EmpId],[EmpName]=[EmpName]
FROM [dbo].[vwDummyTable1] WHERE [EmpID]=@1

Executable Plan

1

2

(@1 tinyint)SELECT EmpID, EmpName
FROM [vwDummyTable1] WHERE [EmpID]=@1

Compiled Plan

2

2

(@1 tinyint)SELECT EmpID, EmpName
FROM [vwDummyTable1] WHERE [EmpID]=@1

Executable Plan

1

2

()SELECT EmpID, EmpName FROM [vwDummyTable1]

Compiled Plan

2

2

()SELECT EmpID, EmpName FROM [vwDummyTable1]

Теперь давайте выполним ту же команду с указанием базы данных и владельца в команде SELECT представления и проверим результат.


SELECT EmpId, EmpName from vijay.dbo.vwDummyTable1 WHERE EmpID = 10
GO
SELECT cacheobjtype, refcounts, usecounts, sql
FROM master.dbo.Syscacheobjects
GO

Cacheobjtype

Refcounts

Usecounts

Sql

Executable Plan

1

1

(@1 tinyint)SELECT [EmpId]=[EmpId],[EmpName]=[EmpName]
FROM [dbo].[vwDummyTable1] WHERE [EmpID]=@1

Compiled Plan

2

2

(@1 tinyint)SELECT [EmpId]=[EmpId],[EmpName]=[EmpName]
FROM [dbo].[vwDummyTable1] WHERE [EmpID]=@1

Executable Plan

1

2

(@1 tinyint)SELECT EmpID, EmpName
FROM [vwDummyTable1] WHERE [EmpID]=@1

Compiled Plan

2

2

(@1 tinyint)SELECT EmpID, EmpName
FROM [vwDummyTable1] WHERE [EmpID]=@1

Executable Plan

1

1

(@1 tinyint)SELECT [EmpId]=[EmpId],[EmpName]=[EmpName]
FROM [vijay].[dbo].[vwDummyTable1] WHERE [EmpID]=@1

Compiled Plan

2

2

(@1 tinyint)SELECT [EmpId]=[EmpId],[EmpName]=[EmpName]
FROM [vijay].[dbo].[vwDummyTable1] WHERE [EmpID]=@1

Compiled Plan

1

2

()SELECT EmpID, EmpName FROM [vwDummyTable1]

Compiled Plan

2

2

()SELECT EmpID, EmpName FROM [vwDummyTable1]

Мы увидели, что можем минимизировать создание скомпилированных планов, если добавим имя базы данных, владельца и выражение WHERE в команду SELECT или в представление. Если вы измените что-либо из этого, то ваш код придется перекомпилировать, что уменьшит производительность системы. Так какая же разница между командой SELECT и представлением относительно производительности?

Есть ли вообще между ними разница? Нет, скомпилированный план и выполненный план одинаковы и для команды SELECT, и для представления. Есть только одно различие - представление физически хранится в базе данных, а команда SELECT - нет. Преимуществом представлений является более легкое администрирование прав доступа к объектам.

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

Биография

G. Vijayakumar имеет опыт работы с клиент-серверными и web-приложениями. В настоящее время он работает в Transworld (Бангалор, Индия) и занимается e-banking продуктами.

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

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

Параллельные планы выполнения SQL Server
Joe Chang
MSSQLServer: Начиная с версии 7.0, Microsoft SQL Server представляет возможность параллельной обработки запросов. Целью параллельного выполнения запроса, использующего большое количество данных, является ускорение его выполнения на многопроцессорном компьютере, чем это возможно при помощи одного потока. Books Online и различные документы Microsoft описывают принципы параллельного выполнения и использование настроек, влияющих на параллельное выполнение. Однако очень мало внимания уделяется объяснению планов выполнения с использованием параллелизма. Сравнение характеристик нескольких запросов в режиме распараллеливания плана исполнения и в режиме, когда параллельность отключена, поможет понять смысл некоторых характеристик параллельных планов, включая значения оценочных затрат. Исслед...
Анализ данных в сводной таблице Microsoft
Кутиков Николай Симхович
Access: В статье описывается сценарий создания в VS.net (VB.net) Windows приложения со сводной таблицей Microsoft , подключаемой к базе данных MSAccess...
Наиболее интересные новшества в стандарте SQL:2003
Сергей Кузнецов
SQL: В конце 2003 г. был принят и опубликован новый вариант международного стандарта SQL:2003 [1]. Многие специалисты считали, что в варианте стандарта, следующем за SQL:1999, будут всего лишь исправлены неточности SQL:1999. Но на самом деле, в SQL:2003 специфицирован ряд новых и важных свойств...
Работа с Crystal Report .NET
Веденин Вадим
MSSQLServer: Популярный пакет генератора отчетов Crystal Report предназначен для создания отчетов презентабельного вида различного типа: табличные запросы к базам данных, сводные диаграммы, OLAP данные. Версия Crystal Report .NET несколько ограничена в возможностях по сравнению с Crystal Report, поставляемым как отдельное приложение, но тем не менее она позволяет реализовать широкий спектр отчетов для Windows и Web приложений...
Блокировки в SQL Server
Andres Taylor
MSSQLServer: Я думал, что знаю SQL Server достаточно хорошо. Я использую этот продукт уже больше 6 лет, и мне нравится знать об используемых мною инструментах все. Когда я преподавал на курсах программирования SQL Server, я заметил, что в материалах Microsoft представлена таблица совместимости блокировок. Та же таблица была представлена и в MSDN. Рассматривая эту таблицу, я удивился - неужели здесь нет блокировки Intent Update? Это привело меня к исследованию блокировок. Эта статья и есть результат этого исследования. Я написал эту статью для определенного читателя - для того, кто понимает уровни изоляции, блокировки намерения, мертвые блокировки и уровни блокировок. Если вы недостаточно уверенно разбираетесь в этих областях, вам нужно сначала ознакомиться с ними перед чтением этой ...

[В начало]

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

Basics of C2 Auditing
Dinesh Asanka
What ever the system that we are taking about, whether it is an ERP system or CRM tool or any database system auditing has become essential part of that system.. Auditing will allow you to
Data Validation Using .NET and External Metadata
Jonathan Schafer
Data validation is a task that we perform every day when writing code. Applying the techniques described here can make your systems more robust and eliminate the constant rebuilding of applications every time a business rule changes. Using .NET reflection and external metadata makes it easy to add data validation to your objects. Nearly every application that collects data, whether from a Windows- or Web-based form or from a file, needs to validate that the data is in the correct format
Making Connections: Binding Controls to Custom Data Sources in .NET
Graham Brooks
Anyone can bind a DataGrid to a DataSet in .NET, but the fact that you can bind almost any control property to almost any suitable object property—even to custom objects or custom object collections—is far less widely known
SQL Server: Routine to push existing records up or down
Greg Robidoux and Jeremy Kadlec
I need to ask help in writing a routine which will push existing records up or down. What I mean is if I have a table with following columns/data
Unified Database Toolkit - Scheduling
Andre Vigneau
I have been working for a while in administering and developing for SQL Server, MSDE, even with the new SQL Server Express. I have put in place a resident database to store tools I use to perform administrative tasks and statistical collection tasks. I also have an automated system to run them for me in appropriate situations as well as an automated notification system to notify me when something is wrong. All this for free. I can define the structure I use and share with you some of the things you can do using this approach. As a start this article presents the base of the automation
WebService - Enabling SQL Server 2005 Procedures
Peter A. Bromberg
SQL Server 2005 is emerging from its final BETA cycle to become a full-fledged product offering very soon. The SQL Server BETA 2 offering, available from MSDN Subscriber Downloads, is both full - featured and fully functional at this point. Only a few items remain, mostly revolving around tuning and final optimization, and some user tweaks and minor bug fixes
Managing Database Driven Application Permissions In SQL Server
Robbe D. Morris
Many websites and desktop applications utilize a relational database to manage user access to certains aspects of the application or ability to view/modify data. I've worked on many different types of applications like this and I'd like to discuss the most flexible and powerful methodology I've found for managing database driven application permissions. Often times, we'll get the urge to try and create users, user types, and user type permissions as a way of handling this task. The downside to such an implementation is that we are now forced to allocate specific permissions to a particular user type. Thus, not accounting for users of a particular user type that need to be granted special permissions or temporary access to a particular permission. In internal data warehouse applications, this often shows itself when a user is being groomed for a promotion and needs access to items not granted to their official job title
Demystify SQL Server FOR XML EXPLICIT
Robbe D. Morris
FOR XML EXPLICIT is an option in SQL Server 2000 that allows you to return your results in a structure specifically defined by you. It is much more powerful than FOR XML AUTO and FOR XML RAW. This includes parent/child relationships, where values are shown as node values or node attributes, encoded or unencoded, and whether a particular column needed in a GROUP BY or ORDER BY clause should be included in the XML results. In my experience, this is a powerful feature for use with a wide variey of applictions such as e-commerce or survey based applications. I've also found this mechanism great for manipulating the XmlDocument returned and eventually passing it back to a different stored procedure in it's entirety and processing an update to the database with it. For information on working with XmlDocument's inside of stored procedures, click here
Using SQL Server Notification Services
Peter A. Bromberg
SQL Server Notification Services is a platform for developing and deploying applications that generate and send notifications to users. Notifications are personalized, timely messages that can be sent to a wide variety of devices
C# / SQL Server Data Documentation
Robbe D. Morris
Some of us don't have access to a nice tool for database documentation especially for code review purposes. We also don't always have the time to plug database specs into a special documenation tool. With that in mind, I put this C# sample together to provide the current look at key areas of a SQL Server 2000 database for code reviews and performance enhancement reviews from a developers prospective. Kind of a poor man's ERWIN (a very poor man). Some of those key areas are table structures, indexes, and stored procedures. In many cases, database constraints and various other settings are important but are often reviewed by our DBA's prior to production
How to run an ASP page with Parameters from SQL Server
Peter A. Bromberg
Usually we use an ASP page with Javascript or VBScript inside it to either get data from, or put data into SQL Server. However, from time to time you wish you could run that favorite, most useful ASP page that you've written that does all those great things and instead have something that happens in SQL Server cause the call to the page
SQL Server 2000 FullText Search Service: How to set up and Query with Indexing Service
A. Bromberg
If you have a discussion forum or other database - enabled service on your site that accumulates significant amounts of textual data, and you want to provide users with a powerful way to search this content based on words or sentences, then the SQL Server Fulltext query engine could be just the thing for you
How to Run an ASP Page to Call a COM Component on a Remote Server from a SQL Server batch process
Peter A. Bromberg
Recently I was posed with an unusual, although not uncommon problem: I needed to run a SQL Server batch job that ran a set of SQL Scripts that were parsed and fired off by a COM component. Basically what the component does is receive an XML document as a method input parameter, parse it apart, and use the resulting "pieces" as input parameters to several SQL scripts that it calls in succession
Send SMTP Email from SQL Server with an extended stored procedure and a free COM component
Peter A. Bromberg
SQL Server has a built - in system stored procedure, xp_sendmail, that allows you to send out email. Unfortunately, it requires the use of the MAPI provider through either Exchange or Outlook (a.k.a. "Windows Messaging"). Although some third party mail tools, such as Lotus Notes, offer MAPI providers, I have found that even the Microsoft MAPI interface can be both bulky and buggy at times. It's also very difficult to find a stand-alone installable version of Windows Messaging for Windows 2000, because it seems that Microsoft has conveniently decided to leave it out. At least, I couldn't find one!
Convert SQL Server nText to HTML
Robbe D. Morris
Have you ever needed to take the contents of a SQL Server nText column in a recordset and simply display the contents nicely in HTML? Normally, all of the spacing and paragraph breaks are removed and you wind up with one big chunk of text that looks horrible. I've also found some of the normal solutions utilizing the <pre> tag or simply replacing end of line control characters disappointing. Here, I've put a few touches on the end of line character approach. This function assumes that the formatted text will reside in an HTML table. So, you'll need to pass in the number of columns the text should span
Pass Arrays To SQL Server
Robbe D. Morris
Have you ever needed to pass a multi-dimensional array as an input parameter to a SQL Server stored procedure? Of course, SQL Server itself does not support passing arrays to its procedures the same way that a Visual Basic or Visual C++ application would. So, we need an alternative that will allow us to "duplicate" the same functionality
Listing databases that have not been backed up
Eli Leiba
This article describes how to retrieve a list of all SQL Server databases that have not been backed up in a given hour's range
Divide and Conquer
Steve Jones
There are many queries and processes that a DBA may perform on an SQL Server that run quickly and efficiently with small amounts of data, but do not scale up when run on large sets of data. The power behind a RDBMS and SQL Server come from the extremely efficient and rapid processing of sets of data. Most other programming languages operate in a row-by-row or procedural fashion working with one piece or line of data at a time. The ability to write SQL code that operates on a batch of data allows the alteration of a large amount of data with a small amount of code. It also allows the very quick and headache creating destruction of data with even smaller amounts of code, but that is another subject and another article
SQL Server 2005. Partitioned Tables and Indexes
Kimberly L. Tripp
Although partitioning tables and indexes has always been a design tactic chosen to improve performance and manageability in larger databases, Microsoft SQL Server 2005 has new features that simplify the design. This whitepaper describes the logical progression from manually partitioning data by creating your own tables to the preliminary features, which enabled partitioning through views in SQL Server 7.0 and SQL Server 2000, to the true partitioned table features available in SQL Server 2005. In SQL Server 2005, the new table-based partitioning features significantly simplify design and administration of partitioned tables while continuing to improve performance. The paper's primary focus is to detail and document partitioning within SQL Server 2005 – giving you an understanding of why, when and how to use partitioned tables for the greatest benefit in your VLDB (Very Large Database). Although primarily a VLDB design strategy, not all databases start out large. SQL Server 2005 provides flexibility and performance while significantly simplifying the creation and maintenance of partitioned tables. Review this document to get detailed information about why you should consider partitioned tables, what they can offer and finally how to design, implement, and maintain partitioned tables
Using the Table Data Type in SQL Server 2000
Mike Gunderloy
SQL Server 2000 has hundreds of advances over SQL Server 7.0. Though it's been out for a few years now, developers can be pardoned if they still haven't found time to dig into all of the changed areas; there are just so many of them, and we've all got work to do. But it's worth finding time now and then to learn something new. Besides, with SQL Server 2005 looming, you don't want to get too far behind. So today, I'm going to fill you in on the table data type and show you some of its uses. Tuck this away in your SQL Server bag of tricks, because it will probably come in useful in the future
Worst Practice - Detailed Disaster Plans
Steve Jones
Many people will read the title above and think I'm crazy. You have to plan for disasters,right? You need detailed plans and procedures to ensure that you can put the infrastructure back together and get the business moving, right? 8 out of 10 businesses fail after a major disaster because of IT, right? Or at least some other very scary statistic like this
SQL Server 2005 Express Edition Overview
Rajesh George
SQL Server Express, a free product based on SQL Server 2005 technology, includes the unique Application XCopy feature, and networking and security that differ from other SQL Server 2005 editions. These topics and the integration of SQL Server Express with Visual Studio 2005 are discussed. Compare this product with the existing Microsoft free databases like MSDE and Jet. (20 printed pages)
Keys to the Database
Joe Celko
Microsoft is making a big marketing push about the forthcoming CLR features in the next release of SQL Server 2005. To quote: "Using common language runtime (CLR) integration, you can code your stored procedures, functions, and triggers in the .Net Framework language of your choice."

[В начало]

ФОРУМ SQL.RU

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

Ваше мнение об упражнениях SELECT на http://sql.ipps.ru
Новые упражнения на http://sql.ipps.ru
Репликация мочит PK на подписчике!!!?
Неправильный результат суммирующего запроса при активных транзакциях
Можноли одним select'ом решить эту задачу?
SQL Server Health and History Tool (SQLH2) Reports
Taблицы HISTORY.
трабл с запросом, помогите
оптимизация запроса
Как выбрать те строки, в которых значение поля изменилось?
Регистрация и коннект к SQL Server не проходят
Помогите найти ошибку
Оптимизация производительности
Как бы с помощью броадкаста получить список серверов в сети ?
Задача с промежутками времени.
сервер не найден ...
синхронизация: что посоветуете?
как узнать номер ключа последнего INSERT
SELECT без блокировок
Основные "ляпы" в настройке SQL сервера с точки зрения оптимизации

[В начало]

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

T-SQL и создать в общих папку на MS Exchange 5.5
Вопрос про With( Index())
Какую DLL использовать?
SQL DMO: запрос без ожидания окончания выполнения
Уменьшение размера базы данных
подкажите утилиту для анализа паролей sql server'а
xp_readmail и аттачменты
Время от времени login failed NT AUTHORITY\ANOMYMOUS
contains игнорирует текст с "-" . Но не всегда.

[В начало]

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