Sql server 在多个表上使用内部联接优化查询性能-MS SQL Server

Sql server 在多个表上使用内部联接优化查询性能-MS SQL Server,sql-server,query-optimization,Sql Server,Query Optimization,我正在研究如何提高查询性能。表结构及查询如下: 共有5个表格: 基本(Id,第1列)主群集索引位于(Id) (Id,第1列,第2列,上次更新日期)上的(Id,上次更新日期)复合主聚集索引 B(Id,第1列,第2列,上次更新日期)上的复合主聚集索引(Id,上次更新日期) C(Id,第1列,第2列,上次更新日期)上的复合主聚集索引(Id,上次更新日期) D(Id,第1列,第2列,上次更新日期)上的复合主聚集索引(Id,上次更新日期) E(Id,第1列,第2列,上次更新日期)上的复合主聚集索引(Id,

我正在研究如何提高查询性能。表结构及查询如下:

共有5个表格:

基本(Id,第1列)主群集索引位于(Id) (Id,第1列,第2列,上次更新日期)上的(Id,上次更新日期)复合主聚集索引

B(Id,第1列,第2列,上次更新日期)上的复合主聚集索引(Id,上次更新日期)

C(Id,第1列,第2列,上次更新日期)上的复合主聚集索引(Id,上次更新日期)

D(Id,第1列,第2列,上次更新日期)上的复合主聚集索引(Id,上次更新日期)

E(Id,第1列,第2列,上次更新日期)上的复合主聚集索引(Id,上次更新日期)

基表中的行数为50k,其余表中的行数为800k

我正在尝试优化的查询:


select * from Base base

inner join A a on a.Id = base.id and a.last_updated_date between '2000-01-01' and '2015-12-31'

inner join B b on b.Id = base.id and b.last_updated_date = a.last_updated_date

inner join C c on c.Id = base.id and c.last_updated_date = a.last_updated_date

inner join D d on d.Id = base.id and d.last_updated_date = a.last_updated_date

inner join E e on e.Id = base.id and e.last_updated_date = a.last_updated_date
简言之,上面的查询正在从基表中Id的所有表中检索所有可用信息

通过查看计划,我观察到如下情况:

  • 在这5张表中,表C和表D的成本各为40%左右。表E的成本为0%

  • 对于表C和D,优化器选择合并联接,而对于另一个,优化器选择嵌套循环联接

  • 对于表C和D,执行索引扫描,而对于其他表,执行索引查找

  • 我试图强制所有的嵌套循环联接。所以优化器为所有对象选择嵌套循环联接。在这种情况下,对于某些表,即使是索引seek也会占用40%的成本,而某些表的成本为0%。 执行时间没有改善

  • 我的问题是:

  • 尽管所有表都具有相同的索引结构,但为什么有些表的成本更高

  • 关于如何提高查询性能有什么建议吗

  • 我想把你的问题转到WHERE条款。这是更常见的情况,我看到查询优化器在将其作为连接的一部分时出现阻塞

    从基础中选择* A.Id=base.i上的内部连接A B.Id=base.Id和B.last_updated_date=a.last_updated_date上的内部联接B 内部连接C.Id=base.Id和C.last\u updated\u date=a.last\u updated\u date D.Id=base.Id和D.last\u updated\u date=a.last\u updated\u date上的内部联接D E.Id=base.Id和E.last_updated_date=a.last_updated_date上的内部连接E 其中a.上次更新日期为“2000-01-01”和“2015-12-31”

  • ID是数字类型列吗?查找数字比查找字符串快得多

  • 确保所有ID列和last_update_date列都有索引


  • 我有过这样的情况。由于过时的统计数据,我的表现很差。您可以做的是,更新所有表的表统计信息或使用哈希联接

    尝试了这种方法,但在执行时间、逻辑读取或物理读取方面没有任何改进。其中2个表有30多列,只有这些表承担了大部分成本。