我目前想知道VARCHAR/NVARCHAR上的一些性能差异,特别是在使用复杂LIKE查询(以_或%开头)时.
我在Microsoft SQL Server 2014上有一个testsetup.我有2个表.两者都有一个ID字段(标识(1,1)和一个值字段(VARCHAR(450)或NVARCHAR(450)).两者都有相同的1'000'000随机生成的条目.
这些表名为tblVarCharNoIndex和tblNVarCharNoIndex(因此,没有索引.如果我使用索引,行为几乎相同).
现在,我执行以下查询测试持续时间(一次在VARCHAR上;一次在NVARCHAR上)
SELECT * FROM tblVarcharNoIndex WHERE Value LIKE '%ab%'
SELECT * FROM tblNVarcharNoIndex WHERE Value LIKE '%ab%'
Run Code Online (Sandbox Code Playgroud)
执行时间大不相同.在VARCHAR表上需要1540ms,在NVARCHAR表上需要8630 ms,因此使用NVARCHAR需要花费超过5倍的时间.
据我所知,NVARCHAR具有性能影响,因为它需要2个字节来存储,这完全有意义.但我无法解释性能下降500%,这对我来说毫无意义.
根据请求,这里有更多的数据.
查询表创建
CREATE TABLE [dbo].[tblVarcharNoIndex](
[Id] [int] IDENTITY(1,1) NOT NULL,
[Value] [varchar](450) NOT NULL,
CONSTRAINT [PK_tblVarcharNoIndex] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
CREATE TABLE [dbo].[tblNVarcharNoIndex](
[Id] [int] IDENTITY(1,1) NOT NULL,
[Value] [nvarchar](450) NOT …Run Code Online (Sandbox Code Playgroud) 我很高兴为BroadcastCopyBlockTPL 数据流中的以下实现提供一些输入,该实现将收到的消息复制到所有消费者,该消息已注册BroadcastCopyBlock并保证交付给所有消费者,这些消费者在收到消息时链接到块. (与BroadcastBlock不保证消息传递的不同,如果下一个进来,则在前一个消息已传递给所有消费者之前)。
我主要关心的是消息的保留和保留的释放。如果接收块决定不处理消息,会发生什么?我的理解是,这会造成内存泄漏,因为消息将被无限期保留。我在想,我应该以某种方式将消息标记为未使用,但我不确定如何。我正在考虑一些人工消息接收器(ActionBlock没有任何操作),或者我可以将消息标记为已丢弃?
对实施的进一步投入也受到赞赏。
这可能几乎是以下问题的重复,但我更愿意使用我自己的类,而不是创建块的方法。或者这会被认为是不好的风格吗?
在 TPL 数据流中具有保证交付的 BroadcastBlock
/// <summary>
/// Broadcasts the same message to multiple consumers. This does NOT clone the message, all consumers receive an identical message
/// </summary>
/// <typeparam name="T"></typeparam>
public class BrodcastCopyBlock<T> : IPropagatorBlock<T, T>
{
private ITargetBlock<T> In { get; }
/// <summary>
/// Holds a TransformBlock for each target, that subscribed to this block
/// </summary>
private readonly IDictionary<ITargetBlock<T>, TransformBlock<T, T>> _OutBlocks …Run Code Online (Sandbox Code Playgroud)