Связь через сокеты в интеграции CLR

Хорошо ли работает связь через сокеты в CLR Integration.

Например: у меня есть PROC, созданный в CLR Integration. Он получает все данные из таблицы и просто хочет отправить данные на TCP-сервер.

Команда:

CREATE ASSEMBLY TcpClr FROM 'G:\TcpClrTest.dll' WITH PERMISSION_SET = EXTERNAL_ACCESS
GO

CREATE PROCEDURE SendDataToSrv
(
@NAME nvarchar(20)
)
AS EXTERNAL NAME 
TcpClr.[TcpClrTest.TcpSend].SqlProce;
GO

EXEC SendDataToSrv 'cdc.dbo_Test_CT'

Некоторый код в TcpClrTest.dll:

using (SqlCommand cmd = new SqlCommand("SELECT * FROM tableName", con))
{
     using (SqlDataReader reader = cmd.ExecuteReader())
     {
         while (reader.Read())
          {
              //string value = reader[0].ToString();
              //tcpClient.Write(value);
              //  ......get all data and send to tcp server.
          }
      }
}

У меня есть процедура с командой EXEC SendDataToSrv 'cdc.dbo_Test_CT', таблица имеет 100000 строк и 18 столбцов. Это будет стоить около 5 минут. Также я копирую тот же код в общую функцию, а не интеграцию с CLR, это стоит всего около 30 секунд. TCP-сервер и SQL Сервер работает на той же машине. Если я удалю код tcpClient.Write(value), просто получу данные из таблицы, это произойдет быстро.

В CLR Integration все, что я должен сделать, чтобы улучшить


person zhengkang    schedule 30.01.2015    source источник
comment
Зачем вам нужно отправлять данные изнутри SQL Server? Он поддерживается, но в 99% случаев это архитектурно плохая идея. Он хрупкий. Просто заставьте приложение отправлять данные.   -  person usr    schedule 30.01.2015
comment
Когда сервер запускается, он получает все данные с SQL Server и сохраняет их в памяти. Когда некоторые данные таблицы изменяются, например update, delete, insert., я должен получить сообщение об изменении и перезагрузить измененные данные в память. Итак Я выбираю CDC, чтобы получить сообщение DML, и интеграцию CLR, чтобы просмотреть таблицу CDC и отправить данные на сервер. Есть ли более лучший метод?   -  person zhengkang    schedule 02.02.2015
comment
В какой сервис вы отправляете данные? Почему эта служба не может читать из таблиц CDC, как она читает данные при запуске сервера? Если требуется какая-либо TCP-связь, она будет заключаться только в том, чтобы указать удаленной службе проверить наличие обновлений.   -  person Solomon Rutzky    schedule 02.02.2015
comment
@zhengkang Это откровенно глупо. Вместо этого используйте службу уведомлений о запросах. Используйте .net в качестве сервера приложений.   -  person Aron    schedule 02.02.2015
comment
Похоже, вы хотите сделать аннулирование кэша.   -  person Aron    schedule 02.02.2015
comment
@Aron Query Notification может сразу сообщить мне об операции DML, но не сообщает, какая строка была изменена.   -  person zhengkang    schedule 02.02.2015
comment
@zhengkang msdn.microsoft.com/en-us/library/bb933875.aspx Этого не было в вашем вопросе. В вашем вопросе было SELECT * FROM tableName.   -  person Aron    schedule 02.02.2015
comment
Однако дельта-слияние не является простым. Кроме того... откровенно говоря, если данные слишком велики для повторного запроса каждый раз, они слишком велики для помещения в кеш. Кроме того, подумайте о том, чтобы просто поместить соответствующие таблицы в память SQL-сервера, если у вас действительно есть проблемы с производительностью. Также я серьезно сомневаюсь, что то, что вы делаете, действительно улучшит производительность.   -  person Aron    schedule 02.02.2015
comment
@srutzky TCP-сервер, также сервер будет хранить данные в памяти. SQL Server отправляет данные на TCP-сервер, действительно не очень хорошая идея?   -  person zhengkang    schedule 02.02.2015
comment
Чего именно вы пытаетесь достичь? Почему вы хотите хранить эту информацию в памяти. Для чего он будет использоваться и как? Как вы объединяете обновления и удаления с текущими данными в памяти?   -  person Solomon Rutzky    schedule 02.02.2015
comment
@srutzky Поскольку у меня есть сервер центра обработки данных, он будет хранить данные в памяти, поэтому другое приложение, которое хочет получить данные из SQL Server, может получить из DC, DC, как Memory Database.   -  person zhengkang    schedule 02.02.2015
comment
О каком количестве данных мы говорим? Сколько столов? Сколько рядов в каждом? Как часто эти таблицы будут читаться? Мы говорим о миллионах прочтений? Вы уверены, что SQL Server не может справиться с такой нагрузкой? Мне интересно, если это преждевременная оптимизация.   -  person Solomon Rutzky    schedule 02.02.2015
comment
@srutzky ближе к делу. Вы уверены, что можете добиться большего успеха, чем команда Microsoft SQL Server, при создании базы данных в памяти. Это почти определенно преждевременная оптимизация (де-оптимизация, как представляется на самом деле), поскольку ясно, что вы даже не знаете, как работает SQL Server в страницах памяти. Вам нужно знать, как работает вся система (сзади наперед, наизнанку), прежде чем вы сможете ее оптимизировать.   -  person Aron    schedule 02.02.2015