-1

次の sql select クエリを改善する方法を教えてください。SQL Management Studio でも結果が出るまでに時間がかかります。そのため、ウェブサイトから呼び出すと時間がかかります。上位 15 件の結果が得られましたが、結果を得るにはまだ時間がかかります。サブクエリのせいですか?

SELECT top 15  t1.TagId, t1.TagName, 
(SELECT COUNT(*) FROM TagsToPost 
                WHERE TagsToPost.TagId=t1.TagId AND 
                EXISTS(SELECT * FROM Posts 
                             WHERE PostId=TagsToPost.PostId AND 
                             Posts.Time > '2014-01-01 00:00:00.000' AND
                             Posts.TimePointId=@TimePointId)) as myCount

FROM Tags as t1

WHERE (SELECT COUNT(*) FROM TagsToPost 
                WHERE TagsToPost.TagId=t1.TagId AND 
                EXISTS(SELECT * FROM Posts 
                             WHERE PostId=TagsToPost.PostId AND 
                             Posts.Time > '2014-01-01 00:00:00.000' AND
                             Posts.TimePointId=@TimePointId))>1

ORDER BY myCount DESC
4

1 に答える 1

2

まず、サブクエリを 1 回だけ実行する必要があります。

SELECT top 15 *
FROM (SELECT t1.TagId, t1.TagName, 
             (SELECT COUNT(*)
              FROM TagsToPost 
              WHERE TagsToPost.TagId=t1.TagId AND 
                    EXISTS (SELECT *
                            FROM Posts 
                            WHERE PostId=TagsToPost.PostId AND 
                                  Posts.Time > '2014-01-01 00:00:00.000' AND
                                  Posts.TimePointId=@TimePointId
                           )
             ) as myCount
      FROM Tags as t1
     ) t
WHERE COUNT(*) > 1
ORDER BY myCount DESC;

SQL Server が 1 つの結果セットを生成しないように最適化するかどうかはわかりません。これにより、クエリ時間が半分に短縮される可能性があります。

exists次に、標準group byとを使用して の1 つのレベルを削除できますjoin

      SELECT top 15 t.TagId, t.TagName, COUNT(*) as myCount
      FROM tags t join
           TagsToPost tp
           on TagsToPost.TagId = t.TagId AND 
      WHERE EXISTS (SELECT 1
                    FROM Posts  p
                    WHERE p.PostId = tp.PostId AND 
                          p.Time > '2014-01-01 00:00:00.000' AND
                          p.TimePointId=@TimePointId
                   )
      GROUP BY t.TagId, t.TagName
      HAVING myCOunt > 1
      ORDER BY myCount DESC;

で同様のことができますposts。しかし、おそらく index を作成するだけで十分Posts(PostId, TimePointId, Time)です。

于 2014-03-29T16:22:18.237 に答える