Sql 用线程优化ASP.NETMVC6
寻找关于使用线程的建议 我有一个控制器,它可以在数据库中查询并转换列表中选定的数据。但在某些情况下,我需要几行的额外信息。我不希望每行都有新的查询。 若我将启动新线程,它将与主循环并行执行额外的查询,并向列表中添加额外的信息。是好是坏。或者最好在之前获取所有数据 样本:Sql 用线程优化ASP.NETMVC6,sql,asp.net-mvc,performance,optimization,threadpool,Sql,Asp.net Mvc,Performance,Optimization,Threadpool,寻找关于使用线程的建议 我有一个控制器,它可以在数据库中查询并转换列表中选定的数据。但在某些情况下,我需要几行的额外信息。我不希望每行都有新的查询。 若我将启动新线程,它将与主循环并行执行额外的查询,并向列表中添加额外的信息。是好是坏。或者最好在之前获取所有数据 样本: [HttpPost] public async Task<IActionResult> ReestrRazr(DateTime date) { List<Some
[HttpPost]
public async Task<IActionResult> ReestrRazr(DateTime date)
{
List<SomeClass> arr = new List<SomeClass>();
string query = " SELECT [table].[id], [table].[snumber], [table].[datein], [table].[datefileeate], [table].[istatusU], [table].[datezamechania], [table].[type], [table].[isubtypeU], ";
query += " [tableT3040].[content] as [address], [tableT3040].[nazvanie] as [objNazvanie], ";
query += " [tableT101].[nazvanie] as zastrName, ";
query += " [adress].[rajon], ";
query += " [objT3].[idcomlinknypredstavitelpurpose] as [nadzor] ";
query += " FROM ((((((((([table] ";
query += " JOIN [link] on (([table].[id]=[link].[idlinkper]) and ([link].[ideletestate]=0)) ) ";
query += " JOIN [file] on (([file].[id]=[link].[idlink]) and ([file].[sfileextension] like ('%pdf%')) and ([file].[ideletestate]=0)) ) ";
query += " JOIN [obj] ON ([table].[identity]=[obj].[id] AND [obj].[ideletestate]=0) ) ";
query += " LEFT JOIN [objT] as [objT3] on (([objT3].[identity]=[obj].[id]) and ([objT3].[type]=3) and ([objT3].[ideletestate]=0)) )";
query += " LEFT JOIN [adress] ON (([obj].[idaddress]=[adress].[id]) and ([adress].[ideletestate]=0) and ([adress].[workstate]=1)) ) ";
query += " LEFT JOIN [objT] as [objT119] on (([objT119].[identity]=[obj].[id]) and ([objT119].[type]=119) and ([objT119].[ideletestate]=0) and ([objT119].[idcomlinknypredstavitelpurpose] = 1)) )";
query += " LEFT JOIN [tableT] as [tableT3040] on (([table].[id]=[tableT3040].[idlinkper]) and ([tableT3040].[type]=3040) and ([tableT3040].[ideletestate]=0)) ) ";
query += " LEFT JOIN [tableT] as [tableT101] on (([table].[id]=[tableT101].[idlinkper]) and ([tableT101].[type]=101) and ([tableT101].[nazvanie] <> '') and ([tableT101].[nazvanie] is not null) and ([tableT101].[ideletestate]=0)) )";
query += " left join [ae] on (([table].[idcomlinkny]=[ae].[id]) and ([ae].[ideletestate]=0)) ) ";
DataTable dt = Execute4Table(query + $" where date >'{date.tostring("yyyyMMdd")}'")
foreach (DataRow row in dt.Rows)
{
int id = Convert.ToInteger(row[0]);
int type = Convert.ToInteger(row[1]);
string number= Convert.ToString(row[2]);
SomeClass sc = new SomeClass();
sc.id=id;
sc.number = number;
if (type==50)
{
number = Convert.ToString(ExecuteScalar("select number from table WHERE idparent="+ id.tostring()));
}
arr.Add(sc);
}
}
[HttpPost]
公共异步任务ReestrRazr(日期时间日期)
{
List arr=新列表();
string query=“选择[表].[id],[表].[snumber],[表].[datein],[表].[datefileeate],[表].[istatusU],[表].[datezamechania],[表].[type],[表].[isubtypeU],”;
查询+=“[tableT3040].[content]作为[address],[tableT3040].[nazvanie]作为[objNazvanie],”;
查询+=“[tableT101]。[nazvanie]作为zastrName,”;
查询+=“[adress].[rajon],”;
查询+=“[objT3].[IDCOMLINKNYPREDSTAVITELPURSE]作为[nadzor]”;
查询+=“来自((((((((([table])”;
query+=“在([table].[id]=[link].[idlinkper])和([link].[ideletestate]=0))上加入[link]”;
query+=“在(([file].[id]=[link].[idlink])和([file].[sfileextension]like(“%pdf%”)和([file].[ideletestate]=0))上加入[file]”;
query+=“在([table].[identity]=[obj].[id]和[obj].[ideletestate]=0)上加入[obj]”;
query+=“将[objT]作为[objT3]左连接到([objT3].[identity]=[obj].[id])和([objT3].[type]=3)以及([objT3].[ideletestate]=0))”;
query+=“在([obj].[idaddress]=[Address].[id])和([Address].[ideletestate]=0)和([Address].[workstate]=1))上左连接[Address]”;
query+=“在([objT119].[identity]=[obj].[id])和([objT119].[type]=119)和([objT119].[ideletestate]=0)和([objT119].[idcomlinknypredstavitelpurpose]=1))上将[objT119]作为[objT119]左连接”;
query+=“在([table].[id]=[tableT3040].[idlinkper])和([tableT3040].[type]=3040)和([tableT3040].[ideletestate]=0])上以[tableT3040]的形式左键联接[tableT];
query+=“在([table].[id]=[tableT101].[idlinkper])和([tableT101].[type]=101)和([tableT101].[nazvanie]'')和([tableT101].[nazvanie]不为空)和([tableT101].[ideletestate]=0])上以[tableT101]的形式左键联接[tableT];
query+=“在([table].[idcomlinkny]=[ae].[id])和([ae].[ideletestate]=0))上左连接[ae]”;
DataTable dt=Execute4Table(查询+$“其中日期>'{date.tostring(“yyyyMMdd”)}')
foreach(数据行中的数据行)
{
int id=Convert.ToInteger(第[0]行);
int type=Convert.ToInteger(第[1]行);
字符串编号=Convert.ToString(第[2]行);
SomeClass sc=新的SomeClass();
sc.id=id;
sc.number=编号;
如果(类型==50)
{
number=Convert.ToString(ExecuteScalar(“从idparent=“+id.ToString())所在的表中选择数字);
}
arr.Add(sc);
}
}
谢谢!(我的英语是sry)
P.S.Real query有8个连接,获得所有必要的信息将导致连接数量增加到12-13。这对性能不利。您将无法从相同的DbContext(请求范围)运行并行查询。我会对一个查询执行
left-outer-join
,该查询将为您提供所需的所有数据,为其他行设置空值,或者允许客户端对这些行发出额外请求,request/row。尽管我会坚持第一个想法,只要结果不会证明这些“额外”导致查询的基本版本急剧减速。3ed选项是只等待主查询,从内存结果中收集所选ID,然后使用中的进行第二次查询,处理稍后在内存中分配的值。这绝对不需要线程。学习SQL,也许只需要一个连接。您首先想做什么?如果您想从另一个表中检索相关的条目,您所要做的只是一个连接。在这种情况下,什么是idparent
?您真正的问题是如何执行分层查询?这已经得到了回答,不需要客户端线程。过多的连接对性能有害。这就是为什么我在考虑其他方法。是的,我主要使用你的第三种选择。但今天我决定考虑是否可以进一步加速。感谢