我从外部源(通过Lightstreamer)接收(流式传输)数据到我的C#应用程序.我的C#应用程序从侦听器接收数据.来自侦听器的数据存储在队列(ConcurrentQueue)中.使用TryDequeue将队列每0.5秒清理一次到DataTable中.然后使用SqlBulkCopy将DataTable复制到SQL数据库中.SQL数据库将从临时表到达的新数据处理到最终表中.我目前每天收到大约300'000行(可以在接下来的几周内强烈增加),我的目标是从收到数据之前保持不到1秒,直到它们在最终的SQL表中可用.目前,我必须处理的每秒最大行数约为50行.
不幸的是,由于接收到越来越多的数据,我的逻辑性能变得越来越慢(仍然远远低于1秒,但我想继续改进).主要瓶颈(到目前为止)是将登台数据(在SQL数据库上)处理到最终表中.为了提高性能,我想将登台表切换到内存优化表.最终表已经是一个内存优化表,因此它们可以很好地协同工作.
我的问题:
编辑(带解决方案):
在评论/答案和性能评估之后,我决定放弃批量插入并使用SQLCommand将IEnumerable与我的数据作为表值参数切换到本机编译的存储过程,以将数据直接存储在我的内存优化的最终表中(以及复制到"staging"表,现在用作存档).性能显着提高(即使我没有考虑并行插入插件(将在稍后阶段)).
以下是代码的一部分:
内存优化的用户定义表类型(将数据从C#切换到SQL(存储过程):
CREATE TYPE [Staging].[CityIndexIntradayLivePrices] AS TABLE(
[CityIndexInstrumentID] [int] NOT NULL,
[CityIndexTimeStamp] [bigint] NOT NULL,
[BidPrice] [numeric](18, 8) NOT NULL,
[AskPrice] [numeric](18, 8) NOT NULL,
INDEX [IndexCityIndexIntradayLivePrices] NONCLUSTERED
(
[CityIndexInstrumentID] ASC,
[CityIndexTimeStamp] ASC,
[BidPrice] ASC,
[AskPrice] ASC
)
)
WITH ( MEMORY_OPTIMIZED = ON )
Run Code Online (Sandbox Code Playgroud)
本机编译的存储过程,用于将数据插入到最终表和暂存(在本例中用作存档):
create procedure [Staging].[spProcessCityIndexIntradayLivePricesStaging]
(
@ProcessingID int,
@CityIndexIntradayLivePrices Staging.CityIndexIntradayLivePrices readonly
)
with native_compilation, schemabinding, execute as owner
as
begin atomic
with (transaction isolation level=snapshot, language=N'us_english')
-- store prices …Run Code Online (Sandbox Code Playgroud)