【问题标题】:How to figure the read/write ratio in Sql Server?如何计算 Sql Server 中的读/写比率?
【发布时间】:2011-02-16 05:13:43
【问题描述】:

如何查询Sql Server 2005的读写比率?有什么我应该注意的警告吗?

也许可以在 DMV 查询、标准报告、自定义报告(即性能仪表板)或检查 Sql Profiler 跟踪中找到它。我不确定。

我为什么要关心?

我正在花时间改进我的网络应用数据层的性能。它处理数百万条记录和数以千计的用户。

我正在研究的要点之一是数据库并发性。默认情况下,Sql Server 使用悲观并发——适合写入繁重的应用程序。如果我的应用程序读取量很大,我可能会将其切换为乐观并发(隔离级别:read committed snapshot),例如Jeff Atwood did with StackOverflow

【问题讨论】:

    标签: sql-server sql-server-2005 isolation-level read-committed-snapshot optimistic-concurrency


    【解决方案1】:

    所有应用都是重度只读的。

    • UPDATE 是对 WHERE 子句的读取,然后是写入
    • INSERT 必须检查唯一索引和 FK,它们是读取内容以及您索引 FK 列的原因

    最多你有 15% 的写入。曾经看到一篇文章讨论过,但是找不到了。更有可能是 1%。

    我知道,在我们每天 600 万个新行的数据库中,我们仍然有至少 95% 以上的读取(当然是估计值)。

    为什么你需要知道?

    还有:How to find out SQL Server table’s read/write statistics?

    编辑,根据问题更新...

    我会保留数据库并发,直到您需要更改它。对于我们的 600 万行 + 大量读取,我们没有进行任何开箱即用的更改

    为了调整我们的网络应用程序,我们将其设计为减少往返次数(一次调用 = 一次操作、每次调用多个记录集等)

    【讨论】:

    • 感谢您的信息。好东西。简洁的。我更新了我的问题以解释我为什么关心这个比率。
    【解决方案2】:

    查看sys.dm_db_index_usage_stats:

    • 搜索、扫描、查找都是读取
    • 更新是写入

    请记住,每次服务器重新启动时都会重置计数器,您只需要在运行代表性负载后查看它们。

    还有一些性能计数器可以帮助您:

    从这些速率中,您可以很好地估计请求的读写比率。

    更新后

    打开版本存储可能是处理并发的最佳途径。我建议不要显式使用快照隔离,而是打开已提交的读取快照:

    alter database <dbname> set allow_snapshot_isolation on;
    alter database <dbname> set read_committed_snapshot on;
    

    这将使已提交读取(即默认读取)改为使用快照,因此它实际上不需要在应用程序中进行任何更改并且可以快速测试。

    您还应该调查您的读取是否没有在序列化读取隔离级别下执行,当使用 TransactionScope 时没有明确指定隔离级别时会发生这种情况。

    请注意,版本存储并非完全免费。见Row Versioning Resource Usage。你应该阅读SQL Server 2005 Row Versioning-Based Transaction Isolation

    【讨论】:

    • 请问读写比 = sum(seeks, scans, lookups) / sum(updates)?
    • 在谈到 SQL 负载时,我不知道“读/写比率”的正式定义。许多人使用该术语,但定义并不明确。就个人而言,我宁愿使用类似的东西(写事务/批处理请求)。使用索引统计信息会使比率更偏向于夸大读取,因为单个只读操作(例如,一个 SELECT 语句)通常会导致多次查找/扫描/查找,而写入操作通常会导致很少更新,通常只有一个。
    • 好的,我来看看这些统计数据。这是我找到的good set of queries,来自Pro Sql Server 2005 Database Design and Optimization的作者。
    • 另外一个不错的读写比率候选:sys.dm_exec_query_stats msdn.microsoft.com/en-us/library/ms189741.aspx:total_logical_reads/total_logical_writes
    • 为什么需要allow_snapshot_isolation?在你发布之前,我只考虑read_committed_snapshot
    【解决方案3】:

    如何在sys.dm_io_virtual_file_stats 中找到num_of_writesnum_of_reads 计数器的比率?

    【讨论】:

      【解决方案4】:

      我是使用 SQL Server Profiler 完成的。我只是在运行应用程序之前打开它并测试了我在应用程序中执行某些操作时执行了哪些类型的查询。但我认为最好只是确保查询正常工作,不知道这样测量服务器工作量是否方便。 Profiler 还可以保存跟踪,以便您以后分析,因此它可能会起作用。

      【讨论】:

      • 你的回答很模糊。您是否在跟踪中求和(读取)/求和(写入)以获得比率?这是重要的信息。如果它很重,您可以为此优化 SQL Server。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-01-30
      • 1970-01-01
      • 2021-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-19
      相关资源
      最近更新 更多