代码之家  ›  专栏  ›  技术社区  ›  Feryt

SQL设计:大表,线程访问序列化

  •  0
  • Feryt  · 技术社区  · 15 年前

    我有一张大桌子(90K排,尺寸为CCA 60MB),上面有大约50家酒店的免费客房容量信息。这个表每小时只有很少的更新/插入。 我的应用程序以每秒最多30次的速度向这个(和联接的表)发送异步请求。

    当我一次启动30个线程(默认的AppPool类位于.NET 3.5 c)时(使用随机有效的SQL查询字符串),只有少数(CCA4)被异步处理,其他线程等待处理。为什么? 是因为SQL Server 2008表锁定还是因为.NET核心?或者别的什么?

    如果这是一个SQL问题,如果我将这个大表拆分为每个酒店模型的一个表,会有帮助吗? 我的目标是一次至少有10个线程servet。

    4 回复  |  直到 15 年前
        1
  •  3
  •   MarkR    15 年前

    这张桌子很小。它甚至不符合“中型”桌子的条件。这是微不足道的。

    您可以将整个表扫描30次/秒,您可以在RAM中复制整个内容,任何服务器都不会有丝毫的麻烦。

    如果您的数据适合RAM,那么数据库就很快。如果你找不到这个,你就大错特错了。因此,我也认为问题都在客户方面。

        2
  •  0
  •   Donnie    15 年前

    它更可能出现在.NET端。如果是表锁定,则将处理更多线程,但它们将等待其查询返回。如果我没记错的话,有一个线程池的属性可以控制它们一次创建多少实际线程。如果挂起的线程数超过了该数目,那么它们将排队等待运行的线程完成。检查一下。

        3
  •  0
  •   Kev Hunter    15 年前

    您是否尝试更改事务隔离级别?

    即使从表中读取,SQL Server也会锁定表

    尝试将隔离级别设置为“未提交”,并查看这是否改善了情况,

    但请注意,阅读“脏”数据是可行的,如果这是解决方案,请确保了解其后果。

    这个链接解释了它是什么。

    link text

        4
  •  0
  •   Remus Rusanu    15 年前

    与其问,不如量。应用程序实际提交的每个SQL查询都将在服务器上创建一个请求,并且 sys.dm_exec_requests DMV显示每个请求的状态。当请求被阻止时,“等待类型”列显示一个非空值。你可以根据这个判断你的请求是否被阻止。如果他们被阻止,你也会知道他们被阻止的原因。