+ -
当前位置:首页 → 问答吧 → 关于sql语句效率的问题

关于sql语句效率的问题

时间:2011-12-24

来源:互联网

比如语句:
SQL code

  select i.* 
  from #wh_Stock_2 as i
  where
      (i.lister in (select TargetName from t_user_Permission_Target))



数据少了,倒没有什么关系,如果数据多了,速度就会比较慢的,因为我在sql语句里用到了 in,这样效率会比较慢,但是,我又必须这样做,我才能得到我想要的结果,问题是,有没有其它SQL语句的写法,我这个sql语句写意思是我要在#wh_Stock_2 的数据里当字段lister在表的t_user_Permission_Target.TargetName,有数据就取出来,这段语句很好理解的。我想既不影响速度,又得到我想的结果?
如何改一下这个sql语句?

作者: fstao   发布时间: 2011-12-24

select i.* 
  from #wh_Stock_2 as i
  where
  EXISTS (select 1 from t_user_Permission_Target WHERE i.lister=TargetName )

t_user_Permission_Target 这个表的 TargetName 有索引没?

作者: SQL777   发布时间: 2011-12-24

t_user_Permission_Target的表结构是这个:
CREATE TABLE [dbo].[t_user_Permission_Target](
[UserName] [varchar](50) NOT NULL,
[TargetName] [varchar](50) NOT NULL,
[Permission] [int] NOT NULL,
[Remark] [varchar](50) NULL,
[id] [int] IDENTITY(1,1) NOT NULL,
 CONSTRAINT [PK_t_user_Permission_Target] PRIMARY KEY NONCLUSTERED 
(
[id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 70) ON [PRIMARY]
) ON [PRIMARY]

作者: fstao   发布时间: 2011-12-24

引用 1 楼 sql777 的回复:

select i.*
from #wh_Stock_2 as i
where
EXISTS (select 1 from t_user_Permission_Target WHERE i.lister=TargetName )

t_user_Permission_Target 这个表的 TargetName 有索引没?

 TargetName 设置什么索引?

作者: fstao   发布时间: 2011-12-24

这两个表的数据量分别是多少?

作者: kuqideyupian   发布时间: 2011-12-24

子查询的数据量太大的话 加索引也效果不明显

作者: fredrickhu   发布时间: 2011-12-24

刚才试了一下,用:
select i.*  
  from #wh_Stock_2 as i
  where
  EXISTS (select 1 from t_user_Permission_Target WHERE i.lister=TargetName )

运行的速度与

  select i.* 
  from #wh_Stock_2 as i
  where
  (i.lister in (select TargetName from t_user_Permission_Target))
基本是一样的,没什么区别的。

不知道有什么好的方法呢?

作者: fstao   发布时间: 2011-12-24

SET SHOWPLAN_TEXT ON
GO
select i.*  
  from #wh_Stock_2 as i
  where
  (i.lister in (select DISTINCT TargetName from t_user_Permission_Target))
GO
SET SHOWPLAN_TEXT OFF
GO

不知道你的具体情况,猜测你应该有重复的,这样试试吧,

数据量与索引都是影响速度的重要原因,

把上述结果帖一下

作者: SQL777   发布时间: 2011-12-24

引用 7 楼 sql777 的回复:

SET SHOWPLAN_TEXT ON
GO
select i.*
from #wh_Stock_2 as i
where
(i.lister in (select DISTINCT TargetName from t_user_Permission_Target))
GO
SET SHOWPLAN_TEXT OFF
GO

不知道你的具体情况,猜测你应该有……


是不是写错了,应该是这样的吧:
select i.*  
  from #wh_Stock_2 as i
  where
  (i.lister in (select DISTINCT 1 TargetName from t_user_Permission_Target))

但是速度还是一样,如果是这样的:
select i.*  
  from #wh_Stock_2 as i
就1秒不到,690行数据,如果是这样:
select i.*  
  from #wh_Stock_2 as i
  where
  (i.lister in (select 1 TargetName from t_user_Permission_Target))

就要10秒时间,select * TargetName from t_user_Permission_Target 数据行数是42行

作者: fstao   发布时间: 2011-12-24

在LISTER上建索引就行了,应该没有其它优化方式了。

作者: kuqideyupian   发布时间: 2011-12-24

引用 8 楼 fstao 的回复:
引用 7 楼 sql777 的回复:

SET SHOWPLAN_TEXT ON
GO
select i.*
from #wh_Stock_2 as i
where
(i.lister in (select DISTINCT TargetName from t_user_Permission_Target))
GO
SET SHOWPLAN_TEXT OFF
GO

不知道……

就我那样的,你把结果文本显示一下,
SP_HELPINDEX t_user_Permission_Target 这个结果也帖一下,t_user_Permission_Target这个表的数据量多少?

作者: SQL777   发布时间: 2011-12-24

select * from t_user_Permission_Target 数据行数是42行

作者: fstao   发布时间: 2011-12-24

引用 11 楼 fstao 的回复:
select * from t_user_Permission_Target 数据行数是42行

SQL code
CREATE IDNEX IDX_Stock_2 ON #wh_Stock_2(lister)
GO
CREATE IDNEX IDX_TargetName ON t_user_Permission_Target(TargetName)
GO
select i.*  
  from #wh_Stock_2 as i
  where
  (i.lister in (select distinct TargetName from t_user_Permission_Target))


帖个结果你也没帖 ..TRY

作者: SQL777   发布时间: 2011-12-24

看数据的结果?结果好多的。
SQL code

code                             billcode     wh_stock_id   .....     
N00201112150001
N00201112140019
N00201112140013
N00201112140008
N00201112140004
........



贴不了数据,一共有65列,440行数据

作者: fstao   发布时间: 2011-12-24