我使用两个具有大量行的表,在一个非常慢的UPDATE语句中遇到了一些问题。
我不熟悉主键和索引的使用,这无疑是问题的一部分,但我也担心它可能与我使用32位版本的MS这一事实有关SQL服务器。
从两个旧的Visual Fox Pro * .DBF文件导入数据。 由于数据有拼写错误和其他错误,我首先将它们导入到两个临时表中,作为varchar(255)数据类型。 然后我清理/编辑了这些临时表,以确保我感兴趣的列具有正确的数据类型。 然后我将它们导入两个表,名为WORK和MAST。 这一切都很好,尽管很慢。
两个表主要包含varchar(50),还包含int,tinyint,decimal和date数据类型。
WORK包含大约600,000行,包含21个字段。
MAST包含大约6,500,000行,包含26个字段。
当我尝试使用以下查询将三行从MAST复制到WORK中的三行时,出现了主要的慢速。 花了4个小时才完成。
USE DATABASE
UPDATE WORK
SET w_timeOS = t2.m_timeOS,
w_distance = t2.m_distance,
w_state = t2.m_state
FROM MAST as t2
WHERE
WORK.w_date = t2.m_date
and WORK.w_siteNum = t2.m_SiteNum
and WORK.w_location = t2.m_location
在set语句中,timeOS和distance字段是整数,状态是varchar(5)。
在where子句中,日期值是日期格式,siteNum是整数,位置是varchar(1),我想我应该将位置转换为整数...
在哪里,你建议把索引放在哪里?
日期,siteNum和location的组合是MAST独有的,它们也都在WORK中,但是在WORK表中这些字段的每个组合可能有几个匹配的行。
但是,如果我添加另一个字段w_employee,那么它们在WORK表中也是唯一的。
我应该在WORK表上使用w_date,w_siteNum和w_location添加索引吗?
我是否还要在MAST表中添加一个索引到m_date,m_siteNum和m_location,如上所述,除非我添加了m_employee,否则它不会是唯一的?
还是有更好的方法,(也许使用它们作为外键?),两个表基本上共享所有三个字段的相同信息,即使它们在MAST上只是唯一的,需要在WORK上添加m_employee字段表让它独一无二?
联合会比三个where子句好吗?
即使目前缺少索引,您所花费的时间是否过多?
我正在运行MS SQL Server 12.0.2000,32位,并使用MSMS 17.6,在具有3.6GHz双核AMD双核FX-4100 CPU,8GB DDR3 RAM的Windows 7 64位系统上,几乎空1TB 7200RPM 6GB / s SATA硬盘,安装了OS,SQL和MSMS。
观察系统资源,没有CPU核心达到50%,系统使用的RAM小于4GB,SQL服务器本身使用大约1.5GB。
硬盘访问速度似乎非常慢,大约为2MB / s。我测试了硬盘,发现没有坏的或未决的坏扇区。
从那以后,我怀疑这不是系统规格的问题,或者它运行32位版本的SQL这一事实,就像我读到的那样,在32位版本上支持高达2.5GB的RAM
任何建议,指示等都将不胜感激。 我花了一个小时左右尝试起草这个,希望它简洁,所以如果不是,我很抱歉。 如果它太冗长,我道歉,但我试图添加尽可能多的相关信息。
感谢您提供任何帮助。
答案 0 :(得分:0)
对于此查询:
UPDATE WORK
SET w_timeOS = t2.m_timeOS,
w_distance = t2.m_distance,
w_state = t2.m_state
FROM MAST as t2
WHERE WORK.w_date = t2.m_date and
WORK.w_siteNum = t2.m_SiteNum and
WORK.w_location = t2.m_location ;
您需要MAST(m_date, m_siteNum, m_location)
上的索引。三个字段的索引也可能有助于WORK
。