什么原因导致SQL数据库重载?

时间:2011-04-27 19:18:40

标签: sql sql-server database

数据库:SQL-Server

我构建了一个在多台计算机上运行并且相当频繁地查询数据库的程序。最近发生的事情是来自这个程序的每个实例的查询导致数据库嘎然而止。几乎不可能在不等待很多秒的情况下从数据库中查询任何内容。

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

  1. 如果我的读取查询通常需要2秒才能运行,那么当我的程序有很多实例尝试运行同一个查询时会发生什么?它们都是一次在数据库上运行,还是一次只运行一个?如果它们一次运行一个,那么执行未运行的查询是否排队并形成队列?我认为如果这个队列可以积累到某一点,它将导致数据库减速大的时间。

  2. 什么通常会导致数据库变得非常慢?这可能是由具有多个连接查询的大型表(100,000多行)引起的吗?或者只有在某个地方不断尝试执行查询时才会出现无限循环。

  3. 附录:我有一个查询,它对具有100,000多行的表进行多次连接,在其中使用子查询。所以像这样:

    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};
    

    所以基本上,子查询每次运行父查询时都会运行100,000次以上。如果此查询在10台计算机上运行第二次,这是否足以显着降低SQL服务器的性能? (我对SQL服务器的容量有一个非常不完整的概念)。

3 个答案:

答案 0 :(得分:5)

有很多东西,统计数据已过时,死锁,硬件问题,某些大型进程阻塞,查询写得不好,设计不佳,缺乏索引。如果你遇到性能问题,你需要阅读一本关于性能调优的大书,有数百种可能是错误的东西。如果您不熟悉良好数据库性能的基本原则,那么您设计的数据库设计不佳或查询设计不佳的可能性接近100%。

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

答案 1 :(得分:4)

  1. 它们将同时运行,即立即运行。

  2. 很多东西 - 通常是未经优化的查询/数据库,没有正确的(或任何)索引。 SQL数据库的100,000行并不多,但许多联接也可能是个问题。硬件问题可能是故障,内存/ CPU不够,硬盘速度慢。设计问题 - 设计糟糕的架构(未规范化),设计糟糕的查询等......等......

  3. 我建议您阅读有关解决SQL Server中的性能问题的this two part文章。

答案 2 :(得分:1)

根据我的经验,研究SQL服务器停止运行的唯一方法就是查询错误。它可能试图检索太多数据或进行不正确的连接,但我要做的第一件事就是仔细查看你想要做什么,看看是否有更好的方法。