我有一个像这样的简单动作方法:
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协议是罪魁祸首.
我有以下查询
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) 我有这样的模特

具有以下表格大小:
+------------------+-------------+
| 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 BY和LIMIT子句时,需要19.5秒.在执行查询之前,已在所有表上运行ANALYZE.
对于此特定查询,这些是满足条件的记录数:
+------------------+-------------+
| Table …Run Code Online (Sandbox Code Playgroud) 我在 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 属性中剥离毫秒。
我正在使用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,它ContractResolver是null.
为什么会这样?