同一SQL,在同一数据库中执行时间差很远

kinglds 2006-10-19 02:45:35
这一条是连接数据库A中的自动生成的sql
select g.passdate as fcdate ,g.chauffeur,i.predate,g.ccode,g.invicode,i.invcode, g.carnum,g.invtype,g.waycode,g.wayicode,g.ccodetrust,g.ordcode,g.ordicode,
g.quotedfcy,g.fcy, (select top 1 g2.ordcode from invoice i2,invoiceg g2 where i2.invicode = g2.invicode and i2.sheetcode = '1211535' and
g.invicodex = g2.invicodex and g2.invgidx = g.invgidx and g2.keyflags >= 4 ) as ordcode2, (select top 1 g2.ordicode from invoice i2,invoiceg g2 where
i2.invicode = g2.invicode and i2.sheetcode = '1211535' and g.invicodex = g2.invicodex and g2.invgidx = g.invgidx and g2.keyflags >= 4 ) as ordicode2,
(select sum(g2.fcy ) from invoice i2,invoiceg g2 where i2.invicode = g2.invicode and i2.sheetcode = '1211535' and g.invicodex = g2.invicodex
and g2.invgidx = g.invgidx and g2.keyflags >= 4 group by g2.invgidx) as fcy2 from invoiceg g,invoice i where i.invicode = g.invicode and
g.passdate >= '2006-06-01' and (i.sheetcode in('1211321','1211323','1211324')) order by g.passdate,g.ccode asc

执行了14秒


这一条是连接数据库B中的自动生成的sql,也是程序自动生成的

select g.passdate as fcdate ,g.chauffeur,i.predate,g.ccode,g.invicode,i.invcode, g.carnum,g.invtype,g.waycode,g.wayicode,g.ccodetrust,g.ordcode,g.ordicode,
g.quotedfcy,g.fcy, (select top 1 g2.ordcode from invoice i2,invoiceg g2 where i2.invicode = g2.invicode and i2.sheetcode = '1211535' and
g.invicodex = g2.invicodex and g2.invgidx = g.invgidx and g2.keyflags >= 4 ) as ordcode2, (select top 1 g2.ordicode from invoice i2,invoiceg g2 where
i2.invicode = g2.invicode and i2.sheetcode = '1211535' and g.invicodex = g2.invicodex and g2.invgidx = g.invgidx and g2.keyflags >= 4 ) as ordicode2,
(select sum(g2.fcy ) from invoice i2,invoiceg g2 where i2.invicode = g2.invicode and i2.sheetcode = '1211535' and g.invicodex = g2.invicodex
and g2.invgidx = g.invgidx and g2.keyflags >= 4 group by g2.invgidx) as fcy2 from invoiceg g,invoice i where i.invicode = g.invicode and
g.passdate >= '2006-06-01' and (i.sheetcode in('1211321','1211323','1211324')) order by g.passdate,g.ccode asc

执行了好几分钟。
就算把它们COPY到查询分析器中,在同一数据库中运行也会是一样的时间差。
真是完全一模一样的SQL,是什么原因呢?请教高手?
...全文
603 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
wch007 2007-04-22
  • 打赏
  • 举报
回复
这有啥.时间差是有的,但一般都是不易察觉..
jesons 2006-10-23
  • 打赏
  • 举报
回复
好长的SQL代码啊~~~
K1933 2006-10-19
  • 打赏
  • 举报
回复
会不会数量量不一样呀?
marco08 2006-10-19
  • 打赏
  • 举报
回复
路過關注
kinglds 2006-10-19
  • 打赏
  • 举报
回复
可能是我手工换行些导致不完全一样的,确实是完全一样的SQL
xiaoku 2006-10-19
  • 打赏
  • 举报
回复
果真邪门...
xiaoku 2006-10-19
  • 打赏
  • 举报
回复
不是吧...我仔细看了一下句子,真的一样的句子阿???
--我自己给你做了实验,这两条语句完全相等
declare @Sql1 varchar(4000)
set @sql1 =
'select g.passdate as fcdate ,g.chauffeur,i.predate,g.ccode,g.invicode,i.invcode, g.carnum,g.invtype,g.waycode,g.wayicode,g.ccodetrust,g.ordcode,g.ordicode,g.quotedfcy,g.fcy,(select top 1 g2.ordcode from invoice i2,invoiceg g2 where i2.invicode = g2.invicode and i2.sheetcode = ''1211535'' and g.invicodex = g2.invicodex and g2.invgidx = g.invgidx and g2.keyflags >= 4 ) as ordcode2, (select top 1 g2.ordicode from invoice i2,invoiceg g2where i2.invicode = g2.invicode and i2.sheetcode = ''1211535'' and g.invicodex = g2.invicodex and g2.invgidx = g.invgidx and g2.keyflags >= 4 ) as ordicode2,(select sum(g2.fcy ) from invoice i2,invoiceg g2 where i2.invicode = g2.invicode and i2.sheetcode = ''1211535'' and g.invicodex = g2.invicodex and g2.invgidx = g.invgidx and g2.keyflags >= 4 group by g2.invgidx) as fcy2 from invoiceg g,invoice i where i.invicode = g.invicode and g.passdate >= ''2006-06-01'' and (i.sheetcode in(''1211321'',''1211323'',''1211324'')) order by g.passdate,g.ccode asc'
declare @i int
set @i =200
while @i>1
begin
select @sql1 =replace(@sql1 ,' ','')
set @i =@i -1
end
print @sql1

declare @Sql2 varchar(4000)
set @sql2 =
'select g.passdate as fcdate ,g.chauffeur,i.predate,g.ccode,g.invicode,i.invcode, g.carnum,g.invtype,g.waycode,g.wayicode,g.ccodetrust,g.ordcode,g.ordicode,g.quotedfcy,g.fcy, (select top 1 g2.ordcode from invoice i2,invoiceg g2 where i2.invicode = g2.invicode and i2.sheetcode = ''1211535'' andg.invicodex = g2.invicodex and g2.invgidx = g.invgidx and g2.keyflags >= 4 ) as ordcode2, (select top 1 g2.ordicode from invoice i2,invoiceg g2 where i2.invicode = g2.invicode and i2.sheetcode =''1211535'' and g.invicodex = g2.invicodex and g2.invgidx = g.invgidx and g2.keyflags >= 4 ) as ordicode2, (select sum(g2.fcy ) from invoice i2,invoiceg g2 where i2.invicode = g2.invicode and i2.sheetcode = ''1211535'' and g.invicodex = g2.invicodex and g2.invgidx = g.invgidx and g2.keyflags >= 4 group by g2.invgidx) as fcy2 from invoiceg g,invoice i where i.invicode = g.invicode and g.passdate >=''2006-06-01'' and (i.sheetcode in(''1211321'',''1211323'',''1211324'')) order by g.passdate,g.ccode asc'
set @i =200
while @i>1
begin
select @sql2 =replace(@sql2 ,' ','')
set @i =@i -1
end
print @sql2

if @sql1 =@sql2
print '1'
else
print '0'
--结果

selectg.passdateasfcdate,g.chauffeur,i.predate,g.ccode,g.invicode,i.invcode,g.carnum,g.invtype,g.waycode,g.wayicode,g.ccodetrust,g.ordcode,g.ordicode,g.quotedfcy,g.fcy,(selecttop1g2.ordcodefrominvoicei2,invoicegg2wherei2.invicode=g2.invicodeandi2.sheetcode='1211535'andg.invicodex=g2.invicodexandg2.invgidx=g.invgidxandg2.keyflags>=4)asordcode2,(selecttop1g2.ordicodefrominvoicei2,invoicegg2wherei2.invicode=g2.invicodeandi2.sheetcode='1211535'andg.invicodex=g2.invicodexandg2.invgidx=g.invgidxandg2.keyflags>=4)asordicode2,(selectsum(g2.fcy)frominvoicei2,invoicegg2wherei2.invicode=g2.invicodeandi2.sheetcode='1211535'andg.invicodex=g2.invicodexandg2.invgidx=g.invgidxandg2.keyflags>=4groupbyg2.invgidx)asfcy2frominvoicegg,invoiceiwherei.invicode=g.invicodeandg.passdate>='2006-06-01'and(i.sheetcodein('1211321','1211323','1211324'))orderbyg.passdate,g.ccodeasc
selectg.passdateasfcdate,g.chauffeur,i.predate,g.ccode,g.invicode,i.invcode,g.carnum,g.invtype,g.waycode,g.wayicode,g.ccodetrust,g.ordcode,g.ordicode,g.quotedfcy,g.fcy,(selecttop1g2.ordcodefrominvoicei2,invoicegg2wherei2.invicode=g2.invicodeandi2.sheetcode='1211535'andg.invicodex=g2.invicodexandg2.invgidx=g.invgidxandg2.keyflags>=4)asordcode2,(selecttop1g2.ordicodefrominvoicei2,invoicegg2wherei2.invicode=g2.invicodeandi2.sheetcode='1211535'andg.invicodex=g2.invicodexandg2.invgidx=g.invgidxandg2.keyflags>=4)asordicode2,(selectsum(g2.fcy)frominvoicei2,invoicegg2wherei2.invicode=g2.invicodeandi2.sheetcode='1211535'andg.invicodex=g2.invicodexandg2.invgidx=g.invgidxandg2.keyflags>=4groupbyg2.invgidx)asfcy2frominvoicegg,invoiceiwherei.invicode=g.invicodeandg.passdate>='2006-06-01'and(i.sheetcodein('1211321','1211323','1211324'))orderbyg.passdate,g.ccodeasc
1
中国风 2006-10-19
  • 打赏
  • 举报
回复
数据是否相同,数据库结枸(索引、全文素引)只要是作为查询条件的列(索引)
kinglds 2006-10-19
  • 打赏
  • 举报
回复
按道理说,在同一个库中就不会有这种情况了吧。表结构、索引,数据量都是一样的
qian_gh 2006-10-19
  • 打赏
  • 举报
回复
在查询分析器中把显示执行计划选择
然后执行SQL语句,从执行计划中看一下2个对比
kinglds 2006-10-19
  • 打赏
  • 举报
回复
第一条14秒的执行时间,第二条要几分钟时间,在两个库中都是一样的
子陌红尘 2006-10-19
  • 打赏
  • 举报
回复
同样的一条SQL语句在两个不同的数据库中执行,执行的时间差异很大?

那跟数据量、表上的索引以及数据库的物理结构等诸多因素相关。
kinglds 2006-10-19
  • 打赏
  • 举报
回复
就是这么邪门,在数据库A中执行,也是有时间差,在数据库B中执行,也有时间差。真是很郁闷啊
allright_flash 2006-10-19
  • 打赏
  • 举报
回复
数据库在同一机器上吗?
如果不是,可能跟机器的性能有关。
如果在同一机器上,检查两个数据的数据存储分配空间和参数设置。
xiaoku 2006-10-19
  • 打赏
  • 举报
回复
不过语句可以优化优化了,都让人看不懂的感觉
xiaoku 2006-10-19
  • 打赏
  • 举报
回复
同一个库,也有时间差???

邪门!

34,590

社区成员

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

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