我有一个包含4列的表
field1 (PK), field2(nvarchar(128)), field3(nvarchar(max)), field4(datetime)
field3
中包含xml数据。表有大约900万条记录。
如下所示的简单SELECT
语句需要超过25分钟:
SELECT field1,field2,field3
FROM [table]
有人可以告诉我是否有任何方法可以优化它?
答案 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)或不。