2

我试图克服一个非常严重的性能问题,即 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 上运行。是的,我知道它已经过时并且计划进行更新,但我现在对此无能为力,因此我需要可以与此版本的数据库一起使用的逻辑。

4

1 回答 1

1

使用临时表来存储您的号码怎么样?所以你的 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

这就是我尝试解决您的问题的方式。

于 2011-07-20T14:14:29.470 回答