连接两个数据库中的表使查询变慢?分区数据库更好吗?

Fab*_*lva 10 join sql-server sql-server-2008-r2 partitioning

我有一个table1db1table2db2上的SQL Server 2008 R2。

如果我做一个选择查询加入两个表,得到结果真的很慢。

一个简单的查询,如

SELECT * 
FROM db1.dbo.table1 t1 
LEFT JOIN db2.dbo.table2 t2 ON t1.k1 = t2.k2
Run Code Online (Sandbox Code Playgroud)

有时真的很慢。

我不确定这是否对 SQL Server 很常见,并且“必须像规则一样”“不连接来自不同数据库的两个表”。

在那种情况下......我补充说这个问题,我有一个存储在一个字段上的数据库二进制数据,我喜欢与主数据库分开而不增加主表的大小......最好为此对数据库进行分区?

我用两个简单的表进行了测试,但加入这两个表仍然很慢。

在此先感谢您的帮助。

..几年后更新... 24-09-18

确保您加入的字段具有相同的类型、大小和排序规则。

示例:某些属性是 varchar(255) 和另一个 varchar(20) ......这可能是一个问题,因为引擎必须将一种类型转换为另一种类型(发生隐式转换),而有时它运行得更快......如果重新索引或数据库发生一些变化,你可以看到在某个时刻查询开始花费更多的时间来完成......

如果您无法更改字段类型以匹配其中一个 db/tables,请尝试执行显式转换以查看是否可以提高查询速度。用 cast(fieldname as type(size)) = fieldName2)

Bre*_*zar 23

你在这里有很多不同的问题,所以让我们单独把它们分开。

Q:如果我用上面的查询连接同一个数据库中的两个表,为什么会慢?

答:首先,您没有使用 WHERE 子句,因此 SQL Server 必须构建完整的结果集,将两个表合并在一起。如果您只需要数据的一个子集,请考虑使用 WHERE 子句来获取您需要的数据。

完成后,请注意您使用的是 LEFT OUTER JOIN。这告诉 SQL Server,“并非所有 table1 记录都会在 table2 中具有匹配记录。” 如果这是真的,那完全没问题 - 但如果您知道所有 t1 记录至少有一个 t2 记录,请改用 INNER JOIN。

接下来,索引开始发挥作用 - 根据表格的宽度和字段的数量,您可能希望在用于连接的字段上添加索引。要获得有关这方面的好建议,最好发布您正在使用的实际执行计划。

问:如果我的表在同一个 SQL Server 上的不同数据库中,这会改变什么吗?

答:不可以。围绕不同数据库中的默认隔离级别等问题存在一些有趣的问题,但在大多数情况下,您的查询应该产生相同的执行计划和速度。

问:我应该使用表分区来加快速度吗?

答:你提到了数据库分区,但在 SQL Server 中没有这样的东西 - 我猜你的意思是表分区。一般来说,不,我不会为了加快连接速度而跳到数据库设计更改。从基础开始 - 了解 SQL Server 执行计划 - 并且仅对数据库设计进行更改以解决您无法使用索引等内容修复的问题。

  • 另外,特别是如果您不需要所有列(并且至少连接列是多余的),[停止使用`SELECT *`](http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10 /10/bad-habits-to-kick-using-select-omitting-the-column-list.aspx)。 (11认同)