Можно ли вернуть список чисел из функции Sybase? - PullRequest
2 голосов
/ 14 мая 2010

Я пытаюсь преодолеть очень серьезную проблему производительности, из-за которой 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. Да, я знаю, что оно старое и его обновление планируется, но сейчас я ничего не могу с этим поделать, поэтому мне нужна логика, которая будет работать с этой версией БД.

1 Ответ

1 голос
/ 20 июля 2011

Как насчет использования временной таблицы для хранения ваших номеров? Таким образом, ваш 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

Вот так я пытаюсь решить вашу проблему.

...