kettle中如果用传参查询会变慢是啥原因
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了kettle中如果用传参查询会变慢是啥原因相关的知识,希望对你有一定的参考价值。
查询条件如果写死的话查询会很快,但是如果使用上一步传过来的参数作为查询条件就很慢
参考技术A 使用Merge Join,按照你说的“同时在两个filed里面的数据被筛选出来”,应该使用内连接【INNER】方式,然后再在后续步骤中将自己需要的字段输出。追问我是单表查询,
为啥在视图中使用此查询会变慢?
【中文标题】为啥在视图中使用此查询会变慢?【英文标题】:Why is this query slower when used in a view?为什么在视图中使用此查询会变慢? 【发布时间】:2013-10-11 15:13:14 【问题描述】:我有这个问题:
SELECT * FROM
(
SELECT LASTNAME,NAME,STREET,PHONE,ID_CARD
FROM PHONES1..TVPHONES
UNION ALL
SELECT LASTNAME,NAME,STREET,PHONE,ID_CARD
FROM PHONES2..TVPHONES
UNION ALL
SELECT LASTNAME,NAME,STREET,PHONE,ID_CARD
FROM PHONES3..TVPHONES
) q
WHERE ID_CARD = 'B5XXXXXXX'
此查询需要 0.03 秒才能完成,但如果我将其转换为视图并执行相同的搜索:
ALTER VIEW [dbo].[BTPHONES]
AS
SELECT * FROM
(
SELECT LASTNAME,NAME,STREET,PHONE,ID_CARD
FROM PHONES1..TVPHONES
UNION ALL
SELECT LASTNAME,NAME,STREET,PHONE,ID_CARD
FROM PHONES2..TVPHONES
UNION ALL
SELECT LASTNAME,NAME,STREET,PHONE,ID_CARD
FROM PHONES3..TVPHONES
) q
GO
-- ------------------------
SELECT TOP 1 * FROM dbo.BTPHONES
WHERE ID_CARD = 'B5XXXXXXX'
大约需要 3 分钟!为什么需要这么长时间?
计划01:
计划02:
【问题讨论】:
你对比过实际的执行计划吗? 我运行了 CTRL + L。在第一种情况下,大部分查询的成本为 0%。相比之下,在第二种情况下,成本从 40% 到 60% 不等 @csotelo 您应该将其发布为答案 另外,查询是不等价的 - 顶部只返回所有结果,底部必须选择任意 TOP 1。为什么使用没有 ORDER BY 的 TOP 1? 添加TOP 1
可以大大改变计划(鼓励嵌套循环等非阻塞运算符)
【参考方案1】:
第二种情况等价于:
SELECT TOP 1 * FROM (
SELECT * FROM
(
SELECT LASTNAME,NAME,STREET,PHONE,ID_CARD
FROM PHONES1..TVPHONES
UNION ALL
SELECT LASTNAME,NAME,STREET,PHONE,ID_CARD
FROM PHONES2..TVPHONES
UNION ALL
SELECT LASTNAME,NAME,STREET,PHONE,ID_CARD
FROM PHONES3..TVPHONES
) q
)
WHERE ID_CARD = 'B5XXXXXXX'
优化器可能没有意识到它可以将 where 子句应用于每个内部选择。相反,它会创建整个表的并集,然后对结果进行全面扫描以应用 where 子句。
【讨论】:
以上是关于kettle中如果用传参查询会变慢是啥原因的主要内容,如果未能解决你的问题,请参考以下文章
SQLITE查询速度很慢是啥原因呢,两个语句差异明显,请高人解释