如何加快简单加入

Joh*_*dol 12 sql-server performance join

我不擅长SQL.

我正在寻找一种方法来加速像这样的简单连接:

SELECT
    E.expressionID,
    A.attributeName,
    A.attributeValue
FROM 
    attributes A
JOIN
    expressions E
ON 
    E.attributeId = A.attributeId
Run Code Online (Sandbox Code Playgroud)

我这样做了几十万次,随着桌子越来越大,它越来越多.

我正在考虑索引 - 如果我要加快单个表上的选择,我可能会在表达式上为表达式表放置非聚簇索引,而另一个用于属性表的(attributeName,attributeValue) - 但我不知道这是怎么回事可以申请加入.

编辑:表达式表上的expressionId(PK),attributeId(PK,FK)上已有聚簇索引,属性表上的attributeId(PK)上有另一个聚簇索引

我已经看到了这个问题,但我要求更通用的东西,可能更简单.

任何帮助赞赏!

Jer*_*eid 18

你肯定希望attributeIDattributesexpressions表上都有索引.如果您目前没有这些索引,我认为您会看到一个很大的加速.

  • 不要忘记两列应该具有相同的数据类型,如果它们是字符数据,则应该具有相同的排序规则. (5认同)
  • 不一定两个表都需要索引。以这种方式盲目添加索引实际上是不好的形式。您需要确保您的数据库统计信息是最新的,并查看表大小如何叠加。更可能的是,优化器无论如何都会对基表进行全表扫描(因为没有 WHERE 子句),因此基表上 AttributeId 的索引只是浪费空间。 (2认同)

Pet*_*nge 6

实际上,因为返回的列很少,所以我会考虑这个查询的覆盖索引

即包含查询中所有字段的索引.

  • 我认为Goblyn建议在A.attributeId,A.attributeName,A.attributeValue和E.attributeId和E.expressionID上添加另一个索引...但我不是100%肯定.这个理论认为,查询的所有数据都将直接来自索引而且永远不会出现在表中. (2认同)