如果给定以下查询返回表中的所有条目或仅匹配当前日期的条目,如何优化此查询? 顺便说一句:查询的目标是MS Sql 2005上的Oracle链接服务器作为内联函数..不希望这是一个表值函数..
ALTER function [dbo].[ftsls031nnnHades](@withExpiredEntries bit =0)
returns table as return
select *
from openQuery(Hades ,"select '010' comno,
trim(t$cuno) t$cuno,
trim(t$cpgs) t$cpgs,
t$dile,
t$qanp,
to_char(t$stdt,'dd Mon yy') t$stdt,
to_char(t$tdat,'dd Mon yy') t$tdat,
to_char(t$disc,'999.99') t$disc,
t$damt,
t$cdis,
t$gnpr,
t$refcntd,
t$refcntu
from baan.ttdsls031010
where (to_char(t$Tdat,'yyyy-mm-dd') >= To_char(current_date,'yyyy-mm-dd'))
and (to_char(t$stdt,'yyyy-mm-dd') <= To_char(current_date,'yyyy-mm-dd'))
union all
select '020' comno,
trim(t$cuno) t$cuno,
trim(t$cpgs) t$cpgs,
t$dile,t$qanp,
to_char(t$stdt,'dd Mon yy') t$stdt,
to_char(t$tdat,'dd Mon yy') t$tdat,
to_char(t$disc,'999.99') t$disc,
t$damt,
t$cdis,
t$gnpr,
t$refcntd,
t$refcntu
from baan.ttdsls031020
where (to_char(t$tdAt,'yyyy-mm-dd') >= To_char(current_date,'yyyy-mm-dd'))
and (to_char(t$stdt,'yyyy-mm-dd') <= To_char(current_date,'yyyy-mm-dd')) ")
p.s:列命名约定对于那些非BaaN的人来说可能是陌生的。请将我的“BaaN”约定提交到StackOverflow中。
答案 0 :(得分:3)
永远不要对日期列执行任何功能处理(t $ Tdat和t $ stdt属于这种类型,不是吗?),除非你有相应的基于函数的索引。这种方法不允许您在t $ stdt和t $ Tdat上使用索引并显着降低性能。
相反,我会用以下方式重写where子句:
where t$Tdat >= current_date and t$stdt <= current_date
如果current_date
属于date
类型。如果不是,那么您可以使用to_date(current_date, 'DD-MM-YYYY')
代替它。
答案 1 :(得分:1)
以防be here now
的提示 - 这是一个好的 - 不起作用:
你需要收集一些数据才能知道花费的时间。请阅读此OTN线程以了解如何为Oracle执行此操作:http://forums.oracle.com/forums/thread.jspa?messageID=1812597。对于SQL Server,适用相同的原则:使用他们的工具找出此查询花费时间的位置。
您可以分享的一些一般信息是:
此致 罗布。
答案 2 :(得分:0)
不确定这会提高多少性能,但我要做的第一件事就是用日期函数替换日期到字符串转换。也就是说,使用trunc()而不是to_char()。
答案 3 :(得分:0)
通过以下方式,您可以优化Baan查询