Sql 如何获取所有用户';职位';堆栈交换数据资源管理器中的标记(包括应答和#x27;s标记)?

Sql 如何获取所有用户';职位';堆栈交换数据资源管理器中的标记(包括应答和#x27;s标记)?,sql,sql-server,sql-server-2017,dataexplorer,Sql,Sql Server,Sql Server 2017,Dataexplorer,我在(SEDE)中使用查询 这是: 在上面的代码中,堆栈溢出中的帖子有两种类型:问答。问题(PostTypeId在数据库架构中为1)有标记,但答案(PostTypeId在数据库架构中为2)没有标记。 答案属于通过ParentId的问题 但我上面的查询效率太低了,我只能得到一些(使用用户id)帖子的标签 如何在SEDE超时时间内获取所有用户的帖子标签?以下几点: 您无法获取所有用户的帖子标签。当前,和 因此,您需要:(A)以某种方式限制结果,或者(B)41m个帖子,每次50K(不推荐),或者(C)

我在(SEDE)中使用查询

这是:

在上面的代码中,堆栈溢出中的帖子有两种类型:问答。问题(
PostTypeId
在数据库架构中为1)有标记,但答案(
PostTypeId
在数据库架构中为2)没有标记。 答案属于通过
ParentId
的问题

但我上面的查询效率太低了,我只能得到一些(使用用户id)帖子的标签

如何在SEDE超时时间内获取所有用户的帖子标签?

以下几点:

  • 您无法获取所有用户的帖子标签。当前,和
  • 因此,您需要:(A)以某种方式限制结果,或者(B)41m个帖子,每次50K(不推荐),或者(C)使用或替代
  • 如果您不打算从
    Users
    表中提取ID以外的任何内容,则不要包括该表。它会破坏循环和
    帖子。OwnerUserId
    是一样的东西
  • 尽可能避免使用
    UNION
    语句(在这种情况下)
  • 如果使用
    UNION
    语句,请尽可能使用
    UNION ALL
    (在本例中)。这样可以避免发动机重复检查
  • 下面是原始查询的执行计划:

    这是一个精简的计划:

    以及:

    --这也提供了更可读的结果——特别是当删除
    WHERE
    子句时

    但是,如果你可以限制,比如说,用户在手;你得到了一个平衡:

    (此查询指向用户id。)

    请注意,只有前10名用户的帖子超过了50K篇

    SELECT A.Id
           , A.PostTypeId
           , A.Title
           , A.Body
           , A.ParentId
           , A.Tags
           , A.CreationDate
    FROM   posts A
           LEFT JOIN users U
                  ON A.OwnerUserId = U.id
    WHERE  U.Id = ##UserId##
           AND A.PostTypeId = 1
    UNION
    SELECT A.Id
           , A.PostTypeId
           , A.Title
           , A.Body
           , A.ParentId
           , B.Tags
           , A.CreationDate
    FROM   posts A
           LEFT JOIN users U
                  ON A.OwnerUserId = U.id
           RIGHT JOIN posts B
                   ON A.ParentId = B.Id
    WHERE  U.Id = ##UserId##
           AND A.PostTypeId = 2
    
    SELECT      TOP 50000
                p.OwnerUserId                                       AS [User]
                , p.Id                                              AS [Post Id]
                , CASE WHEN p.PostTypeId = 1 THEN 'Q' ELSE 'A' END  AS [Type]
                , COALESCE (p.Title, ownr.Title)                    AS [Title]
                , p.Body
                , COALESCE (p.Tags, ownr.Tags)                      AS [Tags]
                , p.CreationDate
    FROM        Posts p
    LEFT JOIN   Posts ownr      ON ownr.ID = p.ParentId
    WHERE       p.OwnerUserId   = ##UserId##
    AND         p.PostTypeId    IN (1, 2)  -- Question, answer
    ORDER BY    p.OwnerUserId DESC,  p.CreationDate
    
    WITH usersOfInterest AS (
        SELECT      TOP 10
                    u.Id                                                AS [UserId]
                    , u.DisplayName
        FROM        Users u
        ORDER BY    u.Reputation DESC
    )
    SELECT      
                [User] = 'site://u/' + CAST(u.UserId AS NVARCHAR) + '|' + CAST(u.UserId AS NVARCHAR)
                , p.Id                                              AS [Post Id]
                , CASE WHEN p.PostTypeId = 1 THEN 'Q' ELSE 'A' END  AS [Type]
                , COALESCE (p.Title, ownr.Title)                    AS [Title]
                , p.Body
                , COALESCE (p.Tags, ownr.Tags)                      AS [Tags]
                , p.CreationDate
    FROM        usersOfInterest u
    INNER JOIN  Posts p         ON u.UserId = p.OwnerUserId
    LEFT JOIN   Posts ownr      ON ownr.Id  = p.ParentId
    WHERE       p.PostTypeId    IN (1, 2)   -- Question, answer
    ORDER BY    u.UserId DESC,  p.CreationDate