向表中添加了新列并减慢了整个数据库的速度。为啥?

Posted

技术标签:

【中文标题】向表中添加了新列并减慢了整个数据库的速度。为啥?【英文标题】:Added new columns to table and slow down the whole database .. Why?向表中添加了新列并减慢了整个数据库的速度。为什么? 【发布时间】:2014-11-20 04:01:52 【问题描述】:

我有一张表USERDATA,并在其中添加了一些新列。 全部都不是 NUL 并且默认为 0 或 1。但是,我的网站在这样做之后变得很慢。 我的意思是真的很慢。这是因为我网站上的这个查询脚本:

$num_rows = $db->doQuery('SELECT TOP 50 IDNum, IDName, Nation, (SELECT SUM(Loyalty) FROM USERDATA WHERE USERDATA.Knights = KNIGHTS.IDNum AND USERDATA.Authority = 1) as ClanLoyalty, (SELECT SUM(MannerPoint) FROM USERDATA WHERE USERDATA.Knights = KNIGHTS.IDNum AND USERDATA.Authority = 1) as ClanManner FROM KNIGHTS WHERE KNIGHTS.IDNum NOT IN (1,15001) ORDER BY ClanLoyalty DESC, IDName ASC');

之前它工作得很好,但是在添加了上面这个查询中根本不包含的新列之后..它仍然减慢了网站请求 TOP 50 的速度..基本上SUM 查询正在这样做..为什么这些新列会产生这样的问题吗?

USERDATA 仅有 32k 行,之前运行良好。我没有指定约束,可能是这个问题吗?

我使用 MSSQL Server 2005。

【问题讨论】:

你能把 not in 转换成 in 吗? @NoDisplayName 查询可以产生不同的计划可能比您的查询好得多。你能与执行计划共享底层表的架构吗 【参考方案1】:

像这样更改您的查询。

SELECT TOP 50 IDNum,
              IDName,
              Nation,
              Sum(Loyalty)     ClanLoyalty,
              Sum(MannerPoint)  ClanManner
FROM   KNIGHTS
       LEFT JOIN USERDATA
              ON USERDATA.Knights = KNIGHTS.IDNum
                 AND USERDATA.Authority = 1
WHERE  KNIGHTS.IDNum NOT IN ( 1, 15001 )
Group by IDNum,IDName,Nation
ORDER  BY ClanLoyalty DESC,
          IDName ASC 

【讨论】:

您可以在这里查看讨论,***.com/questions/27007413/… @RADAR 同意,但 OP 仍然两次使用相同的子查询,可以删除 仍然超级慢。但是,我对其进行了测试,这是由我添加的新列引起的,但奇怪的是这些甚至没有包含在此查询中。唯一的一点是它从新列所在的 USERDATA 中获取数据。什么可能导致这种情况?可能我需要编辑这些列。是因为 bigint 在 MSSQL Server 2005 中存在错误还是我应该尝试什么?请给我一点检查,因为我真的很紧张,我无法修复它......

以上是关于向表中添加了新列并减慢了整个数据库的速度。为啥?的主要内容,如果未能解决你的问题,请参考以下文章

向表中添加了列,但链接图表未使用新列数据更新

如何解析列并向表中添加更多记录?

FMDB:添加新列并插入数据

Hive - 向表中添加新列时,我得到:SemanticException [Error 10002]: Invalid column reference

如何将 CSV 导出复制到添加了新列的 Redshift 表中?

如何在具有数百条记录的现有csv中添加新列并从数组中填充它?