sql 使用参数和直接拼接sql效率不一致

baidu_27549073 2017-07-06 02:00:37

declare @bd datetime ='2017-07-06'
select isnull(sum(b.score),0) as SumScore,a.kindid,c.kindName from [thtreasuredb].[dbo].RecordDrawInfo a with(nolock) left join thtreasuredb.dbo.RecordDrawScore b with(nolock) on a.drawid=b.drawid left join [THPlatformDB].[dbo].[GameKindItemWeb] c with(nolock) on a.kindid=c.kindid where userid in(select userid from thaccountsdb.dbo.accountsinfo with(nolock) where isandroid=0 and nullity=0 and userid not in (select account from [THTreasureDB].dbo.web_serialnumlog where type=7)) and b.inserttime>@bd group by a.kindid,c.kindName

select isnull(sum(b.score),0) as SumScore,c.kindid,c.kindName from [thtreasuredb].[dbo].RecordDrawInfo a with(nolock) left join thtreasuredb.dbo.RecordDrawScore b with(nolock) on a.drawid=b.drawid left join [THPlatformDB].[dbo].[GameKindItemWeb] c with(nolock) on a.kindid=c.kindid where userid in(select userid from thaccountsdb.dbo.accountsinfo with(nolock) where isandroid=0 and nullity=0 and userid not in (select account from [THTreasureDB].dbo.web_serialnumlog where type=7)) and b.inserttime>='2017/7/6' group by c.kindid,c.kindName


实际的执行结果是上面的要2s,下面的需要18s。能不能给我科普一下
...全文
391 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
baidu_27549073 2017-07-06
  • 打赏
  • 举报
回复
引用 16 楼 yenange 的回复:
[quote=引用 14 楼 baidu_27549073 的回复:]
我用的2008


不可能吧, 你贴一下查询1的 declare 的执行计划的截图。[/quote]
吉普赛的歌 2017-07-06
  • 打赏
  • 举报
回复
引用 14 楼 baidu_27549073 的回复:
我用的2008
不可能吧, 你贴一下查询1的 declare 的执行计划的截图。
baidu_27549073 2017-07-06
  • 打赏
  • 举报
回复
引用 13 楼 a2048 的回复:
时间字符写成一样试试看。
已经测试不了了,现在变成一样的了
baidu_27549073 2017-07-06
  • 打赏
  • 举报
回复
引用 12 楼 yenange 的回复:
[quote=引用 9 楼 baidu_27549073 的回复:] declare算一句
那为什么我的 declare 就没有算一句? [/quote] 我用的2008
a2048 2017-07-06
  • 打赏
  • 举报
回复
时间字符写成一样试试看。
吉普赛的歌 2017-07-06
  • 打赏
  • 举报
回复
引用 9 楼 baidu_27549073 的回复:
declare算一句


那为什么我的 declare 就没有算一句?
baidu_27549073 2017-07-06
  • 打赏
  • 举报
回复
引用 6 楼 z10843087 的回复:
[quote=引用 5 楼 baidu_27549073 的回复:] 我问了下朋友,他猜测一个是多核操作,一个是单核的。但是为什么会这样,他就不知道了
这个猜测不准。这个明显是执行计划走不一样。可能是刚才说的类型的问题。另外可能是参数嗅探的问题。[/quote] 他的意思是第二句没有并行度那一栏。现在好些了。现在两句都是1s左右
baidu_27549073 2017-07-06
  • 打赏
  • 举报
回复
引用 7 楼 hjywyj 的回复:
lz贴一下以下SQL的执行计划

上面问题贴出来了,今早上是为题里面的第二幅图,现在的执行效率变了。不知道是不是我执行了下面两句的原因
update STATISTICS  [thtreasuredb].[dbo].RecordDrawInfo
update STATISTICS thtreasuredb.dbo.RecordDrawScore

下面是两句现在的执行效率,现在都不到1s。

baidu_27549073 2017-07-06
  • 打赏
  • 举报
回复
引用 8 楼 yenange 的回复:
DECLARE @bd DATETIME = '2017-07-06'
SELECT ISNULL(SUM(b.score), 0) AS SumScore,
       a.kindid,
       c.kindName
FROM   [thtreasuredb].[dbo].RecordDrawInfo a WITH (NOLOCK) LEFT
       JOIN thtreasuredb.dbo.RecordDrawScore b WITH (NOLOCK)
            ON  a.drawid = b.drawid
       LEFT JOIN [THPlatformDB].[dbo].[GameKindItemWeb] c WITH (NOLOCK)
            ON  a.kindid = c.kindid
WHERE  userid IN (SELECT userid
                  FROM   thaccountsdb.dbo.accountsinfo WITH (NOLOCK)
                  WHERE  isandroid       = 0
                         AND nullity     = 0
                         AND userid NOT IN (SELECT account
                                            FROM   [THTreasureDB].dbo.web_serialnumlog
                                            WHERE  TYPE = 7))
       AND b.inserttime > @bd
GROUP BY
       a.kindid,
       c.kindName

SELECT ISNULL(SUM(b.score), 0) AS SumScore,
       c.kindid,
       c.kindName
FROM   [thtreasuredb].[dbo].RecordDrawInfo a WITH (NOLOCK) LEFT
       JOIN thtreasuredb.dbo.RecordDrawScore b WITH (NOLOCK)
            ON  a.drawid = b.drawid
       LEFT JOIN [THPlatformDB].[dbo].[GameKindItemWeb] c WITH (NOLOCK)
            ON  a.kindid = c.kindid
WHERE  userid IN (SELECT userid
                  FROM   thaccountsdb.dbo.accountsinfo WITH (NOLOCK)
                  WHERE  isandroid       = 0
                         AND nullity     = 0
                         AND userid NOT IN (SELECT account
                                            FROM   [THTreasureDB].dbo.web_serialnumlog
                                            WHERE  TYPE = 7))
       AND b.inserttime >= '2017/7/6'
GROUP BY
       c.kindid,
       c.kindName
明明只有两个查询, 为什么会显示: 查询 3 ?
declare算一句
吉普赛的歌 2017-07-06
  • 打赏
  • 举报
回复
DECLARE @bd DATETIME = '2017-07-06'
SELECT ISNULL(SUM(b.score), 0) AS SumScore,
a.kindid,
c.kindName
FROM [thtreasuredb].[dbo].RecordDrawInfo a WITH (NOLOCK) LEFT
JOIN thtreasuredb.dbo.RecordDrawScore b WITH (NOLOCK)
ON a.drawid = b.drawid
LEFT JOIN [THPlatformDB].[dbo].[GameKindItemWeb] c WITH (NOLOCK)
ON a.kindid = c.kindid
WHERE userid IN (SELECT userid
FROM thaccountsdb.dbo.accountsinfo WITH (NOLOCK)
WHERE isandroid = 0
AND nullity = 0
AND userid NOT IN (SELECT account
FROM [THTreasureDB].dbo.web_serialnumlog
WHERE TYPE = 7))
AND b.inserttime > @bd
GROUP BY
a.kindid,
c.kindName

SELECT ISNULL(SUM(b.score), 0) AS SumScore,
c.kindid,
c.kindName
FROM [thtreasuredb].[dbo].RecordDrawInfo a WITH (NOLOCK) LEFT
JOIN thtreasuredb.dbo.RecordDrawScore b WITH (NOLOCK)
ON a.drawid = b.drawid
LEFT JOIN [THPlatformDB].[dbo].[GameKindItemWeb] c WITH (NOLOCK)
ON a.kindid = c.kindid
WHERE userid IN (SELECT userid
FROM thaccountsdb.dbo.accountsinfo WITH (NOLOCK)
WHERE isandroid = 0
AND nullity = 0
AND userid NOT IN (SELECT account
FROM [THTreasureDB].dbo.web_serialnumlog
WHERE TYPE = 7))
AND b.inserttime >= '2017/7/6'
GROUP BY
c.kindid,
c.kindName

明明只有两个查询, 为什么会显示:
查询 3 ?
  • 打赏
  • 举报
回复
lz贴一下以下SQL的执行计划

select isnull(sum(b.score),0) as SumScore,a.kindid,c.kindName from [thtreasuredb].[dbo].RecordDrawInfo a with(nolock) left join thtreasuredb.dbo.RecordDrawScore b with(nolock) on a.drawid=b.drawid left join [THPlatformDB].[dbo].[GameKindItemWeb] c with(nolock) on a.kindid=c.kindid where userid in(select userid from thaccountsdb.dbo.accountsinfo with(nolock) where isandroid=0 and nullity=0 and userid not in (select account from [THTreasureDB].dbo.web_serialnumlog where type=7))  and b.inserttime>'2017/7/6' group by a.kindid,c.kindName

OwenZeng_DBA 2017-07-06
  • 打赏
  • 举报
回复
引用 5 楼 baidu_27549073 的回复:
我问了下朋友,他猜测一个是多核操作,一个是单核的。但是为什么会这样,他就不知道了
这个猜测不准。这个明显是执行计划走不一样。可能是刚才说的类型的问题。另外可能是参数嗅探的问题。
baidu_27549073 2017-07-06
  • 打赏
  • 举报
回复
我问了下朋友,他猜测一个是多核操作,一个是单核的。但是为什么会这样,他就不知道了
baidu_27549073 2017-07-06
  • 打赏
  • 举报
回复
引用 3 楼 z10843087 的回复:
[quote=引用 2 楼 baidu_27549073 的回复:] [quote=引用 1 楼 AcHerat 的回复:] 你把第二段SQL的 = 去掉,然后看执行计划(最好每个语句开一个新的查询窗口看执行计划)
还是一样的,没有变化[/quote] 看下inserttime 字段类型,是否有隐式转换[/quote] 应该不存在隐式转换 inserttime 是datetime类型的
OwenZeng_DBA 2017-07-06
  • 打赏
  • 举报
回复
引用 2 楼 baidu_27549073 的回复:
[quote=引用 1 楼 AcHerat 的回复:] 你把第二段SQL的 = 去掉,然后看执行计划(最好每个语句开一个新的查询窗口看执行计划)
还是一样的,没有变化[/quote] 看下inserttime 字段类型,是否有隐式转换
baidu_27549073 2017-07-06
  • 打赏
  • 举报
回复
引用 1 楼 AcHerat 的回复:
你把第二段SQL的 = 去掉,然后看执行计划(最好每个语句开一个新的查询窗口看执行计划)
还是一样的,没有变化
AcHerat 2017-07-06
  • 打赏
  • 举报
回复
你把第二段SQL的 = 去掉,然后看执行计划(最好每个语句开一个新的查询窗口看执行计划)

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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