优化是一个急需解决的课题,但出现此类的情况如何解决此类的问题,多谢指教!继续学习中......

RICHEER COCA 2014-12-12 11:03:57
学习中,不论是否可以继续优化提速,但还是一句话“非常感谢大师的指导和帮助!”
说明
集合A 导入了1417547行,集合B 导入了185956行,又跑了近13个小时,结果还没有出来,但发现了一个奇怪的现象,大数据量运行时,不论运行多久,3个多小时,5个多小时,10个多小时,12个多小时,结果是一样的?? 只好停下了,看到的结果(34732 行受影响),不知是停在这个节点?还是继续在计算?
集合A的数据在tall文档里,数据下载链接是
http://access911.net/csdn/filedescription.asp?mdb=2014-12-9&id=4
通过上述地址可以直接下载本文件,请复制上述 URL 链接地址

集合B的数据在tEST文档里,数据下载链接是
http://access911.net/csdn/filedescription.asp?mdb=2014-12-9&id=5
通过上述地址可以直接下载本文件,请复制上述 URL 链接地址

又一次测试

执行以下代码,运行了3个多小时。

--->集合A建表#tball ,数据仅仅导入 969890 行。
if object_id('tempdb..#tball') is not null drop table [dbo].[#tball]
GO

CREATE TABLE [dbo].[#tball]([序号][int]IDENTITY(1,1),
[notext] [varchar](20) NULL,
[blu] [int] NULL
)
--->插入到指定的表
BULK INSERT #tball FROM 'D:\我的文档\tall.txt' --注意改变你的路径,此为楼主的文档路径
WITH
(
FIELDTERMINATOR =',', --分割符号为逗号 ','
ROWTERMINATOR = '\r\n' --换行符
)
--select top 11 * from #tball ---检查核对数据格式
--select count(*) from #tball ---核对数据总行数,数据有 969890 行。

---->集合A 拆分为no1,no2,no3,no4,no5,no6,Blu共7列 -- select *from #tb1 order by 序号
if object_id('tempdb..#tb1') is not null drop table #tb1
go
CREATE TABLE #tb2([序号][bigint]IDENTITY(1,1),[NO1][int],[NO2][int],[NO3][int],[NO4][int],[NO5][int],[NO6][int],[Blu][int])
insert #tb1
select TOP 969890 SUBSTRING(notext,1,2)as no1,
SUBSTRING(notext,4,2)as no2,
SUBSTRING(notext,7,2)as no3,
SUBSTRING(notext,10,2)as no4,
SUBSTRING(notext,13,2)as no5,
SUBSTRING(notext,16,2)as no6,blu
FROM [#tball]

--->集合B建表#test,数据有8024 行。
if object_id('tempdb..#test') is not null drop table [dbo].[#test]
GO

CREATE TABLE [dbo].[#test]([序号][int]IDENTITY(1,1),
[notext] [varchar](20) NULL,
[blu] [int] NULL
)
--->插入到指定的表
BULK INSERT #test FROM 'D:\我的文档\#test.txt' --注意改变你的路径,此为楼主的文档路径
WITH
(
FIELDTERMINATOR ='+', --分割符号为加号 '+'
ROWTERMINATOR = '\r\n' --换行符
)
--select top 11 * from #test ---检查核对数据格式
--select count(*) from #test ---核对数据总行数,数据有8024 行。

---->集合B 拆分为no1,no2,no3,no4,no5,no6,Blu共7列 -- select *from #tb2 order by 序号
if object_id('tempdb..#tb2') is not null drop table #tb2
go
CREATE TABLE #tb2([序号][bigint]IDENTITY(1,1),[NO1][int],[NO2][int],[NO3][int],[NO4][int],[NO5][int],[NO6][int],[Blu][int])
insert #tb2
select TOP 8024 SUBSTRING(notext,1,2)as no1,
SUBSTRING(notext,4,2)as no2,
SUBSTRING(notext,7,2)as no3,
SUBSTRING(notext,10,2)as no4,
SUBSTRING(notext,13,2)as no5,
SUBSTRING(notext,16,2)as no6,blu
FROM [#test]

----建立奖级表 #tj -- 核查 select * from #tj
if object_id('tempdb..#tj') is not null drop table #tj
create table #tj
(jname varchar(10), -- 奖级
jstatus varchar(100), -- 中奖条件
jamount int -- 奖金
)
insert into #tj
select '一等奖','6+1',6335444 union all
select '二等奖','6+0',144194 union all
select '三等奖','5+1',3000 union all
select '四等奖','5+0,4+1',200 union all
select '五等奖','4+0,3+1',10 union all
select '六等奖','2+1,1+1,0+1',5

---->测试
DECLARE @base bigint
SET @base = 2

IF OBJECT_ID('TempDB..#tb1Cte')IS NOT NULL DROP TABLE #tb1Cte
SELECT *
,POWER(@base,no1-1) +
POWER(@base,no2-1) +
POWER(@base,no3-1) +
POWER(@base,no4-1) +
POWER(@base,no5-1) +
POWER(@base,no6-1) AS value
INTO #tb1Cte
FROM #tb1

IF OBJECT_ID('TempDB..#tb2Cte')IS NOT NULL DROP TABLE #tb2Cte
SELECT *
,POWER(@base,no1-1) +
POWER(@base,no2-1) +
POWER(@base,no3-1) +
POWER(@base,no4-1) +
POWER(@base,no5-1) +
POWER(@base,no6-1) AS value
INTO #tb2Cte
FROM #tb2

IF OBJECT_ID('TempDB..#result')IS NOT NULL DROP TABLE #result
CREATE TABLE #result([序号1] [bigint] NULL,[序号2] [bigint] NULL,[jstatus] varchar(100))
--6+0 6+1
INSERT INTO #result
SELECT T1.序号,T2.序号,CASE WHEN T1.Blu=T2.Blu THEN '6+1' ELSE '6+0' END
FROM #tb1Cte T1 JOIN #tb2Cte T2 ON T1.value=T2.value

IF OBJECT_ID('TempDB..#Number')IS NOT NULL DROP TABLE #Number
SELECT POWER(@base,number) value
INTO #Number
FROM master..spt_values
WHERE TYPE='P'AND number<36

--5+0 5+1
--Start
IF OBJECT_ID('TempDB..#2bitDiff')IS NOT NULL DROP TABLE #2bitDiff
SELECT T1.value + T2.value value
INTO #2bitDiff
FROM #Number T1
JOIN #Number T2
ON T1.value < T2.value

INSERT INTO #result
SELECT T1.序号,T2.序号,CASE WHEN T1.Blu=T2.Blu THEN '5+1' ELSE '5+0,4+1' END
FROM #tb1Cte T1 JOIN #tb2Cte T2 ON (T1.value^T2.value)IN(SELECT value FROM #2bitDiff)
LEFT JOIN #result T3 ON T1.序号=T3.序号1 AND T2.序号=T3.序号2
WHERE T3.序号1 IS NULL
--end

--4+0 4+1
--Start
IF OBJECT_ID('TempDB..#4bitDiff')IS NOT NULL DROP TABLE #4bitDiff
SELECT T1.value + T2.value + T3.value + T4.value value
INTO #4bitDiff
FROM #Number T1
JOIN #Number T2 ON T1.value < T2.value
JOIN #Number T3 ON T2.value < T3.value
JOIN #Number T4 ON T3.value < T4.value

INSERT INTO #result
SELECT T1.序号,T2.序号,CASE WHEN T1.Blu=T2.Blu THEN '5+0,4+1' ELSE '4+0,3+1' END
FROM #tb1Cte T1 JOIN #tb2Cte T2 ON (T1.value^T2.value)IN(SELECT value FROM #4bitDiff)
LEFT JOIN #result T3 ON T1.序号=T3.序号1 AND T2.序号=T3.序号2
WHERE T3.序号1 IS NULL
--end

--3+1
--Start
IF OBJECT_ID('TempDB..#3bitDiff')IS NOT NULL DROP TABLE #3bitDiff
SELECT T1.value + T2.value + T3.value value
INTO #3bitDiff
FROM #Number T1 JOIN #Number T2 ON T1.value < T2.value JOIN #Number T3 ON T2.value < T3.value
INSERT INTO #result
SELECT T1.序号,T2.序号,'4+0,3+1'
FROM #tb1Cte T1 JOIN #tb2Cte T2 ON T1.Blu=T2.Blu AND (T1.value&T2.value)IN(SELECT value FROM #3bitDiff)
LEFT JOIN #result T3 ON T1.序号=T3.序号1 AND T2.序号=T3.序号2 WHERE T3.序号1 IS NULL
--end

--Blu 1
INSERT INTO #result
SELECT T1.序号,T2.序号,'2+1,1+1,0+1'
FROM #tb1Cte T1 JOIN #tb2 T2 ON T1.Blu=T2.Blu
LEFT JOIN #result T3 ON T1.序号=T3.序号1 AND T2.序号=T3.序号2
WHERE T3.序号1 IS NULL

--SELECT * FROM #result T1
-- JOIN #tj T2 ON T1.jstatus=T2.jstatus
--ORDER BY 序号1,序号2/*

SELECT T1.序号2
,SUM(T2.jamount)jamount
FROM #result T1
JOIN #tj T2 ON T1.jstatus=T2.jstatus
GROUP BY T1.序号2
--HAVING SUM(T2.jamount)<457567

出现以下的信息
引用
(8024 行受影响)

(2 行受影响)

(16048 行受影响)

(6 行受影响)

(969890 行受影响)

(16048 行受影响)

(969890 行受影响)

(16048 行受影响)

(0 行受影响)

(36 行受影响)

(630 行受影响)

(1771502 行受影响)

(58905 行受影响)

(69194388 行受影响)

(7140 行受影响)

(33829055 行受影响)
消息 1105,级别 17,状态 2,第 64 行
无法为数据库 'tempdb' 中的对象 '<temporary system object: 5692549947921727488>' 分配空间,因为 'PRIMARY' 文件组已满。请删除不需要的文件、删除文件组中的对象、将其他文件添加到文件组或为文件组中的现有文件启用自动增长,以便增加可用磁盘空间。


问题:优化是一个急需解决的课题,但出现此类的情况如何解决此类的问题,多谢指教!继续学习中......
...全文
206 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
RICHEER COCA 2014-12-13
  • 打赏
  • 举报
回复
引用 1 楼 rockyljt 的回复:
临时表建议少用,改为固定表应该会快很多
数据库 'tempdb'原始仅仅8M,不论代码运行的过程中数据库 'tempdb'增大到多少个G,再次重启SQL时,数据库 'tempdb'会恢复到初始,如果不用临时表,30G的数据库能收缩吗?不用临时表的话,有更好的办法吗? 还要 请教:磁盘空间占用如此的大,是必然的过程?还是说代码需要优化?
RICHEER COCA 2014-12-13
  • 打赏
  • 举报
回复
集合A取231818 行 集合B取39224 行, 代码运行2个多小时,最高的记录有135047304 行,数据库 'tempdb' 占用了D盘剩余的 33G 的所有磁盘空间(注:太占空间),无法为数据库 'tempdb' 中的对象 '<temporary system object: 432345569677148160>' 分配空间,因为 'PRIMARY' 文件组已满。 以下是记录,仅供参考,以便优化
引用
(9806 行受影响) (4 行受影响) (39224 行受影响) (6 行受影响) (231818 行受影响) (39224 行受影响) (231818 行受影响) (39224 行受影响) (18444 行受影响) (36 行受影响) (630 行受影响) (4574452 行受影响) (7140 行受影响) (135047304 行受影响) 消息 1105,级别 17,状态 2,第 123 行 无法为数据库 'tempdb' 中的对象 '<temporary system object: 432345569677148160>' 分配空间,因为 'PRIMARY' 文件组已满。请删除不需要的文件、删除文件组中的对象、将其他文件添加到文件组或为文件组中的现有文件启用自动增长,以便增加可用磁盘空间。 消息 1101,级别 17,状态 10,第 123 行 由于文件组 'DEFAULT 中的磁盘空间不足,无法为数据库 'TEMPDB' 分配新页。请删除文件组中的对象、将其他文件添加到文件组或者为文件组中的现有文件启用自动增长,以便增加必要的空间。 消息 208,级别 16,状态 0,第 1 行 对象名 '#33' 无效。 消息 208,级别 16,状态 0,第 1 行 对象名 '#44' 无效。
问题:磁盘空间占用太大,可以解决吗?
RICHEER COCA 2014-12-12
  • 打赏
  • 举报
回复
引用 1 楼 rockyljt 的回复:
临时表建议少用,改为固定表应该会快很多
学习了,很好的建议,很受用
---涛声依旧--- 2014-12-12
  • 打赏
  • 举报
回复
临时表建议少用,改为固定表应该会快很多

22,207

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧