求1优化 关于in的
求一优化 关于in的
SELECT "仓","工艺号","品名","成份","颜色","规格","数量","MYTYPE" FROM YHJ_V_LJXS LSXS --执行要26秒 3万行
SELECT TRIM(DPBHXQ.工艺号)||TRIM(DPBHXQ.颜色) FROM YHJ_V_DPBHXQ2 DPBHXQ --执行1秒,231行
最后:
SELECT "仓","工艺号","品名","成份","颜色","规格","数量","MYTYPE" FROM YHJ_V_LJXS LSXS --26
WHERE
TRIM(LSXS.工艺号||LSXS.颜色) IN
(
SELECT TRIM(DPBHXQ.工艺号)||TRIM(DPBHXQ.颜色) FROM YHJ_V_DPBHXQ2 DPBHXQ --231
)
执行要很长时间,不知大家有好的推荐吗?
------解决思路----------------------
首先建议将in换成exists。另外这个不就是一张表的两个字段对两外一张表的两个字段么
------解决思路----------------------
------解决思路----------------------
创建基于这两个字段的trim联合索引
CREATE INDEX idx_234234 ON YHJ_V_DPBHXQ2(TRIM(工艺号),TRIM(颜色))
------解决思路----------------------
索引都创建了么。。效率怎么会和in一样呢。不理解。
------解决思路----------------------
有什么冗余,通过条件过滤也不够么?难道YHJ_V_DPBHXQ2中有重复数据。。
------解决思路----------------------
试图也可以在对应表上创建索引,否则确实效率不会有提升。。
------解决思路----------------------
看看执行计划就知道了,算法不一样。网上有很多关于in、exists、not in、not exists的用法及性能的对比,其实还要看具体的运行环境。没有绝对的效率高的计划。
------解决思路----------------------
(SELECT TRIM(DPBHXQ.工艺号)
------解决思路----------------------
TRIM(DPBHXQ.颜色)
FROM YHJ_V_DPBHXQ2 DPBHXQ --231
)
做成临时表多好。用with as 也可以。
------解决思路----------------------
你找到视图中这两个字段对应表的出处,在对应的表上增加索引。
加函数级索引,即TRIM(工艺号),TRIM(颜色)
如果来源与多个表可以单独创建索引。
------解决思路----------------------
为什么要用TRIM,表设计有问题?还是数据有问题?
------解决思路----------------------
去空格,可以最后再去,尽量避免在查询条件中使用trim等函数。 如果只是最终数据出来后有重复的,可以最后去重就是了啊
------解决思路----------------------
改成内关联试试
SELECT "仓", "工艺号", "品名", "成份", "颜色", "规格", "数量", "MYTYPE"
FROM (SELECT TRIM(LSXS.工艺号)
------解决思路----------------------
TRIM(LSXS.颜色) AS J
,"仓"
,"工艺号"
,"品名"
,"成份"
,"颜色"
,"规格"
,"数量"
,"MYTYPE"
FROM YHJ_V_LJXS LSXS) A
,(SELECT DISTINCT TRIM(DPBHXQ.工艺号)
------解决思路----------------------
TRIM(DPBHXQ.颜色) AS J
FROM YHJ_V_DPBHXQ2 DPBHXQ) B
WHERE A.J = B.J
------解决思路----------------------
LZ优化脚本,请贴出执行计划。
------解决思路----------------------
数据插入前就控制好数据质量,查询时尽量减少不必要的处理函数,然后即使是视图,也可在原表上加上相关字段的索引,这样会快很多。
------解决思路----------------------
SELECT "仓","工艺号","品名","成份","颜色","规格","数量","MYTYPE" FROM YHJ_V_LJXS LSXS --执行要26秒 3万行
SELECT TRIM(DPBHXQ.工艺号)||TRIM(DPBHXQ.颜色) FROM YHJ_V_DPBHXQ2 DPBHXQ --执行1秒,231行
最后:
SELECT "仓","工艺号","品名","成份","颜色","规格","数量","MYTYPE" FROM YHJ_V_LJXS LSXS --26
WHERE
TRIM(LSXS.工艺号||LSXS.颜色) IN
(
SELECT TRIM(DPBHXQ.工艺号)||TRIM(DPBHXQ.颜色) FROM YHJ_V_DPBHXQ2 DPBHXQ --231
)
执行要很长时间,不知大家有好的推荐吗?
------解决思路----------------------
首先建议将in换成exists。另外这个不就是一张表的两个字段对两外一张表的两个字段么
------解决思路----------------------
SELECT "仓","工艺号","品名","成份","颜色","规格","数量","MYTYPE" FROM YHJ_V_LJXS LSXS
WHERE EXISTS(
SELECT 1 FROM YHJ_V_DPBHXQ2 DPBHXQ WHERE TRIM(DPBHXQ.工艺号)=LSXS.工艺号 AND TRIM(DPBHXQ.颜色)=LSXS.颜色)
------解决思路----------------------
创建基于这两个字段的trim联合索引
CREATE INDEX idx_234234 ON YHJ_V_DPBHXQ2(TRIM(工艺号),TRIM(颜色))
------解决思路----------------------
索引都创建了么。。效率怎么会和in一样呢。不理解。
------解决思路----------------------
有什么冗余,通过条件过滤也不够么?难道YHJ_V_DPBHXQ2中有重复数据。。
------解决思路----------------------
试图也可以在对应表上创建索引,否则确实效率不会有提升。。
------解决思路----------------------
看看执行计划就知道了,算法不一样。网上有很多关于in、exists、not in、not exists的用法及性能的对比,其实还要看具体的运行环境。没有绝对的效率高的计划。
------解决思路----------------------
(SELECT TRIM(DPBHXQ.工艺号)
------解决思路----------------------
TRIM(DPBHXQ.颜色)
FROM YHJ_V_DPBHXQ2 DPBHXQ --231
)
做成临时表多好。用with as 也可以。
------解决思路----------------------
你找到视图中这两个字段对应表的出处,在对应的表上增加索引。
加函数级索引,即TRIM(工艺号),TRIM(颜色)
如果来源与多个表可以单独创建索引。
------解决思路----------------------
为什么要用TRIM,表设计有问题?还是数据有问题?
------解决思路----------------------
去空格,可以最后再去,尽量避免在查询条件中使用trim等函数。 如果只是最终数据出来后有重复的,可以最后去重就是了啊
------解决思路----------------------
改成内关联试试
SELECT "仓", "工艺号", "品名", "成份", "颜色", "规格", "数量", "MYTYPE"
FROM (SELECT TRIM(LSXS.工艺号)
------解决思路----------------------
TRIM(LSXS.颜色) AS J
,"仓"
,"工艺号"
,"品名"
,"成份"
,"颜色"
,"规格"
,"数量"
,"MYTYPE"
FROM YHJ_V_LJXS LSXS) A
,(SELECT DISTINCT TRIM(DPBHXQ.工艺号)
------解决思路----------------------
TRIM(DPBHXQ.颜色) AS J
FROM YHJ_V_DPBHXQ2 DPBHXQ) B
WHERE A.J = B.J
------解决思路----------------------
LZ优化脚本,请贴出执行计划。
------解决思路----------------------
数据插入前就控制好数据质量,查询时尽量减少不必要的处理函数,然后即使是视图,也可在原表上加上相关字段的索引,这样会快很多。
------解决思路----------------------