我们有一个写入量很大的 SQL 数据库(SQL Server 2008),一段时间后插入速度会降低。我阅读了这些类似的问题:Sql insert speed up,SQL:如果不是 CPU 或 IO,什么会降低插入速度?和加速插入。
此外,我阅读了这篇关于如何分析 SQL Server 性能的文章,这有助于我了解如何找到瓶颈(例如,通过查询sys.dm_exec_requests和sys.dm_os_wait_stats),但我仍然难以解释查询结果和解决问题。
首先,我开始查询sys.dm_exec_requests只返回一个状态为“正在运行”的会话 ID(选择查询)(即,我发现没有暂停会话)。那么,如果没有任何东西阻止我的插入,为什么它会变慢?
接下来,我曾经sys.dm_os_wait_stats检查有关所有等待类型的统计信息。结果显示LATCH_EX、CXPACKET和PAGEIOLATCH_SH的wait_time最长(分别为 694379 ms、310364 ms 和 308335 ms)。
然后我曾经sys.dm_os_latch_stats找到最流行的闩锁类型,在我的情况下是ACCESS_METHODS_DATASET_PARENT.
sys.dm_exec_requests。sys.dm_os_wait_stats应该将多少等待时间(in )视为高?如果上述数字(sys.dm_os_wait_stats 的结果)很高,我该如何减少它们?ACCESS_METHODS_DATASET_PARENT与并行性有关,我发现的解决方案之一是降低并行度。那正确吗?我有一个 SQLite DB,其中只有一个大小约 1.5 MB 的表(实际上,总共有约 30 个表,但每个表都存储在一个单独的 .db 文件中)。
当我EXPLAIN QUERY PLAN用于任何表时,它显示全表扫描,据我所知这是不好的。但是,没有一个表有索引,而且选择查询的速度很快。
所以,我想知道我是应该在我们的表上添加一些索引还是保持它们原样?(现在,表最多有 5k 行,将来它们最多可能有 100k 行)。
附注。选择和插入的数量几乎相同..
所有的想法都受到高度赞赏。