【问题标题】:Performance of Multiple Joins多连接的性能
【发布时间】:2011-06-25 17:44:32
【问题描述】:
问候溢出者,
我需要查询具有许多/复杂空间条件的对象。
在转换为许多连接(可能 10+)的关系数据库中。
我是这个行业的新手,想知道是使用 MS SQL Server 2008 R2 或 Oracle 11g 还是使用 RavenDB 等基于文档的解决方案,还是干脆使用一些空间数据库 (GIS)...
有什么想法吗?
问候
更新:感谢大家的回答。有人会选择文档/空间数据库吗?我的数据库将包含数千万到数十亿条记录。主要是只读的。除非输入错误,否则几乎没有更新。隔夜插入并且不那么频繁。连接表是预先预测的,但自连接(表连接自身多次)的数量不是。此类查询的小页面结果将在高度交互的网站上查看,因此响应时间至关重要。关于这在 MS SQL Server 2008 R2 或 Oracle 11g 上如何执行的任何预测?我还担心通过添加更多服务器来提高性能,哪一个可以更好地扩展? Postgresql 怎么样?
【问题讨论】:
标签:
database
performance
join
spatial
【解决方案1】:
构建和测试。
这是了解您的想法是否可行的唯一方法。有免费版本的 Oracle、SQL Server 和 Teradata 可供下载。 PostgreSQL 是免费的,期间。
数据库设计帮助可能不是免费的。糟糕的设计对 SQL 性能的影响比任何其他单一原因都多。
我昨天做了一个测试(概念证明)(?? 几天在我的脑海中一起运行),对 20 个 5000 万行的表、自然键(没有 ID 号)、20 个左连接、40 毫秒的中值访问时间.使用具有慢速磁盘和 2 GB RAM 的商用台式计算机。
编辑:似乎还有一个free, single-server version of Greenplum,它只限制在两个 CPU 插槽上,对 CPU 内核没有限制。对数据库大小也没有限制。我觉得有必要玩几个 TB。
【解决方案2】:
MS SQL Server 2008 R2 和 ORACLE 11g 都应该能够毫无困难地处理这个问题。在可扩展性方面,我建议在 RAC 环境中使用 Oracle 11g。您也可以使用 MS SQL Server 2008 R2 进行 Microsoft 集群,但根据我的经验,Oracle 的 RAC 是一个更可靠的解决方案。
同时,您计划与数据库一起使用的应用程序也应该在决策中发挥作用。如果您将使用 MS SharePoint 或其他 MS 应用程序,那么 MS SQL Server 2008 R2 可能是更好的解决方案。
在 PostgreSQL 方面,我没有太多经验,但我从在企业环境和大型业务情况中使用过它的人那里听到了噩梦般的故事。据我所知,这并不完全是可扩展性友好的。就个人而言,如果您正在寻找开源解决方案,我认为 MySQL 将是比 PostgreSQL 更好的解决方案,但请记住,开源 sql 解决方案在可扩展性或高可用性环境方面并不是最简单的,如果这是您的终极目标目标。
【解决方案3】:
您的问题的一大未知数是 SQL 的动态性如何,对于类似的 SQL 语句,谓词中的值多久更改一次?他们是否使用绑定参数而不是内联值(他们应该尽可能)。如果有很多重用的机会,Oracle 会是我的选择。
不管 SQL 的复杂性如何,Oracle 都有一系列可以提供帮助的特性。在轻度老化的结果比实时结果可接受的情况下,物化视图和 SQL 重写可以提供巨大的性能优势。 11g 还附带结果集缓存。
一旦数据库选择了优化计划,重要的不是连接的数量,而是数据库针对这些特定连接的调整程度。索引、最新统计数据和具体化视图可能很重要。
【解决方案4】:
同意,问题不在于连接,而在于查询的数据量。虽然我承认在使用 MS SQL Server 2005、MS SQL Server 2008 R2 以及 ORACLE 10g 和 11g 的环境中工作,但在运行大型查询时,我们的 MS SQL 数据库似乎更容易出现死锁。
【解决方案5】:
在实际应用中,对一组表执行 10 次以上的连接比您想象的要普遍得多。获得如此高的内部连接和外部连接的后果是不同的,但我不会过度担心,除非您外部连接的数据量变得非常大。数据库针对处理集合进行了优化。
例子:
就在昨天,我编写了一个执行 13 个内部联接的查询。它在不到一秒的时间内对超过 50,000 条记录集执行。