如何提高此SQL更新查询的速度?

时间:2012-03-23 23:08:26

标签: sql performance

抱歉,这是我第一次使用这个论坛。显然人们可以编辑我的帖子虽然有用,但已经取出了一些信息。 我会尽量让它更容易理解。

我使用SQL Compact 3.5作为本地数据库。 该程序是用VB.NET编写的。

问题在于查询我的一张桌子花了太长时间。

除其他外,播放器表格包含idskillschoolweightstarter

  • id是玩家的身份
  • skill是玩家的技能等级
  • school是指向学校表id的外键
  • weight是14个不同数字之一

我要做的是为给定学校给定体重的技能最高的玩家设置starter value ='true'。 因此,如果一所学校有100名球员,那么将有14名首发球员,每名球员一名。

玩家桌面有170,000名玩家,每个玩家拥有14种不同的权重,每个玩家都属于4500所学校中的一所。

有人在下面发表评论,并表明这一陈述似乎在正确的轨道上。我是新手,还没有实现它。

  "UPDATE p " &
  "SET starter = 'TRUE' " &
  "FROM player p" &
  "JOIN (" &
  "SELECT DISTINCT school, weight, MAX(skill) AS MaxSkill " &
  "FROM player " &
  "GROUP BY school, weight" &
  ") q ON q.school = p.school AND q.weight = p.weight AND q.MaxSkill =
   p.skill"

2 个答案:

答案 0 :(得分:3)

此更新查询不是一行一行地逐行进行,而是一次完成所有操作:

首先,它为每个skill / school组合收集最高weight

然后将其加入到具有匹配的player / school / weight组合的skill,然后将player设置为启动器。

UPDATE p
SET starter = 'TRUE'
FROM player p 
JOIN (
    SELECT school, weight, MAX(skill) AS MaxSkill
    FROM player
    GROUP BY school, weight
) maxResults 
    ON maxResults.school = p.school 
    AND maxResults.weight = p.weight 
    AND maxResults.MaxSkill = p.skill

然而,在技能平手的情况下,所有具有最高技能的球员都将成为首发......

答案 1 :(得分:1)

weight的使用存在一些轻微的混淆,因为我假设你没有按单位进行此操作。您可能希望将范围提取到另一个表,然后使用id而不是数字权重。

无论如何,这是一个适用于所有RDBMS的查询

UPDATE player a SET starter = TRUE
WHERE NOT EXISTS (SELECT '1'
                  FROM player b
                  WHERE b.school = a.school
                  AND b.weight = a.weight
                  AND b.skill > a.skill)

如果符合以下情况,内部查询应返回null(因此设置starter为真):

  1. 学校里没有其他球员
  2. 在同一所学校,同一重量级别没有球员
  3. 对于相同的学校和体重等级,没有更高技能水平的球员
相关问题