【问题标题】:Executing query in parallel cause more time [SQL Server]并行执行查询会导致更多时间 [SQL Server]
【发布时间】:2018-10-15 11:09:42
【问题描述】:

当我使用 SSMS(2017) 和控制台应用程序执行它时,我有一个查询会导致 4 到 5 秒。

但是,当我在控制台应用程序中使用 parallel for each 三次运行相同的查询时,会导致 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;

我的问题是“为什么并行查询执行会导致更多时间”?

任何人,请帮我解决这个问题。提前致谢。

【问题讨论】:

  • SQL Server 已经知道如何利用并行性运行查询。更有可能的是,您只是要求相同的处理器执行三倍的工作,从而导致(大约)三倍的执行时间。尝试将OPTION (MAXDOP 1) 添加到您的查询中以强制仅使用一个处理器,看看是否会改变任何东西。
  • 数据库服务器有多少个核心?
  • @JeroenMostert:它导致比以前更多的时间。现在我得到 25 - 27 秒
  • 是的,当然它会增加时间——我的意思是比较一个MAXDOP(1) 实例的运行时间与三个MAXDOP(1) 实例的运行时间。假设您的服务器具有三个或更多内核,您应该会发现加速是线性的。如果它不是不是,那么您将面临不同的问题(阻止其他查询)。这里的重点是 SQL Server 已经尽最大努力尽可能快地运行您的查询——它不能同时运行它的三个副本。
  • 假设您的查询实际上需要 20 秒才能使用一个内核执行。 SQL Server 是它的好朋友,它有助于决定使用所有 4 个内核来加快查询速度,方法是(大致)将表分成 4 个部分并计算它。现在你的查询只需要 5 秒,SQL Server 相当自豪。但是现在你来了,并要求它并行执行 3 次。问题 - 突然没有 12 个内核可用,但仍然只有 4 个。所以你的三个查询现在需要 5 * 3 = 15 秒(实际上更多是由于线程开销)。您想要更快的速度,就需要更多的 CPU。

标签: c# sql sql-server performance parallel.foreach


【解决方案1】:

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

您在这里所做的是运行相同的查询count 次。这会给数据库带来负担,并且会导致您等到同一查询的count 实例被执行。

请注意,这个答案实际上与数据库本身几乎没有关系 - 如果您尝试在 parallel-for 中执行任何 非分布式 算法,那将是相同的。

【讨论】:

  • 嗨@george:感谢您的宝贵时间。你的意思是我必须对我的数据库进行一些配置才能快速得到结果?如果是的话,你能分享一下吗?
  • 并非如此。您应该只在 parallel-for 之外执行查询。我真的不知道 C# 是否有一些函数可以在 parallel-for 中使用并且会自动为你并行化,但是 sql 查询肯定不是那种。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-27
相关资源
最近更新 更多