在客户的生产环境中,我有一个奇怪的问题。 除了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设置相同?
您提到数据日志和文件系统在存储服务器上,它与什么连接? 光纤通道,10/100 / 1GB? SCSI? 除了光纤通道以外的任何东西都会变慢!
存储服务器专用于数据库服务器吗? 你在争取资源吗?
根据所使用的虚拟化技术的不同,虚拟服务器的性能可能会更差,特别是在磁盘I / O方面。 在虚拟机上,磁盘访问可能由模拟或驱动程序层处理,将虚拟磁盘上的命令转换为物理磁盘上的命令。 这种仿真通常会带来显着的额外延迟,并且可能无法正确利用底层磁盘arrays。