我在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可能意味着哈希匹配会浪费能量。如何利用这些知识来加速查询?
答案 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