我正在运行一个包含10个联合的清理脚本,结果或多或少有12亿行(我重新执行此脚本包括一些缺少的字段,所以我知道并期望这个数字在执行结束时。)
我将此已清理的数据插入新表(X)。我做了一些研究,我在MS网站上找到了这个查询:
-- Do not lock anything, and do not get held up by any locks.
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
-- Quickly get row counts.
SELECT OBJECT_SCHEMA_NAME(p.object_id) AS [Schema]
, OBJECT_NAME(p.object_id) AS [Table]
, i.name AS [Index]
, p.partition_number
, p.rows AS [Row Count]
, i.type_desc AS [Index Type]
FROM sys.partitions p
INNER JOIN sys.indexes i ON p.object_id = i.object_id
AND p.index_id = i.index_id
WHERE OBJECT_SCHEMA_NAME(p.object_id) != 'sys'
ORDER BY [Schema], [Table], [Index]
我发现我的Row Count为0,而且这个X表的Index Type是HEAP。 我的查询大约需要7个小时。我想它可以在一天内完成。 我还尝试选择前1,选择count(*),count(1),用(nolock)写,并且没有运行这些查询。
这是对的吗? SQL应该已经将一些数据加载到这个新表中,对吗? 如果在查询执行过程中出现问题,任何人都有任何想法可以帮我弄明白吗?
我只是想知道这个查询是否真的有用,我想从这个新表中查找数据。
------ --------编辑
我的select语句是一个名为BSEG(来自SAP)的表的清理。该表有100多列。
就像这样:
Select BUKRS, convert(datetime, BUDAT), convert(decimal(18,2), field3)...
into table a
from BSEG1
union
Select BUKRS, convert(datetime, BUDAT), convert(decimal(18,2), field3)...
from BSEG2
union (...)
我从txt文件(nvarchar 4000 - BCP)导入了这些数据。也许这可能会减缓这个过程?
答案 0 :(得分:0)
为什么你不将你的选择分成10插入?
首先创建结果表:
Select BUKRS, convert(datetime, BUDAT), convert(decimal(18,2), field3)...
into MyTable
from BSEG1
WHERE 1=0 -- this will do the trick
下一个
insert into MyTable
Select BUKRS, convert(datetime, BUDAT), convert(decimal(18,2), field3)...
from BSEG1
PRINT @@ROWCOUNT
insert into MyTable
Select BUKRS, convert(datetime, BUDAT), convert(decimal(18,2), field3)...
from BSEG2
PRINT @@ROWCOUNT
insert into (...)
以这种方式你应该使用:
简单地阅读MyTable中的记录select count(*) from MyTable with (nolock)
如果愿意,也可以将所有插入语句放入存储过程中。