查询优化以避免仅使用少量不同值对列进行匹配

时间:2013-08-06 17:10:31

标签: sql-server

我在sql-server中有两个表。

System{
  AUTO_ID           -- identity auto increment primary key
  SYSTEM_GUID       -- index created, unique key
}

File{
  AUTO_ID       -- identity auto increment primary key
  File_path
  System_Guid -- foreign key refers system.System_guid, index is created
              -- on this column
}

系统表有100,000行。 文件表有200,000行。 文件表只有System_guid的10个不同值。

我的查询如下:

Select * from 
File left outer join System
on file.system_guid = system.system_guid

SQL服务器正在使用哈希匹配连接来给我带来很长时间的结果。

我想优化此查询以使其更快。事实上只有10个不同的system_guid可能意味着哈希匹配会浪费能量。如何利用这些知识来加速查询?

2 个答案:

答案 0 :(得分:0)

当索引列的值几乎不变时,索引的目的会失败。如果你想要的只是从System中提取记录,其中system_guid是File中的一个,那么你可能会更好(在你的情况下)使用如下查询:

select * from System 
where system_guid in (select distinct system_guid from File).

答案 1 :(得分:0)

LEFT加入真的有必要吗?查询如何作为INNER连接执行?你有不同的加入吗?

我怀疑散列连接是这个I / O数量的问题。

你可以像这样做一个UNION ......也许会哄骗一个不同的计划。

Select * from File 
WHERE System_Guid NOT IN (SELECT system_guid from system)
union all
Select * from 
File inner join System
on file.system_guid = system.system_guid