【发布时间】:2012-12-14 17:21:00
【问题描述】:
我有一个表,它是我的 SQL Server 2012 数据库 (annonsid, annonsid2) 中对象的链接表。该表用于创建三角形甚至矩形链,以查看谁可以与谁交换。
这是我在表 Matching_IDs 上使用的查询,其中有 150 万行,使用此查询产生 1400 万条可能的链:
SELECT COUNT(*)
FROM Matching_IDs AS m
INNER JOIN Matching_IDs AS m2
ON m.annonsid2 = m2.annonsid
INNER JOIN Matching_IDs AS m3
ON m2.annonsid2 = m3.annonsid
AND m.annonsid = m3.annonsid2
我必须将性能提高到可能需要 1 秒或更短的时间,有没有更快的方法来做到这一点?在我的电脑上查询大约需要 1 分钟。我通常使用WHERE m.annonsid=x,但它需要的时间相同,因为它必须通过所有可能的组合。
更新:最新的查询计划
|--Compute Scalar(DEFINE:([Expr1006]=CONVERT_IMPLICIT(int,[globalagg1011],0)))
|--Stream Aggregate(DEFINE:([globalagg1011]=SUM([partialagg1010])))
|--Parallelism(Gather Streams)
|--Stream Aggregate(DEFINE:([partialagg1010]=Count(*)))
|--Hash Match(Inner Join, HASH:([m2].[annonsid2], [m2].[annonsid])=([m3].[annonsid], [m].[annonsid2]), RESIDUAL:([MyDatabase].[dbo].[Matching_IDs].[annonsid2] as [m2].[annonsid2]=[MyDatabase].[dbo].[Matching_IDs].[annonsid] as [m3].[annonsid] AND [MyDatabase].[dbo].[Matching_IDs].[annonsid2] as [m].[annonsid2]=[MyDatabase].[dbo].[Matching_IDs].[annonsid] as [m2].[annonsid]))
|--Parallelism(Repartition Streams, Hash Partitioning, PARTITION COLUMNS:([m2].[annonsid2], [m2].[annonsid]))
| |--Index Scan(OBJECT:([MyDatabase].[dbo].[Matching_IDs].[NonClusteredIndex-20121229-133207] AS [m2]))
|--Parallelism(Repartition Streams, Hash Partitioning, PARTITION COLUMNS:([m3].[annonsid], [m].[annonsid2]))
|--Merge Join(Inner Join, MANY-TO-MANY MERGE:([m].[annonsid])=([m3].[annonsid2]), RESIDUAL:([MyDatabase].[dbo].[Matching_IDs].[annonsid] as [m].[annonsid]=[MyDatabase].[dbo].[Matching_IDs].[annonsid2] as [m3].[annonsid2]))
|--Parallelism(Repartition Streams, Hash Partitioning, PARTITION COLUMNS:([m].[annonsid]), ORDER BY:([m].[annonsid] ASC))
| |--Index Scan(OBJECT:([MyDatabase].[dbo].[Matching_IDs].[NonClusteredIndex-20121229-133152] AS [m]), ORDERED FORWARD)
|--Parallelism(Repartition Streams, Hash Partitioning, PARTITION COLUMNS:([m3].[annonsid2]), ORDER BY:([m3].[annonsid2] ASC))
|--Index Scan(OBJECT:([MyDatabase].[dbo].[Matching_IDs].[NonClusteredIndex-20121229-133207] AS [m3]), ORDERED FORWARD)
【问题讨论】:
-
你在表上定义了哪些索引?索引
(annonsid2,annonsid)可能是一个不错的选择。 -
我有两列的聚集索引,每列都有一个非聚集索引 (2)
-
查询计划说时间在哪里?
-
嗯,从我按下运行到它开始显示结果大约需要 2 秒,但这并不意味着查询有那么快,对吧?因为当我只是做一个 Count(m .annonsid) 而不是获取所有记录,大约需要 1 分钟。
-
您能否将查询计划附加到问题中?
标签: sql sql-server optimization sql-server-2012