2016-09-20 95 views
-1

我有一个查询:SQL查询性能

SELECT c.somecolumn,p.someothercolumn 
FROM table1 co 
INNER JOIN table2 p(NOLOCK) ON co.COLUMN = p.COLUMN 
INNER JOIN table3 c(NOLOCK) ON co.column11 = c.column11 
WHERE co.filterColumn = 1 

表2是结合表和表1和表2之间的连接是没有不同值的列(那是必要条件,不能改变),因此存在交叉连接。

此查询的输出结果为1.8亿条记录。

记录数:

table 1: 2 190 561 
table 2: 568 277 
table 3: 300 150 

如何优化上面的查询?执行计划: enter image description here

+2

可以将执行计划显示为xml,涉及的表的模式和记录数 – TheGameiswar

+0

需要更多的信息来帮助 – Hiten004

+0

也包括你正在使用哪个dbms 2008,2012,2014? – Monah

回答

0

请确保您至少在包含要返回的列的联接中的列上有索引(例如,在表2中,您应该有一个非聚集索引,该索引在“ p.COLUMN“,并包含”p.someothercolumn“,对于表3,键入c.column11并包含c.somecolumn,你应该在table1.filtercolumn上有一个索引 考虑一下,你必须返回1.8亿行到请尝试将数据插入一次性表格中,以保持网络加载时间超出您的等式。

+0

嗨保罗,我有非聚集索引filtercolumn p.column和p.someothercolumn – sree

+0

考虑更新统计信息。如果你相信执行计划(而且我经常不这样做),那么时间就是收集来自多个进程的数据。有时候,这种情况发生在作业分解成多个任务时,一个调度器(CPU)获得绝大多数工作。其余的cpus很快完成,但坐下来等待一个过程完成。再次,不可能但可能。执行计划更可能不会告诉你痛苦在哪里。另一个选择是从连接中删除一个表,看看你是否有巨大的性能差异。 – paulbarbin

+0

是的,我试图删除表中的一个,它显示出巨大的差异。但是,由于这是一种连接table1,junctiontable和table3的方式,我不能跳过其中一个 – sree

0

这些可能是理想情况下需要的索引:

  1. 对于表1 - 索引上COLUMN包括someothercolumn
  2. 对于表3 - - 其中co.filterColumn = 1
  3. 对于表2上COLUMN和column11筛选索引上column11索引包括somecolumn
0

SELECT c.somecolumn 
 
    ,tmp.someothercolumn 
 
FROM table1 co 
 
INNER JOIN table3 c(NOLOCK) ON co.column11 = c.column11 
 
      AND co.filterColumn = 1 
 
CROSS APPLY (SELECT TOP (1) p.SomeOtherColumn 
 
      FROM table2 p(NOLOCK) 
 
\t \t \t WHERE p.COLUMN = co.Column) tmp