【问题标题】:Avoid sql join for a specific table row避免对特定表行进行 sql 连接
【发布时间】:2018-06-19 07:05:11
【问题描述】:

在我的 asp.net mvc 应用程序中, 我有一个名为“首选项”的表,该表将始终只有一行用于应用程序首选项(同样,该表不能包含多于一行)。

当我想查询任何其他表时,我总是使用 Preference 表进行左连接,例如,如果我想返回所有客户。我必须与 Preference 表进行左连接以检查是否需要返回客户全名,或者检查是否需要返回活跃客户等。

如您所知,左连接有性能成本,尤其是当我需要在每个查询中使用它时;那么,有没有其他方法可以让我一次性接受这些偏好? (例如,当应用程序启动时)并且不要使用左连接;虽然我需要能够在每次在数据库中更新这些首选项时更新它们(从应用程序的控制面板)。

我需要一个在性能方面没有任何成本的解决方案,所以我不太推荐会话解决方案。

你有什么建议?

【问题讨论】:

  • 不用担心左连接的性能成本。
  • 为什么?我知道它只在性能表中加入一行,但我主要对大多数表(客户、订单、发票......)进行连接
  • 所以我认为最好避免左加入,但是会话可以提供更好的性能。

标签: c# sql asp.net asp.net-mvc asp.net-core


【解决方案1】:

您可以使用具有 get 和 set 两种方法的单例类。 每次更改首选项时调用设置。 并依赖于值形式的 get 方法构建您的查询(无论是否活跃,全名与否)。

【讨论】:

  • @simply-ged 不,因为我对许多数据库使用相同的网络应用程序,换句话说,每个客户都有一个与他的数据库连接的子域,通过使用单例所有用户将共享同一个对象这是不正确的。
【解决方案2】:

只需执行 INNER JOIN - 在大多数情况下它具有更好的性能。如果您确定首选项恰好有 1 行,您甚至可以进行笛卡尔或交叉连接(无连接条件)。

【讨论】:

    【解决方案3】:

    有很多方法可以解决这个问题。

    一种方法是:

    在应用程序启动时,从数据库加载行并缓存它。每次需要从中获取值时,从缓存中检索它。

    现在,让我们假设通过您的管理面板更改了应用程序设置。保存它们后,清除该缓存值并从数据库中重新加载它。 基本上没有理由继续加入您的数据库。

    【讨论】:

    • 很好,但是所有客户都使用相同的 Web 应用程序但使用不同的数据库,而每个客户都有一个引用他的数据库的子域,但 Web 应用程序是一个,所以这里也许我需要缓存在内存还是用户客户端?
    • 请您详细说明一下
    【解决方案4】:

    一种选择是创建一个单例服务,该服务在启动时加载表,并用于在更新时存储任何值(通过您的控制面板)。您可以将该服务注入到任何需要访问数据的控制器中,并且控制器不需要访问数据库,因为该服务会将数据保存在内存中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-22
      相关资源
      最近更新 更多