大家帮忙看看能不能优化这个IN语句

winnet 2013-08-24 12:10:09
求优化:
SELECT * FROM pds_buy WHERE p_dt BETWEEN '1999-01-01' AND '2013-09-01'
AND p_buyid in (select distinct p_buyid from pds_buy_product where p_id like '%33300%')
以上这句执行结果为37秒

把上面二句单独
SELECT * FROM pds_buy WHERE p_dt BETWEEN '1999-01-01' AND '2013-09-01' (时间0.125S)

select distinct p_buyid from pds_buy_product where p_id like '%33300% (时间0.062S)

组合为IN后,结果36 37秒,有没什么优化方法,注意,第二表pds_buy_product 不能放进前面的FROM中,
因为这个是程序组合条件进去的,如果没有这个条件,就不用的,所以在FROM中加上第二个表是不行的
...全文
290 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
winnet 2013-08-24
  • 打赏
  • 举报
回复
引用 9 楼 rockyljt 的回复:

SELECT * FROM pds_buy WHERE p_dt<='2013-09-01' --改成这样就行了
 AND p_buyid in (select distinct p_buyid from pds_buy_product where p_id like '%33300%')
小数据库,没有加索引的,这个主要是IN的速度问题,我还是改原来的吧,多谢大家
---涛声依旧--- 2013-08-24
  • 打赏
  • 举报
回复

SELECT * FROM pds_buy WHERE p_dt<='2013-09-01' --改成这样就行了
 AND p_buyid in (select distinct p_buyid from pds_buy_product where p_id like '%33300%')
---涛声依旧--- 2013-08-24
  • 打赏
  • 举报
回复
那p_dt 、p_buyid建议索引肯定快了 
Shawn 2013-08-24
  • 打赏
  • 举报
回复
--#1.先缓存结果集2到表变量(有主键)
DECLARE @temp TABLE(p_buyid INT NOT NULL PRIMARY KEY)
INSERT @temp(p_buyid)
select distinct p_buyid from pds_buy_product where p_id like '%33300%'

--#2.用下面2种方法均可:
SELECT a.* 
FROM pds_buy a
	INNER JOIN @temp b
		ON a.p_buyid = b.p_buyid
WHERE a.p_dt BETWEEN '1999-01-01' AND '2013-09-01'

SELECT * 
FROM pds_buy a
WHERE a.p_dt BETWEEN '1999-01-01' AND '2013-09-01'
AND EXISTS
(
	SELECT 1
	FROM @temp B
	WHERE b.p_buyid = a.p_buyid
)
winnet 2013-08-24
  • 打赏
  • 举报
回复
引用 4 楼 hdhai9451 的回复:
SELECT * 
FROM pds_buy a
inner join (select distinct p_buyid from pds_buy_product where p_id like '%33300%') b
on a.p_buyid=b.p_buyid
WHERE a.p_dt BETWEEN '1999-01-01' AND '2013-09-01'
这个时间是很快0.046秒,但是,我不能这样用,因为我FROM中是做好了,后面的我只是加了条件,不过我想想有没办法去改变我原来的
winnet 2013-08-24
  • 打赏
  • 举报
回复
引用 2 楼 rockyljt 的回复:

SELECT * FROM pds_buy t1 
WHERE p_dt BETWEEN '1999-01-01' AND '2013-09-01'
 AND  EXISTS(select 1 from pds_buy_product where t1.p_buyid=p_buyid AND p_id like '%33300%')
我这个方法也写了测试过,同样要这么时间,反而多二秒左右
Andy__Huang 2013-08-24
  • 打赏
  • 举报
回复
SELECT * 
FROM pds_buy a
inner join (select distinct p_buyid from pds_buy_product where p_id like '%33300%') b
on a.p_buyid=b.p_buyid
WHERE a.p_dt BETWEEN '1999-01-01' AND '2013-09-01'
wwx851285 2013-08-24
  • 打赏
  • 举报
回复
楼上正解~~~
---涛声依旧--- 2013-08-24
  • 打赏
  • 举报
回复

SELECT * FROM pds_buy t1 
WHERE p_dt BETWEEN '1999-01-01' AND '2013-09-01'
 AND  EXISTS(select 1 from pds_buy_product where t1.p_buyid=p_buyid AND p_id like '%33300%')
hgwyl 2013-08-24
  • 打赏
  • 举报
回复

--如果p_dt是个聚集索引的话,试试先利用一下
SELECT * from
(
SELECT * FROM pds_buy WHERE p_dt BETWEEN '1999-01-01' AND '2013-09-01'
)
where xxoo
内容概要:本文围绕“可再生能源发电与电动汽车的协同调度策略”展开硕士论文级别的研究与复现工作,基于Matlab平台构建了高比例可再生能源接入背景下电力系统与电动汽车(EV)之间的多时间尺度协同优化模型。研究重点在于应对风光发电不确定性,充分利用电动汽车作为移动储能单元的灵活充放电能力(含V2G技术),实现电网削峰填谷、提升新能源消纳效率与系统运行经济性。文中综合考虑了异质电动车集群特性、V2G过程中的损耗约束以及随机因素影响,采用如深度确定性策略梯度(DDPG)强化学习、混合整数线性规划(MILP)等先进优化算法进行求解,并通过基准模型对比验证了所提自适应调度策略在提升电网稳定性、降低运行成本方面的有效性。; 适合人群:具备一定电力系统基础知识、优化理论背景及Matlab编程能力的研究生、科研人员,以及从事新能源并网、智能电网调度、车网互动(V2G)等方向的工程技术人员。; 使用场景及目标:①学习并复现已发表高水平硕士论文中的协同调度建模方法与仿真流程;②掌握将深度强化学习(如DDPG)应用于虚拟电厂、电动汽车集群调度等复杂非线性决策问题的技术路径;③为开展新能源消纳、需求侧响应、微电网优化运行等相关课题的研究提供可复用的代码框架与创新思路参考。; 阅读建议:建议读者结合文中提供的完整Matlab代码与技术文档,深入理解模型构建逻辑、算法实现细节与参数设置依据,优先在Simulink/Matlab环境中运行并调试仿真案例,通过调整场景参数与算法超参,探究不同策略对调度效果的影响,从而深化对协同调度机制与智能优化方法应用的理解。

34,875

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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