C# 并行执行查询会导致更多时间[SQL Server]

C# 并行执行查询会导致更多时间[SQL Server],c#,sql,sql-server,performance,parallel.foreach,C#,Sql,Sql Server,Performance,Parallel.foreach,我有一个查询,当我使用SSMS(2017)并通过控制台应用程序执行它时,会导致4-5秒的时间 但是,当我在控制台应用程序中对每个使用parallel运行同一查询三次时,结果是15-20秒 我所期望的是,为什么我不能在并行运行时得到相同的结果呢 见下文,我已使用探查器进行了检查。查询同时启动 但是看看完成的时间 这是我的代码: int count = 3; Stopwatch watch = new Stopwatch(); watch.Start();

我有一个查询,当我使用SSMS(2017)并通过控制台应用程序执行它时,会导致4-5秒的时间

但是,当我在控制台应用程序中对每个使用parallel运行同一查询三次时,结果是15-20秒

我所期望的是,为什么我不能在并行运行时得到相同的结果呢

见下文,我已使用探查器进行了检查。查询同时启动

但是看看完成的时间

这是我的代码:

int count = 3;
        Stopwatch watch = new Stopwatch();
        watch.Start();

        Parallel.For(0, count, (index) =>
        {
                string queryString = "SELECT COUNT(*) AS [Row Count]  FROM (SELECT SUM([dbo_MaximumData].[C1]) AS [Grid_Column_0],[dbo_MaximumData].[C3] AS [Grid_Column_2],[dbo_MaximumData].[C5] AS [Grid_Column_3],[dbo_MaximumData].[C6] AS [Grid_Column_4],[dbo_MaximumData].[C6] AS [Grid_Column_1] FROM [dbo].[MaximumData] AS [dbo_MaximumData] GROUP BY [dbo_MaximumData].[C3],[dbo_MaximumData].[C5],[dbo_MaximumData].[C6],[dbo_MaximumData].[C6] ) [Main Table] ";
            string connectionString = "Server=””;Database=ODBC ANSI;User Id=sa;Password=Test@123;";
            using (SqlConnection connection = new SqlConnection(connectionString))
            {
                SqlCommand command = new SqlCommand(queryString, connection);
                connection.Open();


                SqlDataReader reader = command.ExecuteReader();
                try
                {
                    while (reader.Read())
                    {

                    }
                }
                finally
                {
                    reader.Close();
                    connection.Close();
                }
            }
});

        watch.Stop();
        var str = watch.Elapsed;
我的问题是“为什么并行查询执行会导致更多时间”


任何人,请帮我做这个。提前感谢。

并行处理背后的思想是在系统/核心/等之间分配cpu/内存/任何资源负载

您在这里所做的是运行相同的查询
count
次。这将对数据库造成负担,并将导致您等待执行同一查询的
count
实例


请注意,这个答案实际上与数据库本身没有什么关系-如果您尝试在并行程序中执行任何非分布式算法,也会是一样的。

SQL Server已经知道如何使用并行程序运行查询。更可能的情况是,您只是要求相同的处理器做三倍的工作,只会导致(大约)三倍的执行时间。尝试将
选项(MAXDOP 1)
添加到查询中,以强制仅使用一个处理器,并查看这是否会改变任何内容。数据库服务器上有多少个内核?@jeroenmoster:这会导致比以前更多的时间。现在我得到了25-27秒,当然它增加了时间——我的重点是将一个实例的运行时间与
MAXDOP(1)
的三个实例的运行时间进行比较。假设您的服务器有三个或更多内核,您应该会发现加速比是线性的。如果不是,那么您将面临不同的问题(阻止其他查询)。这里的要点是SQL Server已经在尽可能快地运行您的查询--它不能同时运行三个副本。假设您的查询使用一个核心执行实际上需要20秒。SQL Server作为它的好朋友,通过(粗略地)将表分为4个部分并进行计数,很有帮助地决定使用所有4个核心来加速查询。现在您的查询只需5秒钟,SQL Server非常自豪。但现在你来了,让它同时做三次。问题——突然间没有12个内核可用,但仍然只有4个。因此,您的三个查询现在需要5*3=15秒(实际上更多是由于线程开销)。你想要更快的速度,你需要更多的CPU。嗨@george:谢谢你的时间。你的意思是我必须对我的数据库进行一些配置才能快速得到结果吗?如果是的话,你能以这种方式分享吗?不太可能。您应该在并行的外部执行查询。我真的不知道C#是否有一些函数可以在parallel for中使用,并且会自动为您并行化,但sql查询肯定不是这种类型的。