Отправляет email-рассылки с помощью сервиса Sendsay

MS SQL Server

  Все выпуски  

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


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

#221<<  #222

СОДЕРЖАНИЕ

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

СОВЕТЫ

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

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

Данная статья является новой редакцией для SQL Server 7.0 и выше статьи 162361 INF: Understanding and Resolving SQL Server Blocking Problems базы знаний Майкрософт, которая была написана для SQL Server 6.х
Большая часть информации, содержащейся в вышеупомянутой статье, уже обновлена и включена в справочную систему SQL Server 7.0 в раздел "Understanding and Avoiding Blocking" (Понимание и предотвращение блокировок). Вначале, тщательно изучите информацию из этой статьи, т.к. тут она не будет повторяться. Кроме того, эта статья использует ту же самую терминологию что и в 162361
Данная статья посвящена мониторингу SQL Server для сбора и анализа информацию о блокировках и разрешения вызванных ими проблем.
В контексте настоящей статьи термин "connection" (подключение) понимается как одна зарегистрированная сессия с базой данных. Каждое подключение ассоциируется со своим идентификатором системного процесса (SPID). Каждый такой SPID часто рассматривается как процесс, хотя это - не отдельный процесс в обычном понимании. Скорее, каждый SPID состоит из ресурсов сервера, и структур данных, необходимых для того, чтобы обслужить запросы отдельного подключения от клиента. Одно клиентское приложение может иметь одно или более подключений. Для SQL Server нет различия между несколькими подключениями из одного клиентского приложения с отдельного клиентского компьютера и множеством подключений множества клиентских приложений или нескольких клиентских компьютеров. Одно подключение может блокировать другое, независимо от того, порождены ли они одним приложением или отдельными приложениями на двух разных клиентских компьютерах.

Введение

Блокировки присутствуют в любой реляционной системе управления базами данных (СУБД), т.к. на блокировках основана работа механизм обслуживания параллельных запросов. SQL Server порождает блокировку, когда один SPID блокирует определенный ресурс, а второй SPID пытается применить несовместимый тип блокировки на том же самом ресурсе. Как правило, интервал времени, на который первый SPID блокирует ресурс, является очень маленьким. Когда первый SPID снимает блокировку и высвобождает ресурс, второе подключение накладывает свою блокировку на ресурс и продолжает свою работу. Это - нормальная ситуация и такое может происходить по многу раз за день без заметного влияния на производительности сервера.
Продолжительность выполнения запроса и тот факт, выполняется ли он в контексте транзакции, определяют, как долго он блокирует необходимый ему ресурс, а также его воздействие на другие запросы. Если запрос выполняется не в контексте транзакции (и не используются хинты для блокировок), блокировка ресурса для инструкций SELECT будет установлена только на время чтения данных, а не на всё время выполнения запроса. Для операций INSERT, DELETE и UPDATE блокировки накладываются на всё время выполнения запроса. Это необходимо для сохранения целостности данных и для того, чтобы в случае необходимости можно было "откатить" сделанные изменения.
Для запросов, выполняющихся в контексте одной транзакции, продолжительность блокирования ресурса определяется типом запроса, уровнем изоляции транзакций и фактом наличия хинтов, использующихся в запросе. Для изучения блокировок, хинтов и уровней изоляции транзакций, необходимо прочитать следующие статьи SQL Server 7.0 Books Online:

  • "Understanding Locking in SQL Server" (Понятие блокировок в SQL Server)
  • "Locking Architecture" (Архитектура блокирования)
  • "Lock Compatibility" (Совместимость блокировок)
  • "Locking Hints" (Хинты блокирования)
  • "Changing Default Locking Behavior in Oracle and SQL Server" (Изменение блокирования по умолчанию в Oracle и SQL Server)

Блокирование и увеличение количества блокировок до тех пор, когда это уже оказывает влияние на производительность, происходит обычно в одном из следующих случаев:

  • SPID удерживает блокировку длительное время перед тем как высвободить ресурс. Этот тип блокирования через некоторое время разрешается самостоятельно, но может сказаться на производительности.
  • SPID удерживает блокировку на ресурсе и никогда её не снимает. Этот тип блокировки не разрешается самостоятельно и исключает доступ к заблокированному им ресурсу на неопределенное время.

В первом случае, проблема решается через некоторое время, когда SPID снимет блокировку. Однако данную ситуацию трудно отследить с помощью SQL Server Enterprise Manager или используя запросы на T-SQL, в том случае, если различные SPID блокируют разные ресурсы длительное время, потому что картина постоянно меняется. Вторая ситуация приводит к неизменному состоянию, которое легче диагностировать.

Сбор информации о блокировках

Чтобы избежать трудностей поиска проблем блокирования, администратор базы данных может использовать SQL скрипты, которые постоянно контролируют состояние блокирования на SQL Server. Эти скрипты могут обеспечить информацию о блокировках через некоторые промежутки времени, помогая понять причины блокирования. Для описания того, как контролировать блокирование с использованием SQL скриптов, см. следующие статьи в базе знаний Microsoft:

  • 251004 INF: How to Monitor SQL Server 7.0 Blocking
  • 271509 INF: How to Monitor SQL Server 2000 Blocking

Сценарии, приведенные в этих статьях, решают задачи, представленные ниже:

1. Нахождение самого первого SPID в цепочке блокирования.

    В добавление к скриптам из вышеупомянутых статей, также для этой цели Вы можете использовать Enterprise Manager:

      a. Раскрыть дерево Server group, затем выбрать сервер.
      b. Раскрыть контейнер Management; затем Current Activity.
      c. Выбрать Locks / Process ID. Наряду с информацией о блокировании, там имеется информация и о том какие SPID блокируют друг друга.
    Однако, в некоторых случаях необходимо использовать запросы вместо Enterprise Manager, поскольку некоторые типы блокировок базы tempdb могут препятствовать Вам выполнять запросы, использующие временные таблицы.

2. Определение запроса, который выполняется в контексте этого SPID:

    Для этого можно воспользоваться командой DBCC INPUTBUFFER (<spid>)
    Также можно использовать и SQL Enterprise Manager:

      a. Раскрыть дерево Server group, затем выбрать сервер.
      b. Раскрыть контейнер Management; затем Current Activity
      c. Выбрать Process Info. В панели детализации появится список SPID.
      d. Дважды нажать на блокирующем SPID, чтобы увидеть какую последнюю команду на T- SQL он выполняет.

3. Определение типа блокировки, которую удерживает SPID:

    Эту информацию можно получить с помощью хранимой процедуры sp_lock.
    Также можно использовать и SQL Enterprise Manager:

      a. Раскрыть дерево Server group, затем выбрать сервер.
      b. Раскрыть контейнер Management; затем Current Activity.
      c. Раскрыть Locks / Process ID. Здесь можно просмотреть подробную информацию о блокировках, установленных конкретным SPID.

4. Определение уровня вложенности транзакций и статуса выполнения блокирующего SPID.

    Уровень вложенности транзакций можно определить с помощью глобальной переменной @@TRANCOUNT. Также это можно определить, запросив выборку из таблицы sysprocesses:

    
    SELECT open_tran FROM SYSPROCESSES WHERE SPID=<номер блокирующего SPID>
    go

    Значение, которое возвращает переменная @@TRANCOUNT - относится к SPID, и показывает уровень вложенности транзакций, который в свою очередь объясняет причину удерживания блокировки. Например, если значение больше нуля, это означает, что SPID выполняет транзакцию (в этом случае предполагается что блокировка сохраняется в зависимости от уровня изоляции транзакций).
    Также, с помощью инструкции DBCC OPENTRAN database_name, можно проверить имеются ли в базе данных долго выполняющиеся транзакции.

Получение информации с помощью профайлера (SQL Server Profiler)

Часто для того, чтобы полностью исследовать проблему блокировок, необходимо использовать профайлер. Если в контексте SPID выполняется состоящая из нескольких инструкций транзакция, с помощью DBCC INPUTBUFFER можно определить только последнюю инструкцию. Но может так случиться, что блокировку породит команда, которая в транзакции выполнялась раньше. Профайлер позволяет Вам отследить все команды, выполняющиеся внутри этой транзакции. Следующие шаги помогут Вам настроить трассу профайлера для сбора необходимой информации:

1. Запустите SQL Server Profiler.

2. В меню Tools выберите пункт Options.

3. Убедитесь в том, что выбраны опции All Event Classes и All Data Columns.

4. Нажмите OK.

5. В меню File выберите пункт New, затем Trace.

6. На вкладке General введите имя трассировки и файл, в котором будут сохранены результаты трассировки.

7. На вкладке Events добавьте следующие события в свою трассу:

Заголовок

Событие

Описание

Error and Warning

Exception

Это событие показывает, что имеется исключение. Если его уровень значимости менее 25, это говорит о том, что клиенту от SQL Server была возвращена ошибка. Ошибки с уровнем значимости от 25 и выше - это внутренние ошибки SQL Server, каким способом они должны быть отфильтрованы будет рассказано ниже.

Для SQL Server 7.0 - Misc., Для SQL Server 2000 - Error and Warning

Attention

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

Sessions

Connect

Это событие показывает, что появилось новое соединение с сервером.

Sessions

Disconnect

Показывает, что клиент разорвал соединение.

Sessions

Existing Connection

Показывает, что подключение уже существовало, в то время когда началась трассировка.

TSQL

RPC:Starting

Событие показывает, что начал выполняться удаленный вызов процедуры (RPC)

TSQL

SQL:BatchStarting

Показывает, что начал выполняться блок T-SQL команд.

Stored Procedures

SP: StmtStarting

Это событие показывает начало выполнения инструкции внутри хранимой процедуры. Имя хранимой процедуры отображается в колонке Text.

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

Заголовок

Событие

Описание

Для SQL Server 7.0 - Misc., Для SQL Server 2000 - Performance

Execution Plan

Это событие показывает дерево плана исполнения выполняющегося T-SQL запроса

Transactions

DTCTransaction

Показывает информацию о распределенных транзакциях Microsoft Distributed Transaction Coordinator (MS DTC).

Transactions

SQLTransaction

Показывает начало, сохранение, подтверждение и откат транзакции (BEGIN, SAVE, COMMIT и ROLLBACK TRANSACTION)

TSQL

RPC:Completed

Показывает завершение удаленного вызова процедуры (RPC)

TSQL

RPC:Completed

TSQL

SQL:BatchCompleted

Показывает окончание исполнения блока команд T-SQL.

Stored Procedures

SP:StmtCompleted

Показывает что исполнение команд хранимой процедуры завершено.

8. На закладке Data Columns убедитесь, что выбраны следующие колонки: Start Time, End Time, Connection ID, SPID, Event Class, Text, Integer Data, Binary Data, Application Name, NT User Name, и SQL User Name. Если Вы используете дополнительные события из второй таблицы, добавьте также: Duration, CPU, Reads, и Writes.

9. На вкладке Filters исключите внутренние ошибки SQL Server. Для этого в окне Trace Event Criteria выберите Severity и введите значение 24 в поле:

  • Maximum (SQL Server 7.0)
  • Less than or equal (SQL Server 2000)

10. Нажмите OK.

Для получения более подробной информации о мониторинге ошибок, возвращенных клиенту от SQL Server, читайте статью из базы знаний Microsoft 199037 INF: Trapping Error Messages Sent to Clients from a SQL Server. (Отслеживание сообщений об ошибках, возвращенных клиентам от SQL Server)
Для получения информации об использовании профайлера, обратитесь к справочной системе SQL Server.

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

[В начало]

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

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

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

Почему SQL Server предлагает три разных варианта получения данных из базы данных? Как разработчик и администратор баз данных, я захотел узнать все что можно об этих вариантах, почему они могут быть полезными и когда их нужно использовать.

Эта статья - результат моего опыта, она объясняет разницу между командой SELECT, представлением и хранимой процедурой для администратора баз данных или разработчика, которые только знакомятся с SQL Server. Я надеюсь, что эта статья будет вам полезна.

По мере прочтения этой статьи вы сможете выполнять представленный в статье код в Query Analyzer для лучшего понимания различий между командой SELECT, представлением и хранимой процедурой. Я разделил эту статью на 3 части для лучшей подачи информации.

Введение

Чтобы начать рассмотрение различий между командой SELECT, представлением и хранимой процедурой, мне нужно напомнить о системной таблице syscacheobjects. Она используется для хранения информации о скомпилированных объектах и их планах выполнения.

Причиной напоминания об этой таблице являются хранящиеся в ней скомпилированные команды SELECT, представления и хранимые процедуры, и я использовал эту таблицу, чтобы экспериментировать и узнать больше о том, как эти 3 разных объекта хранятся и используются в SQL Server. Если вы не знаете эту системную таблицу, то вам будет полезно взглянуть на нее. Она хранится в базе данных master и может быть просмотрена при помощи Enterprise Manager или Query Analyzer.

Если вы будете выполнять примеры из этой статьи, то вам нужно будет выполнять команду DBCC FREEPROCCACHE перед каждым запуском. Эта команда удаляет в таблице syscacheobjects все кэшированные объекты и позволяет проводить более аккуратные тесты.

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

Создание тестовой таблицы

Я предполагаю, что у вас есть база данных для создания таблицы. Если нет, то вам нужно создать базу данных. После этого нам нужно создать таблицу для экспериментирования.


Create Table DummyTable1
(
             EmpId Int,
             EmpName Varchar(8000)
)

Теперь давайте добавим несколько записей в эту таблицу с помощью следующего скрипта:


Insert Into DummyTable1 Values (1, Replicate ('a',20))
GO
Insert Into DummyTable1 Values (2, Replicate ('b',20))
GO
Insert Into DummyTable1 Values (3, Replicate ('c',20))
GO
Insert Into DummyTable1 Values (4, Replicate ('d',20))
GO
Insert Into DummyTable1 Values (5, Replicate ('e',20))
GO
Insert Into DummyTable1 Values (6, Replicate ('f',20))
GO
Insert Into DummyTable1 Values (7, Replicate ('g',20))
GO
Insert Into DummyTable1 Values (8, Replicate ('h',20))
GO
Insert Into DummyTable1 Values (9, Replicate ('i',20))
GO
Insert Into DummyTable1 Values (10, Replicate ('j',20))
GO

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

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

Команда SELECT

Теперь давайте взглянем на содержимое таблицы, выполнив следующую команду в Query Analyzer для новой таблицы.


SELECT EmpId, EmpName FROM DummyTable1
GO

EmpID EmpName
1 aaaaaaaaaaaaaaaaaaaa
2 bbbbbbbbbbbbbbbbbbbb
3 cccccccccccccccccccc
4 dddddddddddddddddddd
5 eeeeeeeeeeeeeeeeeeee
6 ffffffffffffffffffff
7 gggggggggggggggggggg
8 hhhhhhhhhhhhhhhhhhhh
9 iiiiiiiiiiiiiiiiiiii
10 jjjjjjjjjjjjjjjjjjjj

Как предолагается, данные были введены перед тем, как была выполнена эта команда.

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


DBCC FREEPROCCACHE
GO

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

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


SELECT EmpId, EmpName FROM DummyTable1
GO
SELECT cacheobjtype, refcounts, usecounts, sql FROM master.dbo.syscacheobjects
GO

В результате мы получим много столбцов, но нас пока интересуют только 4 из них, которые показаны ниже.

Cacheobjtype Refcounts Usecounts Sql
Executable Plan 1 1 ()SELECT [EmpId]=[EmpId],[EmpName]=[EmpName] FROM [DummyTable1]
Compiled Plan 2 2 ()SELECT [EmpId]=[EmpId],[EmpName]=[EmpName] FROM [DummyTable1]

Вот что означает эта информация:

Cacheobjtype: тип хранимого в кэше объекта, который может включать:

* Скомпилированный план
* Выполненный план
* Parse Tree
* Cursor Parse Tree
* Внешняя хранимая процедура

We will be concentrating mainly on the Compiled Plan and the Executable Plan cacheobjtype type objects.

Мы в основном сконцентрируемся на скомпилированном и выполненном планах.

Refcounts: количество других кэшированных объектов, ссылающихся на этот кэшированный объект. Количество, равное 1, относится к базе.

Usecounts: количество раз, которое этот кэшированный объект использовался со времени его появления в кэше.

Sql: текст команды.

Теперь давайте выполним ту же команду SELECT:


SELECT EmpId, EmpName FROM DummyTable1
GO 

Cacheobjtype Refcounts Usecounts Sql
Executable Plan 1 2 ()SELECT [EmpId]=[EmpId],[EmpName]=[EmpName] FROM [DummyTable1]
Compiled Plan 2 2 ()SELECT [EmpId]=[EmpId],[EmpName]=[EmpName] FROM [DummyTable1]

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

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


SELECT EmpId, EmpName FROM DummyTable1 WHERE EmpId = 5
GO
SELECT cacheobjtype, refcounts, usecounts, sql
FROM master.dbo.Syscacheobjects
GO

SQL Server has not used the existing cache plan because of the change in the SELECT statement. SQL Server will generate a new cache plan for the SELECT statement along with old cache plan.

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

Cacheobjtype Refcounts Usecounts Sql
Executable Plan 1 1 (@1 tinyint)SELECT [EmpId]=[EmpId],[EmpName]=[EmpName]
FROM [DummyTable1] WHERE [EmpId]=@1
Compiled Plan 2 2 (@1 tinyint)SELECT [EmpId]=[EmpId],[EmpName]=[EmpName]
FROM [DummyTable1] WHERE [EmpId]=@1
Executable Plan 1 2 ()SELECT [EmpId]=[EmpId],[EmpName]=[EmpName] FROM [DummyTable1]
Compiled Plan 2 2 ()SELECT [EmpId]=[EmpId],[EmpName]=[EmpName] FROM [DummyTable1]

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


SELECT EmpId, EmpName FROM DummyTable1 WHERE EmpId = 3
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 [DummyTable1] WHERE [EmpId]=@1
Compiled Plan 2 2 (@1 tinyint)SELECT [EmpId]=[EmpId],[EmpName]=[EmpName]
FROM [DummyTable1] WHERE [EmpId]=@1
Executable Plan 1 2 ()SELECT [EmpId]=[EmpId],[EmpName]=[EmpName] FROM [DummyTable1]
Compiled Plan 2 2 ()SELECT [EmpId]=[EmpId],[EmpName]=[EmpName] FROM [DummyTable1]

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

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


SELECT EmpId, EmpName FROM dbo.DummyTable1 WHERE EmpId = 3
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 [DummyTable1] WHERE [EmpId]=@1
Compiled Plan 2 2 (@1 tinyint)SELECT [EmpId]=[EmpId],[EmpName]=[EmpName]
FROM [DummyTable1] WHERE [EmpId]=@1
Executable Plan 1 1 (@1 tinyint)SELECT [EmpId]=[EmpId],[EmpName]=[EmpName]
FROM [dbo].[DummyTable1] WHERE [EmpId]=@1
Compiled Plan 2 2 (@1 tinyint)SELECT [EmpId]=[EmpId],[EmpName]=[EmpName]
FROM [dbo].[DummyTable1] WHERE [EmpId]=@1
Executable Plan 1 2 ()SELECT [EmpId]=[EmpId],[EmpName]=[EmpName] FROM [DummyTable1]
Compiled Plan 2 2 ()SELECT [EmpId]=[EmpId],[EmpName]=[EmpName] FROM [DummyTable1]

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

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


SELECT EmpId, EmpName FROM dbo.DummyTable1 WHERE EmpId = 3
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 [DummyTable1] WHERE [EmpId]=@1
Compiled Plan 2 2 (@1 tinyint)SELECT [EmpId]=[EmpId],[EmpName]=[EmpName]
FROM [DummyTable1] WHERE [EmpId]=@1
Executable Plan 1 2 (@1 tinyint)SELECT [EmpId]=[EmpId],[EmpName]=[EmpName]
FROM [dbo].[DummyTable1] WHERE [EmpId]=@1
Compiled Plan 2 2 (@1 tinyint)SELECT [EmpId]=[EmpId],[EmpName]=[EmpName]
FROM [dbo].[DummyTable1] WHERE [EmpId]=@1
Executable Plan 1 2 ()SELECT [EmpId]=[EmpId],[EmpName]=[EmpName] FROM [DummyTable1]
Compiled Plan 2 2 ()SELECT [EmpId]=[EmpId],[EmpName]=[EmpName] FROM [DummyTable1]

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


SELECT EmpId, EmpName FROM vijay.dbo.DummyTable1 WHERE EmpId = 3
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 [DummyTable1] WHERE [EmpId]=@1
Compiled Plan 2 2 (@1 tinyint)SELECT [EmpId]=[EmpId],[EmpName]=[EmpName]
FROM [DummyTable1] WHERE [EmpId]=@1
Executable Plan 1 1 (@1 tinyint)SELECT [EmpId]=[EmpId],[EmpName]=[EmpName]
FROM [vijay].[dbo].[DummyTable1] WHERE [EmpId]=@1
Compiled Plan 2 2 (@1 tinyint)SELECT [EmpId]=[EmpId],[EmpName]=[EmpName]
FROM [vijay].[dbo].[DummyTable1] WHERE [EmpId]=@1
Executable Plan 1 2 (@1 tinyint)SELECT [EmpId]=[EmpId],[EmpName]=[EmpName]
FROM [dbo].[DummyTable1] WHERE [EmpId]=@1
Compiled Plan 2 2 (@1 tinyint)SELECT [EmpId]=[EmpId],[EmpName]=[EmpName]
FROM [dbo].[DummyTable1] WHERE [EmpId]=@1
Executable Plan 1 2 ()SELECT [EmpId]=[EmpId],[EmpName]=[EmpName] FROM [DummyTable1]
Compiled Plan 2 2 ()SELECT [EmpId]=[EmpId],[EmpName]=[EmpName] FROM [DummyTable1]

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

Если вы это сделаете, то SQL Server создаст новый план выполнения команды SELECT. Мы можем минимизировать количество планов выполнения, чтобы повысить производительность системы.

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


DBCC FREEPROCCACHE
GO

ОКОНЧАНИЕ СЛЕДУЕТ

[В начало]

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

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

Что такое GUID
Realcoding.NET
MSSQLServer: При решении задачи консолидации данных всегда возникает проблема создания уникальных идентификаторов объединяемых записей. Существует много вариантов выбора типа и способа формирования таких идентификаторов, но самый простой - применение GUID...
Распространение программ Microsoft Access
А. Г. Драпеко
Access: Если вы уже научились создавать приложения в Microsoft Access, то рано или поздно у вас возникнет потребность их распространять - возможно, только внутри своей фирмы, а возможно, и на рынке. Возникающие проблемы и пути их решения в обоих случаях будут одними и теми же. Какой же путь избрать для передачи своего приложения в чужие руки? Если просто переписать на дискету файл базы данных и файл рабочих групп, то с приложением смогут работать только обладатели соответствующей версии Access. Можно воспользоваться специальной программой-инсталлятором, но тогда нужно будет знать, какие библиотеки Access подключаются к вашему приложению, как следует регистрировать приложения Access в Windows и многое другое....

[В начало]

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

Identifying Blocking Locks
Eli Leiba
This article describes how to identify an update (Blocking) Lock by scheduling a job to run every few minutes and checks if a blocking lock on an object is held from the previous execution of the job to the current job execution
Detect Anomalies in Excel Spreadsheets
Bogdan Crivat and Jamie MacLennan
Use SQL Server 2005 Data Mining inside Excel. Microsoft Excel becomes more and more versatile with each release and solves a wider variety of business needs. Its flexibility and programmability let you integrate different technologies to better understand and process the data in your spreadsheets. From its inception in SQL Server 2000, Microsoft's data mining solution has provided a programming model to access data mining technologies, which has expanded with SQL Server 2005. This article shows you how these two technologies can work together seamlessly
SQL Server 2005 Data Mining. Create a Web Cross-sell Application
Raman Iyer and Jesper Lind
The concept of cross-sell is familiar to most of us. What your friendly neighborhood McDonald’s salesperson does when you order a cheeseburger is exactly what Amazon.com or buy.com are doing online when you add items to your shopping cart and you get a list of other items you might also like
What’s New in SQL Server 2005 Data Mining
Zhaohui Tang
In SQL Server 2005, after several years R&D, the data mining offering is much richer. It has more features targeting the developer audience. Let’s have a closer look in this article, originally published by the the SQL Server Central Magazine. Data mining is a young and promising field. Data mining is about exploring data, discov-ering patterns and applying these patterns for future prediction. Throughout the past two decades, people have collected vast amounts of business data from daily operations. Com-panies have built data warehouses and OLAP cubes for reporting purposes. However, hav-ing a large dataset doesn’t mean having rich business knowledge. Many companies are in the situation of data rich and information poor. Data mining is the next step of business intelligence. It digs deeply inside the historical data to find valuable patterns, and apply those patterns to business operations
Numeric Datatype Decisions
Brian Knight
Last week we discussed character datatypes and their performance effects on your database. This week,we will dive into numeric datatypes. We will discuss how SQL Server numeric datatypes are stored and the pros and cons of each
SQL Server 2005 Hands-On Labs
SQL Server 2005 hands-on labs are available as part of the SQL Server 2005 Beta 2 Resource Kit DVD; they are not yet available for download. To get a copy of the resource kit, contact your local Microsoft representative
Mop the Floor and Fix the Leak, Part 2
Joe Celko
In part one of this article, we talked about how it is absurd to put all of the data integrity, verification, and validation rules in the front end application programs, so we would not have to bother with those constraints on the server side
Creating and Deploying a Smart Client with Plug-Ins
Eric Charran
Smart Clients exist as a type of application that combines the richness and full-featured functionality of a thick client application with the benefits and ease of management of a thin client application. Microsoft’s .NET framework provides the ability to craft applications as Windows forms projects and ensure that they enjoy the benefits of traditional Internet applications. In the past, much application development migrated from older Visual Basic 6.0 thick clients to Internet applications. Their ubiquitous access, ease of management and deployment without a significant client footprint provided a significant lure for quick and easy application development to disperse client bases and geographies
Using DBCC MEMORYSTATUS to Monitor SQL Server Memory Usage
Microsoft
The DBCC MEMORYSTATUS command provides a snapshot of the current memory status of SQL Server. The output from this command is useful in troubleshooting issues that relate to the memory consumption of SQL Server or to specific out-of-memory errors (many of which automatically print this output in the error log). Microsoft Product Support Services may also request that you run this command during the course of a specific support incident if you are encountering an error that may be associated with a low memory condition
Exchange from SQL Server
Steve Boriotti
Have you ever wanted to publish your organization’s SQL Server data in Exchange so that everyone with Outlook could access it? But perhaps you didn’t have the time or interest to learn how to use Microsoft messaging APIs. The following is an explanation of a suite of extended stored procedures you can use to create Outlook Contacts, Appointments, Tasks, and Journal Entries in Exchange Public Folders (or Outlook PSTs). These procedures can be added to the trigger of a SQL database table, thus easily liberating your enterprise’s SQL data to Outlook if your organization is using Exchange Server; updates made to a database table can be immediately displayed in an Exchange Public Folder. A free download is available for the extended stored procedures (enabled with basic functionality), along with sample scripts for implementing the table triggers and loading and unloading the extended stored procedures
Analysis About Analysis Services
Ramunas Balukonis
In this article I’ll demonstrate how one can learn more about the queries that are sent to analysis services
Microsoft Reporting Services in Action: Extending Microsoft SQL Server 2000 Reporting Services with Custom Code
Teodor Lachev
This article presents an excerpt from the book, Microsoft Reporting Services in Action, by Teodor Lachev. Learn how to implement advanced report functionality using custom code. (28 printed pages). Microsoft released Microsoft SQL Server 2000 Reporting Services (Reporting Services) in the beginning of 2004 to provide developers with a complete reporting platform, which can be easily integrated with all types of applications regardless of the targeted platform or development language. One of the most prominent features of Reporting Services, which many developers including myself will appreciate, is its extensible nature. Just about any aspect of Reporting Services can be extended or replaced, including data, delivery, security, and report rendering features. For example, one way you can extend the capabilities of your reports is to integrate them with custom .NET code that you or somebody else wrote
Maximum Capacity Specifications in SQL Server 2005
Steve Jones
Every version of SQL Server has usually grown itself physically, allowing more capacity, scalability, etc. in each version. With the announcement of Yukon, now known as SQL Server 2005, I was excited to think about not having to answer the 8060 question. You know, how do you store more than 8060 bytes in a row. Actually you can't store that much, but you get close
List of Database Users with Database Roles
Santveer Singh
Sometime we come across specific request from our managers or users that needs to explore system tables and database. Today I got the same kind of request from my manager. He needs a list of all database users with database roles. I looked here and there but I didn’t find any help in BOL to fulfill this request. Then I decided to create a procedure to generate this information in Pivot table format. This procedure capture the user name with list of all fixed database roles. I further modified this process to store this information in table with current date time stamp, So that in future it will help audit the changes in fixed database roles. Here is the detail
MDX Essentials: Logical Functions: The IsEmpty() Function
William Pearson
A logical function, ISEMPTY() returns true the expression to which it is applied evaluates to an empty cell. As we will see in the practice example we undertake in this article, ISEMPTY() works ideally with IIF(), a conditional function, to check cells for empty or not-empty status. We will consider elementary uses of the ISEMPTY() function in this article, and then call it into service in subsequent articles where we require it as a tool to perform just this sort of check. In keeping with the objectives of the MDX Essentials series, we will seek to build a foundation in the rudiments of the function, from which we can expand to more sophisticated uses in other articles. As a part of building our basis in the ISEMPTY() function, we will also take a preliminary look at the IIF() function, which we will take up in subsequent articles that we devote to it especially
Submitting A Stored Procedure Asynchronously
Gregory A. Larsen
Have you ever wondered if you could start the execution of a stored procedure (SP) asynchronously from some T-SQL code? What I mean is starting the SP in the background and continuing on with the next line of code in your T-SQL script without waiting for the execution of the SP to complete. If so, then this article might be of some interest to you. In this article I will discuss why you might want to run an SP asynchronously, how to submit an SP to run asynchronously, and lastly I have an example so you can test out running a stored procedure asynchronously
"sysperfinfo" in SQL Server
Muthusamy Anantha Kumar
The system table, "sysperfinfo," is the representation of the internal performance counters of SQL Server. This article demonstrates how to retrieve and store information from "sysperfinfo" to a CSV file, so that it can be analyzed
Monitor Blocking in SQL Server 2000 - Part II
Muthusamy Anantha Kumar
Part I of Monitor Blocking in SQL Server 2000 described how to get detailed information on blocking. Blocking is unavoidable in most types of applications. In this article, instead of collecting information every 5, 10 or 15 minutes, I am going to discuss how to collect detailed information about blocking when the blocking duration lasted more than a minute

[В начало]

ФОРУМ SQL.RU

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

Репликация мочит PK на подписчике!!!?
проблемы с созданием индекса на VIEW
Неправильный результат суммирующего запроса при активных транзакциях
DTS поменять SQL Statement в
SQL Server Health and History Tool (SQLH2) Reports
Запрос выполняется очень долго!!!
1 Update или много. Что эффективнее?
Высокоскоростной доступ к данным?
MSSQLServer. database
Регистрация и коннект к SQL Server не проходят
Есть курсор, как его сохранить в виде запроса?
Народ помогите с бякапом, плиз!!!
Что лучше несколько bit полей или одно int?
foregin key
Оптимизация производительности
OR-condition via SQL-condition?
Минимальные права на профайлер
Создание сдвоенных ключей(проблема)
Переустановка SQL Server
Помогите исправить Storedproc

[В начало]

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

Документация по MS SQL Server 2000?
Неперегонятся бд из Paradox7 в sql2000
Непонятная ошибка VSS 6004
DTS. Вызов хранимой процедуры на каждом шаге Transform Data Task
Удаление MergeAgent
replication conflict resolver
Executing Scripts Before and After the Snapshot ...
Нестандартный трабл с DTC под 2003. Проблемы связанные смотрел в форуме!Помогите плз...
Есть вопрос.... Local Package!
как отображать результат запроса через HTX
Кто нибудь пытался использовать "bcp" файлы созданные снапшот агентом?
Возвращаемое значение stored procrdure в dts
Как создать ServerHMLHTTP COM-обьект из Sql Agent Job ?
Время выполнения расчета

[В начало]

ПОЛЕЗНОСТИ

Профессиональное руководство по SQL Server: хранимые процедуры, XML, HTML (+CD)

Хендерсон К.

2004 год, ISBN: 5-469-00046-X, Формат: 17x24 см, Объем: 624 стр., Переплет: твердая обложка, Срок выхода: книга в типографии до 27.11.04, Цена: 660 руб, цена предварительная до выхода книги из типографии, возможны изменения.

Книга посвящена философии программирования в Transact-SQL. Она объясняет, как применять эту философию для создания собственных способов кодирования и решения повседневных проблем. В ней, помимо основной темы, — хранимых процедур, — раскрыто множество вспомогательных, среди которых XML, HTML, .NET. Причина этого проста: когда вы создаете реальное программное обеспечение, вам всегда приходится работать с несколькими технологиями. Эта книга признает данный факт, раскрывая многие сопутствующие технологии и рассматривая их с точки зрения разработки хранимых процедур для SQL Server. Книга рассчитана на разработчиков среднего и высокого уровня, которые хотят больше знать о работе с SQL Server.

[В начало]

Теория и практика построения баз данных 9-е изд.

Крёнке Д.

2004 год, ISBN: 5-94723-583-8, Формат: 17x24 см, Объем: 864 стр., Переплет: твердая обложка, Цена: 570 руб.

В книге Д. Крёнке, выдержавшей уже 9 переизданий, вы найдете традиционно подробный, методически выверенный теоретический и практический материал, посвященный вопросам разработки и использования баз данных. В новом издании более глубоко обсуждаются моделирование данных и проектирование баз данных; расширены разделы, по SQL и XML; добавлен раздел, знакомящий с ADO.NET. Книгу отличает большое количество примеров, моделирующих типичные ситуации из практики делового мира.

[В начало]

#221<<  #222

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

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

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



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


http://subscribe.ru/
http://subscribe.ru/feedback/
Подписан адрес:
Код этой рассылки: comp.soft.winsoft.sqlhelpyouself
Отписаться

В избранное