首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

求关于上面的查询语句的优化方案

2012-12-16 
求关于下面的查询语句的优化方案本帖最后由 TravyLee 于 2012-11-15 16:52:21 编辑selectg.xs_bm,g.xs_xm,

求关于下面的查询语句的优化方案
本帖最后由 TravyLee 于 2012-11-15 16:52:21 编辑


select
g.xs_bm,
g.xs_xm,
g.xx_bm,
s.zy_bm,
s.kc_bm
from
td_skkb s 
inner join 
t_gdxs g 
on
g.xx_bm=s.xx_bm
and g.zy_bm=s.zy_bm
where
g.xx_bm='0101'

go





SQL Server 分析和编译时间: 
   CPU 时间 = 0 毫秒,占用时间 = 0 毫秒。

/*
(593527 行受影响)
表 'Worktable'。扫描计数 69,逻辑读取 113303 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'TD_SKKB'。扫描计数 1,逻辑读取 5 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'T_GDXS'。扫描计数 1,逻辑读取 353 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。

SQL Server 执行时间:
   CPU 时间 = 2375 毫秒,占用时间 = 7973 毫秒。
*/

说明:表td_skkb有1.5万条数据左右,表t_gdxs有250万条数据左右  满足条件的xx_bm='0101'的大概有5.5万条数据

我之前的索引:
create index xxbm_zybm_kcbm_idx on td_skkb(xx_bm,kc_bm,zy_bm)
go
create nonclustered index xxbm_xsbm_zybm_xsxm_idx on t_gdxs(xx_bm,zy_bm)include (xs_bm,xs_xm)
go

没创建这两个索引之前耗时16s,现在耗时8s这任然是不能接受的
[最优解释]
你们这些高手啊,没事干了是不?
[其他解释]
围观一下
[其他解释]
select    g.xs_bm,g.xs_xm,g.xx_bm,s.zy_bm,s.kc_bm
from    td_skkb s inner join (select * from t_gdxs  where xx_bm='0101') g 
on    g.xx_bm=s.xx_bm   and g.zy_bm=s.zy_bm
[其他解释]
引用:
select    g.xs_bm,g.xs_xm,g.xx_bm,s.zy_bm,s.kc_bm
from    td_skkb s inner join (select * from t_gdxs  where xx_bm='0101') g 
on    g.xx_bm=s.xx_bm   and g.zy_bm=s.zy_bm


没用  早试过了
[其他解释]
为什么不在查询条件上建立聚集索引
CREATE INDEX index_name ON t_gdxs (zy_bm,zy_bm)
CREATE CLUSTERED INDEX INDEX_name ON t_gdxs(xx_bm)

我测试过,聚集索引的选择可能会影响到索引的碎片,
但是在查询条件上建立聚集索引,与造成的碎片相比,是值得的。
[其他解释]
把数据库备出来 发给大家 测试下 不是你硬件跟不上吧 
[其他解释]
引用:
可以了吧,还能优化吗,围观一下


本地服务器跑这条语句要8s  浪费不起啊  你看那个表 'T_GDXS'。扫描计数 1,逻辑读取 353 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。逻辑读取次数太多了

还有  我本地服务器不怎么好  可能是其中一个原因吧
[其他解释]
引用:
on ...(xx_bm,zy_bm) include(....) ?



东哥  这个索引建立了的  哈哈  没啥用啊
[其他解释]
引用:
引用:
可以了吧,还能优化吗,围观一下

本地服务器跑这条语句要8s  浪费不起啊  你看那个表 'T_GDXS'。扫描计数 1,逻辑读取 353 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。逻辑读取次数太多了

还有  我本地服务器不怎么好  可能是其中一个原因吧


最终结果多少。?关系是一对一还是一对多?
[其他解释]
lu guo
[其他解释]
引用:
引用:引用:
可以了吧,还能优化吗,围观一下

本地服务器跑这条语句要8s  浪费不起啊  你看那个表 'T_GDXS'。扫描计数 1,逻辑读取 353 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。逻辑读取次数太多了

……


一对多啊  
[其他解释]
引用:
返回593527这么多行,你优化个毛啊!



返回这么多行搞毛线啊

[其他解释]
搞不好你的那几秒钟都用在把数据放到显存上了.
[其他解释]
[yabao=][/yabao]
[其他解释]
  如果要快可用覆盖索引可提高查询效率, 同时会增加维护的开销 
Create index IX_td_skkb_All on td_skkb(xx_bm,zy_bm) INCLUDE(zy_bm,kc_bm)
Create index IX_t_gdxs_All on t_gdxs(xx_bm,zy_bm) INCLUDE(xs_bm,xs_xm,xx_bm)


 
[其他解释]
直接写在select上不用连接会快点
[其他解释]

不懂  
[其他解释]
把并行度设为1
[其他解释]
学习一下经验
[其他解释]
先放几个月,等哥学好了再来回复你
[其他解释]
围观
[其他解释]
create index xxbm_zybm_kcbm_idx on td_skkb(xx_bm,kc_bm,zy_bm)
改为:
create index xxbm_zybm_kcbm_idx on td_skkb(xx_bm,zy_bm,kc_bm)

[其他解释]
看虽然看不大懂。但是顶下也好。楼下大神。。。
[其他解释]
围观,做个记号。
[其他解释]
你确定吗?我觉得有待提高
[其他解释]
应该是查询数据太多了,看一下worktable表就了解了

没有物理读,预读,内存应该是够使的

想快就加大cpu的性能吧
[其他解释]
The relational engine may need to build a worktable to perform a logical operation specified in an SQL statement. Worktables are internal tables that are used to hold intermediate results. Worktables are generated for certain GROUP BY, ORDER BY, or UNION queries. For example, if an ORDER BY clause references columns that are not covered by any indexes, the relational engine may need to generate a worktable to sort the result set into the order requested. Worktables are also sometimes used as spools that temporarily hold the result of executing a part of a query plan. Worktables are built in tempdb and are dropped automatically when they are no longer needed.





[其他解释]
不知道是做什么的数据库,很显然一个数据库的两个表,有两列是存储一样的数据,需要优化一下。
[其他解释]
杀了杀掉会死的哈阿飞的撒化肥
[其他解释]
该回复于2012-11-16 22:32:29被管理员删除
[其他解释]
该回复于2012-11-16 22:32:29被管理员删除
[其他解释]
该回复于2012-11-16 22:36:53被管理员删除
[其他解释]
在这个xx_bm上面加索引
[其他解释]
哇,初学数据库,表示看不懂
[其他解释]
可以拆成两句话的嘛。

我之前试过显示文章栏目及其下级栏目所有文章。

如果用文章表和栏目表inner join  速度还行,不过愿意不如先查出下级的栏目id 
然后直接查询文章表。

速度远远超过 inner join 出来的。其实就是减少了很多运算。
[其他解释]
看不懂。。。。
[其他解释]
学习。学习。
[其他解释]
5w条数据。直接物理读???楼主算算用多少秒。
优化的可能性就只能在那里了。

你直接select一个表5万条数据。是多少??
一句话。优话个毛。
[其他解释]
看虽然看不大懂。但是顶下也好
[其他解释]
有物理读,预读,内存应该是够使的

[其他解释]
学习了。
   期待高手。
[其他解释]
呵呵!认真学习了
[其他解释]
学习中,收藏。
[其他解释]
路过看看。。。
[其他解释]


# include <stdio.h>
int main (void)
{
     return 0;
}

[其他解释]
hj hjgjgyu
[其他解释]
59W行的数,8秒还不满足么?这种情况下,合并连接而且没有排序操作,应该已经是最快的计划了。
如果非要优化,只能考虑减少结果集,如果是最后要输出的结果,我认为如此大的结果集意义不大,如果是计算的中间集,从结果出发,考虑如何减少输出
[其他解释]
create index xxbm_zybm_kcbm_idx on td_skkb(xx_bm,kc_bm,zy_bm)
改为:
create index xxbm_zybm_kcbm_idx on td_skkb(xx_bm,zy_bm,kc_bm)

[其他解释]
该回复于2012-11-17 14:47:07被管理员删除
[其他解释]
..
[其他解释]
看不懂。。。。  
[其他解释]
你们这些高手啊,没事干了是不?
[其他解释]
null
[其他解释]
看不懂。。。。 
------其他解决方案--------------------


这8秒,全费在了网络I/O上。
[其他解释]

引用:
索引,表 碎片整理.


终于逮住一个所谓的高手, 还版主? 这SQL明明是IO瓶颈, 还索引,还碎片整理.

哥们, 你和那些被微软套牢的, 自认为自己懂得新技术, 实际上基本功一塌糊涂的软奴一个样.

回家看看基本功吧.

计算机软件从上个世纪80年代以来就从来没有诞生过新技术, 微软那傻逼的新技术, 只不过是它自己的一些封装罢了, 目的就是为了不停的变换封装, 不停的买新瓶装旧酒.
[其他解释]
兄弟, 5万多条不分页啊, 一次性全取出啊? 8s活该!
[其他解释]
null
[其他解释]
null
[其他解释]
null
[其他解释]
null
[其他解释]
null
[其他解释]
null
[其他解释]
null
[其他解释]
null
[其他解释]
null
[其他解释]
null
[其他解释]
null
[其他解释]
打酱油的
[其他解释]
可以了吧,还能优化吗,围观一下
[其他解释]
on ...(xx_bm,zy_bm) include(....) ?
[其他解释]
引用:
把数据库备出来 发给大家 测试下 不是你硬件跟不上吧


这个不大可能  这里面有数据不能外泄
[其他解释]
 t_gdxs 这个表有啥索引? 没说明啊
[其他解释]
索引是怎么建的?搞来看看,我给些脚本你。等等
[其他解释]
逻辑读就是读你要查询的数据,太多了?sql并不复杂,扫描计数 1,证明这个表没有重复的来回读,那不就是你要查询的数据太多了
[其他解释]
引用:
t_gdxs 这个表有啥索引? 没说明啊


create nonclustered index xxbm_xsbm_zybm_xsxm_idx on t_gdxs(xx_bm,zy_bm)include (xs_bm,xs_xm)

[其他解释]
围观
[其他解释]
未使用的索引:
-- Unused indexes 
SELECT SCH.name + '.' + OBJ.name AS ObjectName 
      ,OBJ.type_desc AS ObjectType 
      ,IDX.name AS IndexName 
      ,IDX.type_desc AS IndexType 
FROM sys.indexes AS IDX 
     LEFT JOIN sys.dm_db_index_usage_stats AS IUS 


         ON IUS.index_id = IDX.index_id 
            AND IUS.object_id = IDX.object_id 
     INNER JOIN sys.objects AS OBJ 
         ON IDX.object_id = OBJ.object_id 
     INNER JOIN sys.schemas AS SCH 
         ON OBJ.schema_id = SCH.schema_id 
WHERE OBJ.is_ms_shipped = 0       -- Exclude MS objects 
      AND OBJ.type IN ('U', 'V')  -- Only user defined tables & views 
      AND IDX.type > 0            -- Ignore heaps 
      AND IDX.is_disabled = 0     -- Disabled indexes aren't used anyway 
      AND IDX.is_primary_key = 0  -- Exclude PK => FK constraints / part of business logic 
      AND IDX.is_unique = 0       -- Exclude unique indexes => part of business logic 
      AND IUS.object_id IS NULL 
ORDER BY ObjectName 
        ,IndexName



执行计划中丢失索引的查询语句:
-- Get all SQL Statements with missing indexes and their cached query plans 
;WITH  
 XMLNAMESPACES 
     (DEFAULT N'http://schemas.microsoft.com/sqlserver/2004/07/showplan'   
             ,N'http://schemas.microsoft.com/sqlserver/2004/07/showplan' AS ShowPlan)       
SELECT ECP.[usecounts]    AS [UsageCounts] 
      ,ECP.[refcounts]    AS [RefencedCounts] 
      ,ECP.[objtype]      AS [ObjectType] 
      ,ECP.[cacheobjtype] AS [CacheObjectType] 
      ,EST.[dbid]         AS [DatabaseID] 
      ,EST.[objectid]     AS [ObjectID] 
      ,EST.[text]         AS [Statement]       
      ,EQP.[query_plan]   AS [QueryPlan] 
FROM sys.dm_exec_cached_plans AS ECP 
     CROSS APPLY sys.dm_exec_sql_text(ECP.[plan_handle]) AS EST 
     CROSS APPLY sys.dm_exec_query_plan(ECP.[plan_handle]) AS EQP 
WHERE ECP.[usecounts] > 1  -- Plan should be used more then one time (= no AdHoc queries) 
      AND EQP.[query_plan].exist(N'/ShowPlanXML/BatchSequence/Batch/Statements/StmtSimple/QueryPlan/MissingIndexes/MissingIndexGroup') <> 0 


ORDER BY ECP.[usecounts] DESC


[其他解释]
create nonclustered index xxbm_xsbm_zybm_xsxm_idx on t_gdxs(xx_bm,zy_bm)include (xs_bm,xs_xm) 这个索引不给力
select * from t_gdxs  where xx_bm='0101' 这条单独执行 要多久?
[其他解释]
引用:
create nonclustered index xxbm_xsbm_zybm_xsxm_idx on t_gdxs(xx_bm,zy_bm)include (xs_bm,xs_xm) 这个索引不给力
select * from t_gdxs  where xx_bm='0101' 这条单独执行 要多久?


毫秒级  
[其他解释]
引用:
为什么不在查询条件上建立聚集索引
CREATE INDEX index_name ON t_gdxs (zy_bm,zy_bm)
CREATE CLUSTERED INDEX INDEX_name ON t_gdxs(xx_bm)

我测试过,聚集索引的选择可能会影响到索引的碎片,
但是在查询条件上建立聚集索引,与造成的碎片相比,是值得的。



[其他解释]
inner join 指定为 nested loop 试试 
[其他解释]
引用:
create nonclustered index xxbm_xsbm_zybm_xsxm_idx on t_gdxs(xx_bm,zy_bm)include (xs_bm,xs_xm) 这个索引不给力
select * from t_gdxs  where xx_bm='0101' 这条单独执行 要多久?


declare @dt datetime
set @dt=getdate()
select g.xs_bm,
g.xs_xm,
g.xx_bm from t_gdxs g where
g.xx_bm='0101'
select datediff(ms,@dt,getdate())
/*
590
*/

[其他解释]
尝试了结果集inner join了么
[其他解释]
create index xxbm_zybm_kcbm_idx on td_skkb(xx_bm,zy_bm)include(kc_bm)
gocreate nonclustered index xxbm_xsbm_zybm_xsxm_idx on t_gdxs(xx_bm,zy_bm)include (xs_bm,xs_xm)
go

索引列要对齐。

还有给SHOWPLAN_TEXT 的结果.
[其他解释]
返回593527这么多行,你优化个毛啊!
[其他解释]
引用:
引用:返回593527这么多行,你优化个毛啊!


返回这么多行搞毛线啊


[其他解释]
引用:
返回593527这么多行,你优化个毛啊!


大叔  没经验的不能那么想么?
[其他解释]
楼主使用临时表,先将记录缩小到临时表里面,然后在处理,这样性能高。

[其他解释]
 有点 蛋疼          看书去
[其他解释]
索引,表 碎片整理.
[其他解释]
高手啊,甘氨酸
[其他解释]
表示我完全看不懂!
------其他解决方案--------------------


该回复于2012-11-17 06:18:52被管理员删除
[其他解释]
好东西哦  谢谢谢谢
[其他解释]
一直也不怎么明白,学习学习!
[其他解释]
learning.
[其他解释]
不是太懂

[其他解释]
null
[其他解释]
null

热点排行