什么导致SQL数据库过载?

什么导致SQL数据库过载?,sql,sql-server,database,Sql,Sql Server,Database,数据库:SQL Server 我构建了一个在多台机器上运行的程序,并相当频繁地查询数据库。最近发生的事情是,来自该程序每个实例的查询导致数据库突然停止。如果不等待几秒钟,几乎不可能从数据库中查询任何内容 所以我试图更好地理解这个问题,并找出原因。我有几个问题: 如果我有一个读取查询,通常需要2秒钟才能运行,那么当我的程序有许多实例试图运行同一个查询时会发生什么?它们是同时在数据库上运行,还是一次只运行一个?如果一次运行一个查询,那么未运行的查询是否会排队并形成队列?我认为,如果这个队列能够累积到

数据库:SQL Server

我构建了一个在多台机器上运行的程序,并相当频繁地查询数据库。最近发生的事情是,来自该程序每个实例的查询导致数据库突然停止。如果不等待几秒钟,几乎不可能从数据库中查询任何内容

所以我试图更好地理解这个问题,并找出原因。我有几个问题:

  • 如果我有一个读取查询,通常需要2秒钟才能运行,那么当我的程序有许多实例试图运行同一个查询时会发生什么?它们是同时在数据库上运行,还是一次只运行一个?如果一次运行一个查询,那么未运行的查询是否会排队并形成队列?我认为,如果这个队列能够累积到某一点,就会导致数据库的运行速度大大降低

  • 什么通常会导致数据库变得异常缓慢?这可能是由具有多个联接查询的大型表(100000多行)引起的吗?或者,只有当某个地方有一个无限循环不断地试图执行查询时,这才有可能

  • 附录:我有一个查询,它对一个包含100000多行的表进行多个联接,该表在其where中使用一个子查询。比如说:

    var result = from a in db.TableNormal
        join b in db.TableHuge on a.id equals b.id
        where b.value = (db.TableOther.Select(z=>z.value).Max())
        select new {Normal = a};
    
    因此,基本上,每次运行其父查询时,子查询都要运行100000多次以上。如果在10台机器上每秒运行一次此查询,这是否足以显著降低SQL server的性能?(我对SQL server的容量有一个非常不完整的概念)

  • 它们将同时运行,即同时运行

  • 很多事情-通常是未优化的查询/数据库,没有正确的(或任何)索引。对于一个SQL数据库来说,100000行并不多,尽管许多连接也可能是一个问题。硬件问题可能是故障、内存/CPU不足、硬盘速度慢。设计问题-设计糟糕的模式(未规范化)、设计糟糕的查询等。。。等等等


  • 我建议您阅读一篇关于解决SQL Server性能问题的文章。

    根据我的经验,唯一让SQL Server陷入停顿的是错误的查询。它可能试图检索太多的数据或进行不正确的连接,但我要做的第一件事是非常仔细地查看您正在尝试做的事情,看看是否有更好的方法。

    有太多的事情,统计数据过时,死锁,硬件问题,一些大型进程的阻塞,写得不好的查询,糟糕的设计,缺乏索引。如果您有性能问题,您需要阅读一本关于性能调优的大书,实际上有数百种可能是错误的。如果您对良好数据库性能的基本原理不太熟悉,那么设计糟糕的数据库或设计糟糕的查询的概率接近100%


    相关子查询最终需要进行表扫描,并且随着行数的增加,速度会变慢。它们应该很少被使用。从本质上讲,您无法利用索引,实际上它就像查询中的一个小游标(游标在SQL Server中是一件非常糟糕的事情)。如果经常运行此查询,则肯定会使系统缓慢爬行。但是要真正了解它在做什么,你应该看一下执行计划。

    @Oded,所以如果它们同时运行,可能不是这个需要2秒钟的特定查询导致了这个问题?@Oded,你能扩展一下你所说的未优化数据库吗?如果知道这一点有帮助的话,那么数据库具有唯一的自动递增索引(这是正确的索引吗?@sooprise-一个需要2秒的查询,需要很长时间。至于未优化-请阅读链接文章。@HLGEM-您能解释一下您的评论吗?@sooprize-您所做的不仅仅是几个连接。您还正在进行逐行聚合计算。不管这些,我的答案仍然是。你能看到我的原始帖子的附录吗?你能看看我添加到原始帖子的附录吗?谢谢。SQL Server,我将把它添加到我的OP中。谢谢。你能给它添加真正的SQL而不是应用程序代码吗?我想看看datbase在查询时看到了什么,在我看来,where子句可能是问题所在。您应该调查这些表的索引,并确保所有有问题的列都有一个索引。我不太确定WHERE子句本身就是问题所在。看起来此应用程序代码的计算结果应该类似于从TableOther中选择最大值(z.value)。优化器应该能够看到它只需要对它进行一次评估,而不是每行评估一次。但我可能错了;我不熟悉应用程序代码的语法。我同意HLGEM——发布实际的SQL和执行计划。