向表中添加了新列并减慢了整个数据库的速度。为啥?
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 中存在错误还是我应该尝试什么?请给我一点检查,因为我真的很紧张,我无法修复它......以上是关于向表中添加了新列并减慢了整个数据库的速度。为啥?的主要内容,如果未能解决你的问题,请参考以下文章
Hive - 向表中添加新列时,我得到:SemanticException [Error 10002]: Invalid column reference