2015-03-31 55 views
1

我有一个包含“模块”的大型应用程序,如FinanceHRSalesCustomer Service存储过程的位置是否影响其性能?

为了使应用程序易于管理并分配负载,我决定在每台服务器上为每个模块提供自己的数据库。还会有一个用于存储主要信息的数据库,例如有关用户的信息,一些全局查询表和一些安全性内容。

我现在正在尝试决定是否将模块特定的存储过程放置在其相应的数据库中,还是将它们全部保存在Master数据库中。例如,存在名为dbo.sales_customer_orders的存储过程,该存储过程仅从Sales数据库表中选择数据。当然这个SP将会被用户执行很多次。因此,它应该在Sales数据库中,还是在性能/可伸缩性/可靠性/安全性方面保留在Master数据库中可以。

存储过程驻留在与其选择的数据库不同的数据库中吗?

+0

在将它们放入不同的数据库之前,您是否考虑过每个模块的独立模式? – 2015-03-31 22:10:38

+0

是的,我认为是一个单独的模式,但它意味着在1个数据库中的所有模块。它是一个多租户应用程序,所以我不能冒险为每个人和每个人都拥有一个单一的数据库。随着更多用户添加到系统中,它会崩溃,所以我决定按应用程序区域(即模块)“垂直分区”。这里有更多的信息(看看方法5)\t http://blog.techcello.com/2012/07/database-sharding-scaling-data-in-a-multi-tenant-environment/ – 2015-03-31 22:12:52

回答

1

根据我的经验,通过在多个数据库之间分割数据,您不会经历立即的性能损失,而这在大型n层应用程序中实际上是一种常见做法。将数据库移至不同服务器时,您显然会遇到一些轻微的处罚。

您可以在网站上看到这个blog post以及其他几个关于正确分片数据的方法,以及使用多个连接字符串进行读取和写入的重要性,以便稍后进行扩展和可能的缓存层。

+0

那会更好吗?该模块数据库中每个模块的SP。因为如果数据库要移动服务器,每个数据库中的SP不需要更新以包含新的服务器名称。他们仍然可以引用自己的数据库名称。例如。它始终是'select * from [sales]。[dbo]。[orders]'即使服务器发生变化 – 2015-04-01 11:39:12

1

您是如何计划开发所有这些数据库的?如果你想使用SSDT,你会被所有这些跨数据库依赖关系淹没。此外,如果某个特定客户决定不购买销售模块(并且周围没有销售数据库),那么您的有问题的程序位于数据库head中是没有意义的。在这种情况下,调用它会导致一些非常不愉快的和意想不到的后果,例如批处理被中止以及(可能)事务处于打开状态。

保持类似的东西在一起;否则,你的方法将没有模块化。

性能方面,通常在同一个SQL Server实例内的跨数据库调用没有区别。但是,如果您的碎片位于不同的实例上,结果可能介于“稍微明显”到“有害”之间的任何地方 - 它取决于许多因素,并非所有这些因素都可以通过DBA缓解。

+0

感谢Roger的意见。SP将位于“head”数据库中,但对于那些没有“Sales”模块的人来说,它的访问将被拒绝。我认为给予人们运行SP的权限比在数据库级别更好地处理应用程序级别。 'head'数据库只存储组织和人员拥有的权限。 – 2015-04-01 11:32:24