我正在尝试克服一个非常严重的性能问题,其中Sybase拒绝在大型表上使用主键索引,因为其中一个必需字段是通过另一个表间接指定的 - 或者换句话说;
SELECT ... FROM BIGTABLE WHERE KFIELD = 123
以毫秒运行,但
SELECT ... FROM BIGTABLE, LTLTBL WHERE KFIELD = LTLTBL.LOOKUP
AND LTLTBL.UNIQUEID = 'STRINGREPOF123'
需要30到40秒。
我设法通过使用基本上允许我这样做的功能来解决第一个问题;
SELECT ... FROM BIGTABLE WHERE KFIELD = MYFUNC('STRINGREPOF123')
也以毫秒运行。
然而,问题是这种方法仅在MYFUNCT
返回单个值时才有效,但我有一些情况可能会返回2或3个值。
我知道SQL
SELECT ... FROM BIGTABLE WHERE KFIELD IN (123,456,789)
也以毫秒为单位返回,所以我希望有一个函数返回一个可能的值列表,而不仅仅是一个 - 这可能吗?
遗憾的是,应用程序正在Sybase ASA 9上运行。是的我知道它已经过时并且计划刷新,但现在我无能为力,因此我需要能够使用此版本数据库的逻辑。
答案 0 :(得分: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
这就是我试图解决你的问题的方法。