SQL Server - 在查询运行时已将多少行插入表中?

时间:2016-03-09 18:25:53

标签: sql sql-server

我正在运行一个包含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)导入了这些数据。也许这可能会减缓这个过程?

1 个答案:

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

如果愿意,也可以将所有插入语句放入存储过程中。