4列表,900万条记录需要25分钟以上

时间:2018-01-28 23:38:49

标签: sql-server performance tsql query-optimization

我有一个包含4列的表

field1 (PK), field2(nvarchar(128)), field3(nvarchar(max)), field4(datetime)

field3中包含xml数据。表有大约900万条记录。

如下所示的简单SELECT语句需要超过25分钟:

SELECT field1,field2,field3 
FROM [table] 

有人可以告诉我是否有任何方法可以优化它?

2 个答案:

答案 0 :(得分:1)

这可能只是一件容易事 试试

select top (1) * 
from table 

为什么需要返回900万行?

答案 1 :(得分:1)

执行SELECT * FROM table时,您告诉机器将大量数据从数据库加载到客户端软件(SSMS?)中。简单地从磁盘中获取数据可能不需要花费很多时间,将其转换为可传输的东西,将其放在网络上(或者如果在本地运行,则为共享内存),然后从& #39;传输模式'到数据模式'总而言之,这将需要一些时间,但如果你没有通过电话线运行也应该相当快。但是,在SSMS网格中加载900万行将花费相当多的时间,特别是如果有一个像xml这样的特殊列。

为避免这种副作用,请改为SELECT COUNT(*) FROM table或查看How to Execute SQL Query without Displaying results

根据评论,您似乎希望能够根据日期字段将数据从一个表移动到另一个表,可能是field4。

您可以使用以下语法轻松完成此操作:

INSERT tableB (field1, field2, ...)
SELECT field1, field2
  FROM tableB

数据将被复制到服务器本身,无需通过网络进行任何操作,您的所有客户端计算机都需要显示(9 million rows affected)

当然,这也不是即时的,毕竟,数据需要从磁盘读取并在其他地方写回磁盘。但它应该相当快。

如果您希望能够过滤日期时间字段,那么在该字段上建立索引可能是个好主意。拥有索引将允许系统快速找到所有匹配的'它需要复制的记录,没有索引意味着它必须读取每条记录以验证它是否符合您的标准。

PS:因为没有免费午餐这样的东西。拥有索引意味着MSSQL需要始终使索引保持最新状态。如果添加,删除或更新记录,则需要更新表和索引。接下来,索引也将占用数据库中的额外空间。由您决定在查询给定的日期时间(或范围)时是否需要快速响应比在更改表时具有(小)开销更重要(INSERT / UPDATE / DELETE)或不。