MS SQL服务器索引/ PK建议

时间:2018-05-21 11:21:32

标签: sql sql-server sql-update where

我使用两个具有大量行的表,在一个非常慢的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

任何建议,指示等都将不胜感激。 我花了一个小时左右尝试起草这个,希望它简洁,所以如果不是,我很抱歉。 如果它太冗长,我道歉,但我试图添加尽可能多的相关信息。

感谢您提供任何帮助。

1 个答案:

答案 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