SQL Server在生产环境中速度慢

在客户的生产环境中,我有一个奇怪的问题。 除了SQL服务器在虚拟服务器上运行之外,我不能在基础结构上提供任何细节。 数据,日志和文件stream文件位于另一个存储服务器上(数据和文件stream一起login到一个单独的服务器上)。

在我们的本地testing环境中,有一个执行这些持续时间的特定查询:

  • 首先我们清除caching
  • 300ms(第一次需要更长的时间,但从此开始caching。)
  • 20ms的
  • 15毫秒
  • 17MS

在客户的生产环境中,SQL Serverfunction更强大,这是持续时间(我没有权限清除caching,明天就试试)。

  • 在2500ms
  • 2600ms
  • 2400ms

客户的生产环境中的服务器function更强大,但他们确实有虚拟服务器(我们不这样做)。

可能是什么原因…

  • 内存不足?
  • 不成?
  • 物理存储?

你将如何解决这个性能问题?

编辑:

有人问我数据集是否相等。 我在我们的环境中恢复他们的数据库 的确,这是我所看到的第一件事情。 (@Everyone:我添加了编辑,因为这将是许多人会想到的第一件事)。

原因可能是内存,碎片,物理存储空间不足,以及对并行度,争用,不同的表大小,不同的统计信息,不同的SQL补丁级别等等的不同设置。

所以真的不是什么问题的问题,而是如何确定什么是错的。 我通常的build议,基本上不是以我的经验为基础,而是使用等待和排队方法 。 这是一个相当方法的方法,最终将确定罪魁祸首,并与此,你会有解决scheme。

它可能是内存,CPU,networking或磁盘争用,但客户的数据集是否更大?

你的第一步是在查询本身上得到一个执行计划,以确保它不扫描行。 你应该首先优化查询,因为你已经说过他们的数据库服务器很强大。 SQL Server查询分析器是最好的工具。

即使使用与系统相同的数据,他们也可能生成不同的查询计划(如果统计数据过期)。 我会运行EXEC sp_updatestats ,看看是否EXEC sp_updatestats

我们曾经有一个这样做的服务器。 显然,有人将数据库文件放在RAID 3arrays上…不是一个好主意!

当然,它可以是任何东西,但确保你检查什么是磁盘configuration。

这可能是任何这些事情。 它也可能是一个缓慢的networking(或在networking上的问题),因为它听起来像你正在使用某种types的SAN(s)。

客户环境与testing环境的数据规模是否相同? 这是很多开发人员犯的一个错误,在一组数据上testing性能,这些数据不能模拟生产中数据的规模。

如果您有权访问Profiler和PerfMon,则可以很快缩小问题的范围。

推荐的debugging方法是检查SQL Server 性能计数器 (开始/运行/ perfmon.exe)。 需要一点时间来了解您的案例中哪些与您的案例相关,但这绝对是值得的,并有助于精确地确定这类问题。

以下是一些对我来说很好的快速链接, Google知道更多:

生产服务器是否与您的testing设置相同?

  1. 他们在数据库服务器上运行其他的东西吗?
  2. 在服务器上运行的任何病毒防护
  3. Windows Defender运行?
  4. 一些其他进程占用系统

您提到数据日志和文件系统在存储服务器上,它与什么连接? 光纤通道,10/100 / 1GB? SCSI? 除了光纤通道以外的任何东西都会变慢!

存储服务器专用于数据库服务器吗? 你在争取资源吗?

根据所使用的虚拟化技术的不同,虚拟服务器的性能可能会更差,特别是在磁盘I / O方面。 在虚拟机上,磁盘访问可能由模拟或驱动程序层处理,将虚拟磁盘上的命令转换为物理磁盘上的命令。 这种仿真通常会带来显着的额外延迟,并且可能无法正确利用底层磁盘arrays。