Performance 是否可以从Sybase函数返回数字列表?

Performance 是否可以从Sybase函数返回数字列表?,performance,function,types,return,sybase-asa,Performance,Function,Types,Return,Sybase Asa,我试图克服一个非常严重的性能问题,Sybase拒绝在一个大表上使用主键索引,因为其中一个必填字段是通过另一个表间接指定的,或者换句话说 SELECT ... FROM BIGTABLE WHERE KFIELD = 123 在ms中运行,但 SELECT ... FROM BIGTABLE, LTLTBL WHERE KFIELD = LTLTBL.LOOKUP AND LTLTBL.UNIQUEID = 'STRINGREPOF123' 需要30-40秒 我已经设法解决了第一个问题

我试图克服一个非常严重的性能问题,Sybase拒绝在一个大表上使用主键索引,因为其中一个必填字段是通过另一个表间接指定的,或者换句话说

SELECT ... FROM BIGTABLE WHERE KFIELD = 123
在ms中运行,但

SELECT ... FROM BIGTABLE, LTLTBL WHERE KFIELD = LTLTBL.LOOKUP 
   AND LTLTBL.UNIQUEID = 'STRINGREPOF123'
需要30-40秒

我已经设法解决了第一个问题,通过使用一个基本上可以让我这么做的函数

SELECT ... FROM BIGTABLE WHERE KFIELD = MYFUNC('STRINGREPOF123')
这也适用于ms

然而,问题是,这种方法仅在
MYFUNCT
返回单个值时有效,但在某些情况下,它可能返回2或3个值

我知道SQL

SELECT ... FROM BIGTABLE WHERE KFIELD IN (123,456,789)
也以毫秒为单位返回,所以我想要一个函数,它返回一个可能值的列表,而不仅仅是一个值-这可能吗


遗憾的是,该应用程序正在Sybase ASA 9上运行。是的,我知道它很旧,计划刷新,但现在我无能为力,因此我需要使用此版本的DB的逻辑。

使用临时表存储您的号码怎么样?因此,您的sql将如下所示:

    select kfield into #tmpKfield 
    from littleTable 
    where UNIQUEID = 'STRINGREPOF123'

    select * from bigTable 
    where kfield in (select kfield from #tmpKfield)
    go

    drop table #tmpKfield
    go

这就是我试图解决您的问题的方法。

表上的标记是什么,showplan显示了什么,这些字段的模式是什么?这有点牵扯其中。首先,BIGTABLE实际上是一个视图,我是Sybase的新手,所以我不知道确切的术语,但它作为一个跨多个物理表的分区表有效地工作(实现可能更隐式)。基础表有一个主索引KFIELD,DATEVALUE,我实际将其传递到查询中(查询过于简化)。showplan显示它正在进行一次完整的表扫描,而不是使用主键,这就是问题所在。还有第二个索引仅基于DATEVALUE,这实际上是优化器正在选择的。这适用于多个分区,因为在该间隔内没有或只检索到少量记录(尽管它仍然不如使用主键那么有效,因此我仍然感到困惑)。但是,一旦它到达具有选定时间间隔的大多数记录的表,它将被迫执行完整的表扫描。似乎优化器在尝试预取数据表时有点操之过急,但我真的没有足够的经验来确定。不幸的是,我只知道ASE,但我会从