我在 Rackspace 上托管了一台服务器,它是一台非常强大的机器(双十六核,48 GB RAM),我们的数据库并不是那么大(100GB 左右)。SQL Server 2008 R2 标准 64 位。
正常情况下,这台机器运行完美。几乎不占用任何 CPU 核心,查询响应时间很棒,等等。
但是,我可以通过运行查询“SELECT * FROM RawLead WHERE emailAddress = '[电子邮件保护]' ; " 编辑:不,emailAddress 没有被索引。是的,我知道这会对这个特定的查询有帮助,但原来的问题仍然存在 —— 1 个查询如何能让整个服务器停止运行。
当我执行此操作时,SQL Server 将停止响应任何其他查询,直到返回此结果集。
我刚刚尝试过这个,从资源监视器磁盘活动发生变化的屏幕截图中可以看到,CPU 并没有真正发生变化,但网络流量基本降至零。
SQL Server 中是否有会影响这一点的设置?
答案1
听起来像是预期的行为。如果有人真的使用了这种非常糟糕的查询,我希望他们至少有基本的礼貌将其与“WITH (NOLOCK)”结合起来,这与指定“未提交读”隔离级别相同。
答案2
如果这是一张大表,并且没有索引,那么您将进行表扫描。此外,如果优化器认为查询的成本足够高,您可能会看到并行执行。在表扫描和并行执行之间,是的,您可能会使 CPU 激增。然后您可能会遇到阻塞、资源争用、多个用户,一切都会变得更糟。