【发布时间】:2020-10-01 06:50:09
【问题描述】:
我检查了几个问题是否重复,但我找不到一个。我正在处理三个表,第一个“articles”,第二个“tags”,第三个“article_tags”,其中包含两个外键“articleid”和“tagid”。 “article_tags”表将共享相同标签的文章关联在一起。
我的SQL查询如下:
'Getting 4 tag ids from table article_tags
MyCommand = New SqlCommand("SELECT TOP (4) at.tagid FROM articles a, article_tags at WHERE at.articleid=a.id AND at.articleid=@id", myconnection)
MyCommand.Parameters.Add("@id", SqlDbType.Int).Value = intID
Dim daQuery = New SqlDataAdapter(MyCommand)
Dim dtArticleTags = New DataTable
daQuery.Fill(dtArticleTags)
Dim strTagIds As String = ""
If dtArticleTags.Rows.Count > 0 Then
'Save all tags id's in a string "strTags"
'---------------------------------------------
Dim i As Integer = 0
For Each myrow As DataRow In dtArticleTags.Rows
'Store the Tag Ids in a string
strTagIds += myrow.Item("tagid").ToString
If i <> dtArticleTags.Rows.Count - 1 Then
strTagIds += ","
End If
i += 1
Next
'---------------------------------------------
'Getting 5 related articles sharing the same tags (Note: I know that strTagIds is not parametrized but this can never be inputted by a user)
MyCommand = New SqlCommand("SELECT TOP(5) at.articleid FROM article_tags at, articles a WHERE a.id=at.articleid AND a.publish_flag=1 AND SYSDATETIME() > DATEADD(mi, DATEDIFF(mi, GETUTCDATE(), SYSDATETIME()), a.publish_date) AND at.tagid IN (" & strTagIds & ") AND at.articleid<>@id Group by at.articleid, a.publish_date ORDER BY a.publish_date DESC", myconnection)
MyCommand.Parameters.Add("@id", SqlDbType.Int).Value = intID
daRelated = New SqlDataAdapter(MyCommand)
daRelated.Fill(dsArticle, "related")
End If
我觉得上面的查询需要时间来加载,尤其是“article_tags”表越来越大。我正在使用 SQL Express Edition,并且表已编入索引,我想知道这是否可以以更好的方式完成以提高性能。
附上执行计划:
按照@SuperPoney 的建议运行以下查询,返回相同的结果,以下是执行计划:
WITH top_art AS
(
SELECT TOP (4) at.tagid
FROM articles a, article_tags at
WHERE at.articleid=a.id
AND at.articleid=@id
)
SELECT TOP(5) at.articleid
FROM article_tags at, articles a, top_art
WHERE a.id=at.articleid
AND a.publish_flag=1
AND SYSDATETIME() > DATEADD(mi, DATEDIFF(mi, GETUTCDATE(), SYSDATETIME()), a.publish_date)
AND at.tagid=top_art.tag_id
AND at.articleid<>@id
Group by at.articleid, a.publish_date
ORDER BY a.publish_date DESC
【问题讨论】:
-
Re "我觉得..." - 在 SSMS 中运行您的查询,记录它的执行计划,显示它(有一些网站可以粘贴它)然后我们可以说一些有意义的东西: )
-
查询性能受索引、统计信息和执行计划的影响。查询优化器足够智能,可以简化查询并为具有不同语法但逻辑行为相同的查询生成相同执行计划。
-
这个条款试图达到什么目的 -
SYSDATETIME() > DATEADD(mi, DATEDIFF(mi, GETUTCDATE(), SYSDATETIME()), a.publish_date)? -
您要寻找的实际结果是什么?在我看来,您似乎是在尝试在代码中进行连接,而不是正确使用 sql。
-
执行计划已添加到问题中。确保服务器上的日期大于 publish_date。尝试检索共享相同标签的最新文章
标签: sql sql-server vb.net performance database-performance