帮忙优化一下

gw6328 2011-04-09 10:53:54

这个是动态语句,里的,我打印出来好看一些。也就是下面一句是一起执行。
以前 是 insert into tb_tmp select.... 但是一百多次这样的操作会出错几次,后来我改成了先create tb_tmp 再 insert into 后,正常了,正常运行了大概3个月左右。服务器上就装了一个sql server与一个调用到这个存储过程的应用程序,现在每天又会出现一几次错误了。
重点是,数据库的现在统计的数据量还不有以前大,反而还出现了错误。 下面的tb_tmp表是用了以后就删除的,这里没有用临时表,因为要多次连接处理,不是一次处理完的。

if object_id('tb_tmp') is not null
drop table tb_tmp;

create table tb_tmp([rn] int identity(1,1) primary key not null,siteId int,adId int,showIp int,clickIp int)

insert into tb_tmp select t.siteId,t.adId,count(1) as ShowIp,0 as ClickIp
from(
select distinct siteid,adid,ip from tb a where time>='xxx' and time<='xxx'
except
select siteid,adid,ip from tb_abs
) t group by t.siteid,t.adid

...全文
262 29 打赏 收藏 转发到动态 举报
写回复
用AI写文章
29 条回复
切换为时间正序
请发表友善的回复…
发表回复
快溜 2011-04-12
  • 打赏
  • 举报
回复
你这个问什么建表又删表?怎么不直接用select出来的数据
快溜 2011-04-12
  • 打赏
  • 举报
回复

--不清楚,就是觉得你这样写开销太大,不要用execpt
insert into tb_tmp
select siteid,adid,count(distinct ip) as ShowIp,0 as ClickIp
from tb a where time>='xxx' and time<='xxx'
and not exists(select 1 from tb_abs where siteid=a.siteid
and adid=a.adid and ip=a.ip)
group by siteid,adid
gw6328 2011-04-12
  • 打赏
  • 举报
回复
[Quote=引用 24 楼 ssp2009 的回复:]
引用楼主 jinfengyiye 的回复:
SQL code

这个是动态语句,里的,我打印出来好看一些。也就是下面一句是一起执行。
以前 是 insert into tb_tmp select.... 但是一百多次这样的操作会出错几次,后来我改成了先create tb_tmp 再 insert into 后,正常了,正常运行了大概3个月左右。服务器上就装了一个sql server与一个调……
[/Quote]
刚结- -!
请色狼详细点提示.
快溜 2011-04-12
  • 打赏
  • 举报
回复
[Quote=引用楼主 jinfengyiye 的回复:]
SQL code

这个是动态语句,里的,我打印出来好看一些。也就是下面一句是一起执行。
以前 是 insert into tb_tmp select.... 但是一百多次这样的操作会出错几次,后来我改成了先create tb_tmp 再 insert into 后,正常了,正常运行了大概3个月左右。服务器上就装了一个sql server与一个调用到这个存储过程的应用程序,现在每天又会出现一……
[/Quote]你这样写开销太大了,聚合,except,insert。。。天。
So_CooL 2011-04-12
  • 打赏
  • 举报
回复
这样写不行吗:

select * from(
select distinct siteid,adid,ip from tb a where time>='xxx' and time<='xxx'
except
select siteid,adid,ip from tb_abs
) t group by t.siteid,t.adid
不要那个临时表
gw6328 2011-04-12
  • 打赏
  • 举报
回复
[Quote=引用 26 楼 ssp2009 的回复:]
SQL code

--不清楚,就是觉得你这样写开销太大,不要用execpt
insert into tb_tmp
select siteid,adid,count(distinct ip) as ShowIp,0 as ClickIp
from tb a where time>='xxx' and time<='xxx'
and not exists(select 1 ……
[/Quote]
这个与except效果一样。
gw6328 2011-04-12
  • 打赏
  • 举报
回复
[Quote=引用 27 楼 ssp2009 的回复:]
你这个问什么建表又删表?怎么不直接用select出来的数据
[/Quote]

中间还有一步update的处理,不能直接select数量太大了。 上面一步都很大了。时间太长。主要是中间还有一步update 的操作。
duoxu1983 2011-04-11
  • 打赏
  • 举报
回复
把except换成not exists试下

select t.siteId,t.adId,count(1) as ShowIp,0 as ClickIp
from(
select distinct siteid,adid,ip from tb a
where time>='xxx' and time<='xxx'
and not exists (select 1 from tb_abs b where a.siteid=b.siteid and a.adid=b.adid and a.ip=b.ip)
) t group by t.siteid,t.adid
gw6328 2011-04-11
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 rucypli 的回复:]
创建临时表

临时表有两种类型:本地表和全局表。在与首次创建或引用表时相同的 SQL Server 实例连接期间,本地临时表只对于创建者是可见的。当用户与 SQL Server 实例断开连接后,将删除本地临时表。全局临时表在创建后对任何用户和任何连接都是可见的,当引用该表的所有用户都与 SQL Server 实例断开连接后,将删除全局临时表。
[/Quote]

这样好像不行,这个我要进行第二次连接,第二次连接是读取数据出去。
rucypli 2011-04-10
  • 打赏
  • 举报
回复
创建临时表

临时表有两种类型:本地表和全局表。在与首次创建或引用表时相同的 SQL Server 实例连接期间,本地临时表只对于创建者是可见的。当用户与 SQL Server 实例断开连接后,将删除本地临时表。全局临时表在创建后对任何用户和任何连接都是可见的,当引用该表的所有用户都与 SQL Server 实例断开连接后,将删除全局临时表。

叶子 2011-04-10
  • 打赏
  • 举报
回复
貌似不是数据量大引起的...
gw6328 2011-04-09
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 wwwwgou 的回复:]
SORRY,#2的INNER JOIN用法错误.用exists了

SQL code
INSERT INTO tb_tmp
(
siteid,
adid,
ShowIp,
ClickIp
)
SELECT
a.siteid,
a.adid,
ShowIp = COUNT(DISTINCT a.ip),
Cl……
[/Quote]

刚才上面写错了,现在这个计划应该是上面一个,上面一个有一个12%是index scan
Shawn 2011-04-09
  • 打赏
  • 举报
回复
SORRY,#2的INNER JOIN用法错误.用exists了
INSERT INTO tb_tmp
(
siteid,
adid,
ShowIp,
ClickIp
)
SELECT
a.siteid,
a.adid,
ShowIp = COUNT(DISTINCT a.ip),
ClickIp = 0
FROM tb a
WHERE a.[time] >= 'xxx'
AND a.[time] <= 'xxx'
AND NOT EXISTS(SELECT TOP(1) 1 FROM tb_abs WHERE siteid = a.siteid AND adid = a.adid AND ip = a.ip)
GROUP BY a.siteid, a.adid

-晴天 2011-04-09
  • 打赏
  • 举报
回复
没时间细看程序,但提个建议:
你有些操作,比如把日期进行重新字符串化,可以在客户端上用程序来完成,最好不要交给SQL去完成,在客户端用程序完成很简单速度也快,而在服务器上做就慢了.
另外,最好不要重复地建表/删除,可以采用TRUNCATE TABLE删除表中内容,这样就节省了新建表的时间了.
gw6328 2011-04-09
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 wwwwgou 的回复:]
SQL code
--#1.楼主没说会发生什么错误
--#2.单从SQL语句上看,没什么问题. EXCEPT可以考虑换种写法
INSERT INTO tb_tmp
(
siteid,
adid,
ShowIp,
ClickIp
)
SELECT
a.siteid,
a.adid,
ShowIp = COUNT(DIS……
[/Quote]

这样的执行计划很类似

36%(聚合插入)<-....<-41%(distinct sort)<-|A|
|A|<-12%(index seek)
|A|<-12%(index seek)

以前的
36%(聚合插入)<-...<-|A|
|A|<-41%(distinct sort)<-12%(index seek)
|A|<-12%(index seek)

我不太会发图,|A|那里是两个分支。
gw6328 2011-04-09
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 qianjin036a 的回复:]
直接在企业管理器中运行这个存储过程,看看它要花多少时间.如果时间太长,则这个程序要优化.
[/Quote]
是很长的,现在就是请大家帮忙想想优化的办法
gw6328 2011-04-09
  • 打赏
  • 举报
回复
以前也是超时的错误,我分开语句也就不错了。
关键现在是每天有1百多次运行,但是有时候是正确的,的时候会出错,出错都提示超时。
Rotel-刘志东 2011-04-09
  • 打赏
  • 举报
回复
----tem.Data.SqlClient.SqlException (0x80131904): Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding.
超时,语句的逻辑是否有问题呀!
-晴天 2011-04-09
  • 打赏
  • 举报
回复
直接在企业管理器中运行这个存储过程,看看它要花多少时间.如果时间太长,则这个程序要优化.
Shawn 2011-04-09
  • 打赏
  • 举报
回复
原来是超时啊,可能是你的数据量较大导致的。
解决问题的办法是,减少长时间操作,或设置增加超时时间。
加载更多回复(9)
v1.5.2 Build 1 版汉化说明 汉化人:王锦阳 汉化语言:简体中文 汉化版本:1.5.2 Build 1 EasyUI版本:1.5.2 汉化时间:2017年06月27日 个人博客:http://blog.sina.com.cn/richie696 好吧,这次更新迟了,因为工作实在太忙,加上最近在忙着买车的事情,所以已经顾不过来了,今天上easyui官网看已经发布1.5.2了,查了一下发现好久之前就更新了,好在主要是优化和BUG修复,没有什么新内容的加入,所以应该不会妨碍大家使用,另外由于官方会不定期的更新官方的文档,更新也不会通知我,所以我制作API的时候也只能根据我所在时间点的官方文档作为翻译基础,而文档发布之后更新的内容自然不会出现在中文API当中,所以这就需要大家的帮忙和反馈了,反馈方式有2种: 1.我的博客文章下直接回复; 2.加入Easy UI的使用交流群:189263358(本群欢迎那些愿意分享和帮助别人的人,如果只是那种一味只知道求帮助而从不帮助别人的人请勿加群,否则加了也会被踢掉,谢谢配合。) 反馈后我会将新内容加入,我不可能每次更新文档都将中文API和英文官网上的文档做一次1:1的校验,这样工作量太大,我也没那么多时间,所以感谢大家来一起帮忙完善! jQuery EasyUI 1.5.2 版本更新内容 Bug(修复) • form:修复在调用“reset”方法的时候会导致input输入框初始值消失的BUG; • textbox:修复在调用“destroy”方法的时候无法清除字段标签的BUG; • datagrid:修复在不存在的行上调用“selectRow”方法的时候会导致记录无效行信息的BUG。 Improvement(改进) • datagrid:ctrl键选择支持Mac键盘; • datagrid:新增“scrollOnSelect”属性,可以让用户确定是否在选择行时自动滚动到对应行所在的位置; • combotree:添加“textField”属性; • combotreegrid:添加“textField”属性; • pagination:添加“showPageInfo”属性; • panel:添加“halign”和“titleDirection”属性,以允许用户自定义面板标题文字的对齐方式; • accordion:添加“halign”属性,以允许用户构建水平方向的分类标签; • tagbox:添加“required”属性,以允许用户将其用于验证指定值是否为空(译者注:该属性自validatebox继承而来,1.5.2版之前也有该属性只是设置以后无效)。

22,209

社区成员

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

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