как быстро проверить протокол связи, используемый SQL Server

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

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

SELECT
   (CASE WHEN ([is_modified] = 1) THEN 'Dirty' ELSE 'Clean' END) AS 'Page State',
   (CASE WHEN ([database_id] = 32767) THEN 'Resource Database' ELSE DB_NAME (database_id) END) AS 'Database Name',
   COUNT (*) AS 'Page Count'
FROM sys.dm_os_buffer_descriptors
   GROUP BY [database_id], [is_modified]
   ORDER BY [database_id], [is_modified];
GO

Я объясняю это немного больше в этом сообщении в блоге В Механизме устройства хранения данных: что находится в пуле буферов?

Вы могли также контроль КБ 907877 (Как использовать команду DBCC MEMORYSTATUS для использования памяти монитора на SQL Server 2005), который даст Вам общее представление о разбивке остальной части использования памяти SQL Server (но не для каждой базы данных).

Надеюсь, это поможет!

1
задан 22 October 2009 в 10:13
2 ответа

Если у Вас есть SPID рассматриваемого процесса (от использования чего-то как Монитор Действия или sp_who или sp_who2), затем можно выполнить этот запрос на сервере:

SELECT * 
FROM sys.dm_exec_connections 
WHERE session_id = (SPID);

замена (SPID) с фактическим SPID клиентского процесса. Посмотрите на net_transport столбец, который скажет Вам, какой протокол, который процесс использует для общения с SQL Server. Если все, чем Вы интересуетесь, является протоколом, просто используйте SELECT net_transport вместо SELECT *.

Вы могли также отфильтровать свой запрос другими столбцами, такими как client_net_address, который, для соединений TCP, будет IP-адресом Вашей клиентской машины. Вы могли отправить этот запрос через интерфейсы ADO.NET. SQL SMO мог бы также иметь что-то.

Вот ссылочная страница MSDN для sys.dm_exec_connections. Обратите внимание, что Вы должны будете ПРОСМОТРЕТЬ права СОСТОЯНИЯ СЕРВЕРА на сервере для наблюдения больше, чем просто текущая сессия.

Можно также указать транспортный протокол в server директива Вашей строки подключения с помощью следующего синтаксиса:

server=[protocol]:servername

Примеры:

server=tcp:mysqlinstance1 (for TCP/IP)
server=np:mysqlinstance1 (for named pipes)
server=np:\\mysqlinstance1\pipe\pipename (for a specific pipe)
5
ответ дан 3 December 2019 в 16:59
  • 1
    Спасибо! Как получить SPID текущего соединения? Мог я получил его от клиента ADO.NET или с сервера? –  George2 22 October 2009 в 14:48
  • 2
    Я попытался выполнить ВЫБОР * ОТ sys.dm_exec_connections, он имеет net_transport столбец, но из ссылки MSDN, кажется, что нет такого описанного столбца? Запутанный. Какие-либо комментарии? –  George2 22 October 2009 в 14:50
  • 3
    Мое плохое, я связался с sys.dm_exec_sessions случайно. Я исправил ссылку для указания на правильную страницу. –  squillman 22 October 2009 в 16:22
  • 4
    Вы даже, возможно, не должны были бы получать SPID. I' ve отредактировал мой ответ с некоторой другой информацией. –  squillman 22 October 2009 в 18:16
  • 5
    Спасибо squillman, мой вопрос и реальный сценарий от стороны клиента ADO.NET, в строке подключения клиент ADO.NET использует, нет никакой информации о протоколе. Так, в этом сценарии я должен знать, как соответствовать session_id или SPID (от строк в ВЫБОРЕ * ОТ sys.dm_exec_connections) к определенному клиентскому приложению ADO.NET. Какие-либо идеи, как соответствовать session_id к определенному клиентскому приложению ADO.NET? –  George2 23 October 2009 в 07:55

Как примечание стороны: TCP/IP или именованные каналы являются протоколом транспортного уровня, и поток табличных данных является коммуникацией (прикладной уровень) протокол в SQL Server.

http://en.wikipedia.org/wiki/Tabular_Data_Stream

1
ответ дан 3 December 2019 в 16:59
  • 1
    Не то, чтобы это отвечает на Ваш вопрос, но как разъяснение. –  joeqwerty 22 October 2009 в 15:08
  • 2
    Я прошу протокол транспортного уровня, более подробно, 4 типа протоколов связи, совместно использованной памяти / именованного IP/через канала/TCP, я хочу знать для определенного соединения, какой протокол используется. Какие-либо идеи или комментарии? –  George2 22 October 2009 в 15:18
  • 3
    Я просто выполнил запрос squillman отправленный на моем сервере SQL 2008, и сетевой транспортный столбец определенно там. Вы на самом деле попробовали запрос на своем сервере? –  joeqwerty 22 October 2009 в 15:43
  • 4
    Как примечание стороны, общая память не является communication\network протоколом, таким образом, Вы никогда не будете видеть, что любые нелокальные клиенты (сетевые клиенты) соединяются с SQL через общую память. –  joeqwerty 23 October 2009 в 04:38
  • 5
    Да, я попробовал. И я хочу узнать больше о функции и значении о net_transport столбце. Есть ли какое-либо описание (документ) о значении столбца net_transport? Я не нашел такую информацию из MSDN. –  George2 23 October 2009 в 07:56

Теги

Похожие вопросы