3
如何提示SQL Server中的多对多联接?
我有3个“大”表,它们连接在一对列(均为int)上。 Table1拥有约2亿行 Table2拥有约150万行 Table3拥有约600万行 每个表都有一个聚集索引Key1,Key2以及再得一列。Key1具有低基数并且非常偏斜。WHERE子句中始终引用它。条款中Key2从未提及WHERE。每个联接都是多对多的。 问题在于基数估计。每个连接的输出估计值变小而不是变大。当实际结果达到数百万时,最终得出的结果估计只有几百个。 我有什么办法让行政长官提示做出更好的估计? SELECT 1 FROM Table1 t1 JOIN Table2 t2 ON t1.Key1 = t2.Key1 AND t1.Key2 = t2.Key2 JOIN Table3 t3 ON t1.Key1 = t3.Key1 AND t1.Key2 = t3.Key2 WHERE t1.Key1 = 1; 我尝试过的解决方案: 在创建多列统计Key1,Key2 创建大量已过滤的统计信息Key1(这很有帮助,但是我最终在数据库中获得了数千个用户创建的统计信息。) 掩盖的执行计划(抱歉掩盖不好) 就我而言,结果有900万行。新的CE估计有180行;旧版CE估计有6100行。 这是一个可重现的示例: DROP TABLE IF EXISTS #Table1, #Table2, …