(急)求教关于SQL语句 性能上的问题 ,在线等

liukai625 2012-07-16 10:30:19

select * from info_fair_scene_job with(nolock) where scene_id='49' and (CONTAINS(station, '销售')) order by newid()

这样一条语句,为station 字段建立了全文索引 用的是sql server 2005 的数据库

这个表里面的数据量,大该有10W左右不算大 但是scene_id='49'的就只有1000条左右

这条语句到底是先执行 (CONTAINS(station, '销售')) 这一条件?还是先执行 scene_id='49' 这个条件?

如果是先执行(CONTAINS(station, '销售')) 要在10W条数据里去查效率应该不会高吧?

我要对这条语句进行优化,麻烦各位大虾给出建议。

很急,小弟在此先谢过。

...全文
127 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
SQL77 2012-07-16
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 的回复:]
引用 11 楼 的回复:

引用 2 楼 的回复:
引用 1 楼 的回复:

order by newid()
有了这个效率不会高。


确实是这样,这个可以去掉。


SQL code


select * from info_fair_scene_job where scene_id='49' and station like '%销售%'

select *……
[/Quote]
那你应该看得出来为什么前者比后者高了吧
liukai625 2012-07-16
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 的回复:]

引用 2 楼 的回复:
引用 1 楼 的回复:

order by newid()
有了这个效率不会高。


确实是这样,这个可以去掉。


SQL code


select * from info_fair_scene_job where scene_id='49' and station like '%销售%'

select * from info_fai……
[/Quote]


[/code]
select * from info_fair_scene_job where scene_id='49' and station like '%销售%'
|--Clustered Index Scan(OBJECT:([cqjob-net].[dbo].[info_fair_scene_job].[PK_INFO_FAIR_JOB]), WHERE:([cqjob-net].[dbo].[info_fair_scene_job].[scene_id]=(49) AND [cqjob-net].[dbo].[info_fair_scene_job].[station] like '%销售%'))

[code=SQL]
select * from info_fair_scene_job with(nolock) where scene_id='49' and (CONTAINS(station, '销售'))

|--Merge Join(Inner Join, MERGE:([Full-text Search Engine].[KEY])=([cqjob-net].[dbo].[info_fair_scene_job].[job_id]), RESIDUAL:([cqjob-net].[dbo].[info_fair_scene_job].[job_id] = [Full-text Search Engine].[KEY]))
|--Sort(ORDER BY:([Full-text Search Engine].[KEY] ASC))
| |--Remote Scan(OBJECT:(CONTAINS))
|--Clustered Index Scan(OBJECT:([cqjob-net].[dbo].[info_fair_scene_job].[PK_INFO_FAIR_JOB]), WHERE:([cqjob-net].[dbo].[info_fair_scene_job].[scene_id]=(49)) ORDERED FORWARD)
Rotel-刘志东 2012-07-16
  • 打赏
  • 举报
回复
具体看一下执行计划不就知道那个效率更高了,自己测试一下。
SQL77 2012-07-16
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]
引用 1 楼 的回复:

order by newid()
有了这个效率不会高。


确实是这样,这个可以去掉。


SQL code


select * from info_fair_scene_job where scene_id='49' and station like '%销售%'

select * from info_fair_scene_job wi……
[/Quote]

SET SHOWPLAN_TEXT ON
GO
select * from info_fair_scene_job where scene_id='49' and station like '%销售%'

select * from info_fair_scene_job with(nolock) where scene_id='49' and (CONTAINS(station, '销售'))

给结果。
liukai625 2012-07-16
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]

引用 2 楼 的回复:

引用 1 楼 的回复:

order by newid()
有了这个效率不会高。


确实是这样,这个可以去掉。

SQL code

select * from info_fair_scene_job where scene_id='49' and station like '%销售%'

select * from info_fair……
[/Quote]
select * from info_fair_scene_job where scene_id='49' and station like '%销售%' 

select * from info_fair_scene_job with(nolock) where scene_id='49' and (CONTAINS(station, '销售'))

帅哥 我是说为什么上面为什么会比下面效率高
quchen520 2012-07-16
  • 打赏
  • 举报
回复
看错了不好意思
quchen520 2012-07-16
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

引用 1 楼 的回复:

order by newid()
有了这个效率不会高。


确实是这样,这个可以去掉。

SQL code

select * from info_fair_scene_job where scene_id='49' and station like '%销售%'

select * from info_fair_scene_job with(no……
[/Quote]
你这里用了like的模糊查询,效率肯定就不行了啊!
liukai625 2012-07-16
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

看先执行什么可以看看语句的执行计划,如果scene_id='49'会过滤大量数据并且有索引的话,SQL Server会优先考虑执行它的。
排序可以考虑索引字段排序,为什么要按照newid()呢?必须吗?
[/Quote]

因为要随 取前N条所以用到了newid()
liukai625 2012-07-16
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]

10W的数据量没必要用全文索引
[/Quote]

现在倒是没必要,但是现在这个数据量,以每天1000条左右在增长,而且这1000会属于一个新的scene_id编号
孤独加百列 2012-07-16
  • 打赏
  • 举报
回复
看先执行什么可以看看语句的执行计划,如果scene_id='49'会过滤大量数据并且有索引的话,SQL Server会优先考虑执行它的。
排序可以考虑索引字段排序,为什么要按照newid()呢?必须吗?
--小F-- 2012-07-16
  • 打赏
  • 举报
回复
10W的数据量没必要用全文索引
快溜 2012-07-16
  • 打赏
  • 举报
回复
应该先执行全文索引查询,你在scene_id建非聚集索引试试。
liukai625 2012-07-16
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

order by newid()
有了这个效率不会高。
[/Quote]

确实是这样,这个可以去掉。


select * from info_fair_scene_job where scene_id='49' and station like '%销售%'

select * from info_fair_scene_job with(nolock) where scene_id='49' and (CONTAINS(station, '销售'))

我在sql 2005里面 ctrl+L 比较了一下,分别是上面20%与80% 难道不是用CONTAINS效率要高一些吗?
--小F-- 2012-07-16
  • 打赏
  • 举报
回复
order by newid()
有了这个效率不会高。

22,210

社区成员

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

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