小编two*_*wer的帖子

将单字节添加到响应时,ASP.NET WebAPI输出会慢40倍

我有一个像这样的简单动作方法:

public class TestApiController : ApiController
{
    [Route("api/string"), HttpGet]
    public string GetString(int length)
    {
         return new string('x', length);
    }
}
Run Code Online (Sandbox Code Playgroud)

响应时间(由Fiddler观察):

GET /api/string?length=1186
  0.008
  0.007
  0.007
  ...

GET /api/string?length=1187
  0.208
  0.212
  0.205
  ...
Run Code Online (Sandbox Code Playgroud)

也就是说,通过向响应添加单个字节,处理时间增加了40倍.

这种行为绝对一致,我在Visual Studio的Web服务器和IIS 8.5中都观察到它(但是,特定的响应大小阈值略有不同).

为什么它会像这样?


编辑:在我的情况下,ESET NOD32防病毒检查HTTP协议是罪魁祸首.

asp.net iis asp.net-web-api

16
推荐指数
1
解决办法
206
查看次数

PostgreSQL:LIMIT越低,查询越慢

我有以下查询

SELECT translation.id
FROM "TRANSLATION" translation
   INNER JOIN "UNIT" unit
     ON translation.fk_id_unit = unit.id
   INNER JOIN "DOCUMENT" document
     ON unit.fk_id_document = document.id
WHERE document.fk_id_job = 3665
ORDER BY translation.id asc
LIMIT 50
Run Code Online (Sandbox Code Playgroud)

它运行了可怕的110秒.

表格大小:

+----------------+-------------+
| Table          | Records     |
+----------------+-------------+
| TRANSLATION    |  6,906,679  |
| UNIT           |  6,906,679  |
| DOCUMENT       |     42,321  |
+----------------+-------------+
Run Code Online (Sandbox Code Playgroud)

但是,当我将LIMIT参数从50 更改为1000时,查询将在2秒内完成.

这是慢速查询计划

Limit (cost=0.00..146071.52 rows=50 width=8) (actual time=111916.180..111917.626 rows=50 loops=1)
  ->  Nested Loop (cost=0.00..50748166.14 rows=17371 width=8) …
Run Code Online (Sandbox Code Playgroud)

sql postgresql query-optimization sql-execution-plan

8
推荐指数
1
解决办法
833
查看次数

PostgreSQL:非常慢的ORDER BY,主键作为排序键

我有这样的模特

在此输入图像描述

具有以下表格大小:

+------------------+-------------+
| Table            |    Records  |
+------------------+-------------+
| JOB              |         8k  |
| DOCUMENT         |       150k  |
| TRANSLATION_UNIT |      14,5m  |
| TRANSLATION      |      18,3m  |
+------------------+-------------+
Run Code Online (Sandbox Code Playgroud)

现在进行以下查询

select translation.id
from "TRANSLATION" translation
   inner join "TRANSLATION_UNIT" unit
     on translation.fk_id_translation_unit = unit.id
   inner join "DOCUMENT" document
     on unit.fk_id_document = document.id     
where document.fk_id_job = 11698
order by translation.id asc
limit 50 offset 0
Run Code Online (Sandbox Code Playgroud)

完成大约需要90秒.当我删除ORDER BYLIMIT子句时,需要19.5秒.在执行查询之前,已在所有表上运行ANALYZE.

对于此特定查询,这些是满足条件的记录数:

+------------------+-------------+
| Table …
Run Code Online (Sandbox Code Playgroud)

sql postgresql postgresql-performance

7
推荐指数
1
解决办法
1665
查看次数

PostgreSQL 没有正确排序时间戳列

我在 PostgreSQL 数据库中有一个表,其中有一列类型TIMESTAMP WITHOUT TIME ZONE。我需要按此列对记录进行排序,显然 PostgreSQL 在执行此操作时遇到了一些麻烦

...ORDER BY time_column
Run Code Online (Sandbox Code Playgroud)

...ORDER BY time_column DESC
Run Code Online (Sandbox Code Playgroud)

为具有相同值的 3 元素记录样本提供相同的元素顺序time_column,但其中的毫秒数除外。

似乎在排序时,它不考虑值中的毫秒。

我确信毫秒实际上存储在数据库中,因为当我获取记录时,我可以在我的DateTime字段中看到它们。

当我首先加载所有记录,然后按time_column内存排序时,结果是正确的。

我是否缺少一些使排序行为正确的选项?

编辑:我显然错过了很多。问题不在 PostgreSQL 中,而是在 NHibernate 中从 DateTime 属性中剥离毫秒。

postgresql

5
推荐指数
1
解决办法
1万
查看次数

即使使用默认设置,Json.NET也会将枚举序列化为字符串

我正在使用Json.NET 7.0.1.

文件说,

Enum [序列化为] Integer(可以是StringEnumConverter的枚举值名称)

在我的Global.asax.cs中,我指定默认设置如下:

JsonConvert.DefaultSettings = (() =>
{
    var settings = new JsonSerializerSettings();
    settings.Converters.Add(new StringEnumConverter());
    return settings;
});
Run Code Online (Sandbox Code Playgroud)

但是,在某些情况下,我希望Enums将其序列化为整数,例如,当我构建要存储在数据库中的JSON时.

我是这样做的:

public class JsonSerializedType<T> : IUserType where T : class
{
    private static readonly JsonSerializerSettings serializerSettings = new JsonSerializerSettings();

    public void NullSafeSet(IDbCommand cmd, object value, int index)
    {
        cmd.Parameters[index].Value = JsonConvert.SerializeObject(value as T, serializerSettings);
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,即使在这种情况下Enums也被序列化为字符串.我检查serializerSettings过没有Converters,它ContractResolvernull.

为什么会这样?

c# json json.net

5
推荐指数
1
解决办法
3674
查看次数