代码之家  ›  专栏  ›  技术社区  ›  TonyP

如何优化此查询?

  •  0
  • TonyP  · 技术社区  · 15 年前

    如果下面的查询返回表中的所有条目或仅与当前日期匹配的条目,如何优化此查询? btw:查询的目标是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的列命名约定不同。请原谅我在stackoverflow中提出了“baan”约定。

    3 回复  |  直到 15 年前
        1
  •  3
  •   Kirill Leontev    15 年前

    永远不要对日期列执行任何功能处理(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') 而不是它。

        2
  •  1
  •   Rob van Wijk    15 年前

    以防万一 be here now 的小费——这是一个很好的小费——不起作用: 你需要收集一些数据来知道时间花在哪里。请阅读此OTN线程以了解如何为Oracle执行此操作: http://forums.oracle.com/forums/thread.jspa?messageID=1812597 . 对于SQL Server,同样的原则也适用:使用它们的工具来找出这个查询花在哪里。

    您可以共享的一些一般信息是:

    • 这两张桌子有几行
    • 该查询返回了多少行
    • 这两个表上有哪些索引
    • 查询当前需要多长时间
    • 什么响应时间可以接受,即什么时候完成调整

    当做, Rob。

        3
  •  0
  •   Jon Heller TenG    15 年前

    不确定这将在多大程度上提高性能,但我要做的第一件事是用日期函数替换日期到字符串的转换。也就是说,使用trunc()而不是to_char()。

    推荐文章