首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • 帮研究下提高过滤重复字段的高效查询SQL [已结贴,结贴人:tiancaolin]
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • tiancaolin
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    • 揭帖率:
    发表于:2008-06-26 17:29:30 楼主
      一个产品表,客户发布了很多他公司的产品。目前以2万条记录来查询
    其中我要查询的结果是一个企业只能在列表页中显示一条产品。

    我SQL如下:
    select sawsca.SawTitle,sawsca.SawScaContect,sawsca.SawAddDate,sawsca.SawScaSort,sawsca.SawThumbPic
    from sawsca
    where sawid =(
    select max(sawid)
    from sawsca bb
    where sawsca.SawCompanyID=bb.SawCompanyID
    )


    发现在查询分析器中执行的时间竟然有30多秒多。难以忍受。且这个结果集还要跟其他表进行关联。那不是更行不通。

    后面想弄成几个方案:
    1.本命令弄到SQL执行计划中去定时执行然后把结果集筛选到一个固定表中也就是采用冗余法优化性能
    但感觉数据量不大,应该不必要这样;
    2.看有没有更好的查询方法或正对这个进行优化
    具体说有没有更好性能的此查询算法。大家帮研究下。另外。如何给这条SQL做索引优化。目前讲SQL索引优化方面自己比较没经验。看了一些文章。也看不大懂要怎么索引优化比较好
    200  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • SQLnewlearner
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-06-26 17:30:591楼 得分:0
    这个好像没有更好的查法了。mark 学习。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • lgxyz
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-06-26 17:43:162楼 得分:10
    SQL code
    SELECT SAWSCA.SAWTITLE,SAWSCA.SAWSCACONTECT,SAWSCA.SAWADDDATE,SAWSCA.SAWSCASORT,SAWSCA.SAWTHUMBPIC FROM SAWSCA WHERE CHECKSUM(*) IN( SELECT TOP 1 CHECKSUM(*) FROM SAWSCA BB WHERE SAWSCA.SAWCOMPANYID=BB.SAWCOMPANYID ORDER BY SAWID DESC )


    不知道这个怎样
    试下
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • tiancaolin
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-06-26 17:48:173楼 得分:0
    引用 2 楼 lgxyz 的回复:
    SQL code
    SELECT SAWSCA.SAWTITLE,SAWSCA.SAWSCACONTECT,SAWSCA.SAWADDDATE,SAWSCA.SAWSCASORT,SAWSCA.SAWTHUMBPIC
    FROM SAWSCA
    WHERE CHECKSUM(*) IN(
    SELECT TOP 1 CHECKSUM(*)
    FROM SAWSCA BB
    WHERE SAWSCA.SAWCOMPANYID=BB.SAWCOMPANYID ORDER BY SAWID DESC
    )


    不知道这个怎样
    试下


    公司ID是重复的。
    我改成你那个查询。晕,原本是34秒查出结果。你那个要花好几分钟
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • lgxyz
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-06-26 17:55:494楼 得分:0

    SQL code
    SELECT A.SAWTITLE,A.SAWSCACONTECT,A.SAWADDDATE,A.SAWSCASORT,A.SAWTHUMBPIC FROM SAWSCA A WHERE NOT EXISTS( SELECT 1 FROM SAWSCA WHERE SAWCOMPANYID=A.SAWCOMPANYID AND SAWID>A.SAWID )

    那这样呢?
    还不行,等高手过来吧
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • ranzj
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-06-26 18:00:185楼 得分:5
    楼主那个语句已经很不错了.

    但 30 多秒的耗时,对于 2 万条记录来说, 的确的有些长了.


    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • sweetweiwei
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-06-26 18:01:076楼 得分:0
    --try
    select sawsca.SawTitle,sawsca.SawScaContect,sawsca.SawAddDate,sawsca.SawScaSort,sawsca.SawThumbPic
    from sawsca
    inner join
    (select SawCompanyID,max(sawid) as 'sawid'
    from sawsca group by SawCompanyID
    ) b on sawsca.SawCompanyID = b.SawCompanyID and sawsca.sawid = b.sawid

    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • tiancaolin
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-06-26 18:16:337楼 得分:0
    引用 6 楼 sweetweiwei 的回复:
    --try
    select sawsca.SawTitle,sawsca.SawScaContect,sawsca.SawAddDate,sawsca.SawScaSort,sawsca.SawThumbPic
    from sawsca
    inner join
    (select SawCompanyID,max(sawid) as 'sawid'
    from sawsca group by SawCompanyID
    ) b on sawsca.SawCompanyID = b.SawCompanyID and sawsca.sawid = b.sawid

    速度上和我写的那个差不多。没多大优化
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • perfectaction
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-06-26 18:17:028楼 得分:105
    SQL code
    --这样: --加索引 create index idx_01 on sawsca (SawCompanyID,sawid) --用这个语句查: select sawsca.SawTitle,sawsca.SawScaContect,sawsca.SawAddDate,sawsca.SawScaSort,sawsca.SawThumbPic from sawsca as a inner join ( select max(sawid) from sawsca group by SawCompanyID ) as b on a.SawCompanyID=b.SawCompanyID
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • perfectaction
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-06-26 18:18:179楼 得分:0
    引用 8 楼 perfectaction 的回复:
    SQL code--这样:

    --加索引
    create index idx_01 on sawsca (SawCompanyID,sawid)
    --用这个语句查:
    select sawsca.SawTitle,sawsca.SawScaContect,sawsca.SawAddDate,sawsca.SawScaSort,sawsca.SawThumbPic
    from sawsca as a
    inner join
    (
        select max(sawid) from sawsca group by SawCompanyID
    ) as b on a.SawCompanyID=b.SawCompanyID

    少了个字段,改下:
    SQL code
    --这样: --加索引 create index idx_01 on sawsca (SawCompanyID,sawid) --用这个语句查: select sawsca.SawTitle,sawsca.SawScaContect,sawsca.SawAddDate,sawsca.SawScaSort,sawsca.SawThumbPic from sawsca as a inner join ( select max(sawid)as sawid from sawsca group by SawCompanyID ) as b on a.SawCompanyID=b.SawCompanyID and a.sawid =b.sawid
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • perfectaction
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-06-26 18:19:2410楼 得分:0
    SQL code
    select a.SawTitle,a.SawScaContect,a.SawAddDate,a.SawScaSort,a.SawThumbPic from sawsca as a inner join ( select max(sawid)as sawid from sawsca group by SawCompanyID ) as b on a.SawCompanyID=b.SawCompanyID and a.sawid =b.sawid
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • tiancaolin
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-06-26 18:20:3011楼 得分:0
    SQL code
    SELECT A.SAWTITLE,A.SAWSCACONTECT,A.SAWADDDATE,A.SAWSCASORT,A.SAWTHUMBPIC
    FROM SAWSCA A
    WHERE NOT EXISTS(
    SELECT 1 FROM SAWSCA
    WHERE SAWCOMPANYID=A.SAWCOMPANYID AND SAWID>A.SAWID
    )


    那这样呢?
    还不行,等高手过来吧
    [/Quote]

    ==============
    这个速度确实是快很多。不过我看不懂SQL是不是符合过滤重复字段。我再研究下not exits
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • tiancaolin
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-06-26 18:27:0612楼 得分:0
    perfectaction
    的查询性质很像我写的那个。不过你是采用组合索引。我等下试看看。

    =========
    能帮我分析下11楼我引用的那个人的查询是不是正确吗?真有点看不懂
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • perfectaction
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-06-26 18:34:1013楼 得分:0
    原理是不一样的.
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • hanjs
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-06-26 20:50:2914楼 得分:20
    lz的应该是nestloop吧??

    to perfectaction

    --加索引
    create index idx_01 on sawsca (SawCompanyID,sawid)
    --用这个语句查:
    select sawsca.SawTitle,sawsca.SawScaContect,sawsca.SawAddDate,sawsca.SawScaSort,sawsca.SawThumbPic
    from sawsca as a
    inner join
    (
        select SawCompanyID,max(sawid)as sawid  from sawsca group by SawCompanyID
    ) as b on a.SawCompanyID=b.SawCompanyID and a.sawid =b.sawid
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • hanjs
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-06-26 20:53:5615楼 得分:0
    lz要显示一条,为何不直接 top 1 sawid,为何非要取max??
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • perfectaction
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-06-26 20:55:2816楼 得分:0
    引用 14 楼 hanjs 的回复:
    lz的应该是nestloop吧??

    to perfectaction

    --加索引
    create index idx_01 on sawsca (SawCompanyID,sawid)
    --用这个语句查:
    select sawsca.SawTitle,sawsca.SawScaContect,sawsca.SawAddDate,sawsca.SawScaSort,sawsca.SawThumbPic
    from sawsca as a
    inner join
    (
    selectSawCompanyID,max(sawid)as sawid  from sawsca group by SawCompanyID
    ) as b on a.SawCompanyID=b.SawCompanyID and a.sawid =b.sawid


    无论是in,还是exists,使用nestloop的概率极大,会造成大量的扫描,从而是io读取很大,性能较差.
    我的写法应该是使用merge join的概率极大,在用索引的请况下,速度应该比nestloop要好.
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • DVD_01
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-06-26 21:21:2217楼 得分:10
    select sawsca.SawTitle,sawsca.SawScaContect,sawsca.SawAddDate,sawsca.SawScaSort,sawsca.SawThumbPic
    from sawsca
    where sawid =(
    select max(sawid)
    from sawsca bb
    where sawsca.SawCompanyID=bb.SawCompanyID
    )


    发现在查询分析器中执行的时间竟然有30多秒多。

    语句是没有问题的,通过执行计划看哪一步骤性能最低,再做决定,只看语句只能说,可以在SawCompanyID建立一个非聚集索引。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • hery2002
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    • 2

      2

    发表于:2008-06-26 21:27:0318楼 得分:0
    SQL code
    -- try select a.SawTitle,a.SawScaContect,a.SawAddDate,a.SawScaSort,a.SawThumbPic from sawsca a where a.sawid =( select max(sawid) from sawsca where a.SawCompanyID=SawCompanyID) --应该和子查询,NOT EXITS差不多,关键是要建好索引.
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • hery2002
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    • 2

      2

    发表于:2008-06-26 21:28:2519楼 得分:30
    -- try
    -- 只取一条,top 1也可以.
    select a.SawTitle,a.SawScaContect,a.SawAddDate,a.SawScaSort,a.SawThumbPic from sawsca a where a.sawid =( select top 1 sawid from sawsca where a.SawCompanyID=SawCompanyID)
    --应该和子查询,NOT EXITS差不多,关键是要建好索引.
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • zhenaiyongheng
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-06-26 21:31:3620楼 得分:10
    引用 12 楼 tiancaolin 的回复:
    perfectaction
    的查询性质很像我写的那个。不过你是采用组合索引。我等下试看看。

    =========
    能帮我分析下11楼我引用的那个人的查询是不是正确吗?真有点看不懂


    perfect..的方法能减少表的扫描次数,应该是最好的解决方案,前提是要有索引
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • tiancaolin
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-06-26 21:41:5021楼 得分:0
    引用 18 楼 hery2002 的回复:
    SQL code
    -- try
    select a.SawTitle,a.SawScaContect,a.SawAddDate,a.SawScaSort,a.SawThumbPic from sawsca a where a.sawid =( select max(sawid) from sawsca where a.SawCompanyID=SawCompanyID)
    --应该和子查询,NOT EXITS差不多,关键是要建好索引.


    ==============
    和尚,看来你做题不看题目。呵呵
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • roy_88
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    • 2

      4

    发表于:2008-06-26 22:04:5822楼 得分:5
    处理方法整理:
    http://topic.csdn.net/u/20080626/00/43d0d10c-28f1-418d-a05b-663880da278a.html
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • cxmcxm
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-06-26 22:21:2023楼 得分:0
    对相关字段建索引。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • xiaogang107
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-06-27 10:07:3824楼 得分:0
    对数据库的研究较少,帮顶一下
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • cacar2008
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-06-27 11:31:3025楼 得分:5
    SawThumbPic 是Image字段吗?如果是性能大概在这里
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • tiancaolin
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-06-27 12:42:3826楼 得分:0
    不是是记录图片地址而已
    另外大家可以把这个模块跟
    http://topic.csdn.net/u/20080627/11/5b24077f-f82e-487d-9b39-4a3c064add96.html?seed=2021481424
    结合起来到我贴出来的这个地址的帖子上想想
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天