谁可以来帮我优化一下?谢谢

空空法师 2009-06-18 12:27:21

IF OBJECT_ID('tempdb..#stats') IS NOT NULL
BEGIN
DROP TABLE #stats
END
SELECT id INTO #stats FROM dbo.sysobjects WHERE xtype = 'U' AND [name] <> 'dtproperties'
ALTER TABLE #stats ADD [max] NVARCHAR(50)

DECLARE
@id INT,
@t_name nvarchar(50),
@c_name nvarchar(50),
@c_max varchar(50)
DECLARE c_cursor CURSOR FOR
SELECT a.id, a.name, b.name FROM dbo.sysobjects a INNER JOIN dbo.syscolumns b ON a.id=b.id WHERE a.xtype = 'U' AND a.name <> 'dtproperties'
OPEN c_cursor
FETCH NEXT FROM c_cursor INTO
@id, @t_name, @c_name
WHILE @@FETCH_STATUS = 0
BEGIN
EXEC ('UPDATE #stats SET [max] = (SELECT MAX(' + @c_name + ') FROM ' + @t_name + ') WHERE id=' + @id)
FETCH NEXT FROM c_cursor INTO @id, @t_name, @c_name
END
CLOSE c_cursor
DEALLOCATE c_cursor

SELECT * FROM #stats ORDER BY id


数据库里200个表也没有却花了2分半运行,还报了很多错。如果我在这个基础上再加上min值和统计null的话不知道要运行多少时间了。有什么办法可以优化一下?谢谢!

原来的帖子居然不让我连发3个以上回帖。没办法,只能再开一个。
...全文
62 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
空空法师 2009-06-18
  • 打赏
  • 举报
回复
dbo.TableView是自己做的一个View,含有tab_name AS t_name, [col_name] AS c_name, [type]三个字段。
运行速度在3-4分钟,因为除了cursor其他办法不会用。


IF OBJECT_ID('tempdb..#stats') IS NOT NULL
BEGIN
DROP TABLE #stats
END
SELECT tab_name AS t_name, [col_name] AS c_name, [type] INTO #stats FROM dbo.TableView
ALTER TABLE #stats ADD c_max NVARCHAR(50), c_min NVARCHAR(50), c_countrows INT, c_countvalid INT
GO

DECLARE
@t_name nvarchar(50),
@c_name nvarchar(50),
@c_type nvarchar(50),
@c_max nvarchar(50),
@c_min nvarchar(50),
@c_countrows int,
@c_countvalid int
DECLARE c_cursor CURSOR FOR
SELECT * FROM #stats
OPEN c_cursor
FETCH NEXT FROM c_cursor INTO
@t_name, @c_name, @c_type, @c_max, @c_min, @c_countrows, @c_countvalid
WHILE @@FETCH_STATUS = 0
BEGIN
IF @c_type='datetime' OR @c_type='int' OR @c_type='decimal' OR @c_type='float' OR @c_type='real'
BEGIN
PRINT ('UPDATE #stats SET c_max=(SELECT MAX(' + @c_name + ') FROM ' + @t_name + '),c_min=(SELECT MIN(' + @c_name + ') FROM ' + @t_name + '),c_countrows=(SELECT COUNT(*) FROM' + @t_name + '),c_countvalid=(SELECT COUNT(' + @c_name + ') FROM ' + @t_name + ') WHERE t_name=''' + @t_name + ''' AND c_name=''' + @c_name + '''')
END
EXEC ('UPDATE #stats SET c_countrows=(SELECT COUNT(*) FROM ' + @t_name + '),c_countvalid=(SELECT COUNT(' + @c_name + ') FROM ' + @t_name + ') WHERE t_name=''' + @t_name + ''' AND c_name=''' + @c_name + '''')
FETCH NEXT FROM c_cursor INTO
@t_name, @c_name, @c_type, @c_max, @c_min, @c_countrows, @c_countvalid
END
CLOSE c_cursor
DEALLOCATE c_cursor
GO
ALTER TABLE #stats ADD c_completeness FLOAT
GO
UPDATE #stats SET c_completeness=CONVERT(FLOAT,ISNULL(c_countvalid,0))/(CASE WHEN CONVERT(FLOAT,ISNULL(c_countrows,0))=0 THEN -1 ELSE CONVERT(FLOAT,ISNULL(c_countrows,0)) END)
GO
SELECT * FROM #stats ORDER BY t_name, c_name
DROP TABLE #stats
GO
  • 打赏
  • 举报
回复
看不懂。
ai_li7758521 2009-06-18
  • 打赏
  • 举报
回复
帮顶
winstonbonaparte 2009-06-18
  • 打赏
  • 举报
回复
你在语句里加入一些时间的,返回时间看一下哪里执行最花时间,然后再考虑那一段该怎么去改写SQL语句。

我前段时间写段代码,数据库数据才二十几万行,从代码开始到结束竟然要花一秒钟以上,最慢的时候花了三秒多,我就在一些地方加了GetTickCount(Windows API)来取出时间,这才找出了哪里花的时间最长。然后再去修改。后来数据到六十几万行,从开始到结束最多200多毫秒,最快60多毫秒
Yang_ 2009-06-18
  • 打赏
  • 举报
回复
你要干什么?
你的结果只是最后一个字段的最大值,并不是所有字段的

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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