小编cra*_*ank的帖子

与VARCHAR(450)相比,复杂LIKE查询速度非常慢NVARCHAR(450)

我目前想知道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)

sql sql-server performance

13
推荐指数
1
解决办法
1049
查看次数

用于 TPL 数据流的 BroadcastCopyBlock 保证交付

我很高兴为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)

c# broadcast task-parallel-library tpl-dataflow

4
推荐指数
1
解决办法
1134
查看次数