Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 用线程优化ASP.NETMVC6_Sql_Asp.net Mvc_Performance_Optimization_Threadpool - Fatal编程技术网

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
?您真正的问题是如何执行分层查询?这已经得到了回答,不需要客户端线程。过多的连接对性能有害。这就是为什么我在考虑其他方法。是的,我主要使用你的第三种选择。但今天我决定考虑是否可以进一步加速。感谢