Можно ли вернуть список номеров из функции Sybase?

Я пытаюсь преодолеть очень серьезную проблему с производительностью, когда 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')

который также работает в ms.

Проблема, однако, в том, что этот подход работает только тогда, когда есть одно значение, возвращаемое MYFUNCT, но у меня есть некоторые случаи, когда он может возвращать 2 или 3 значения.

Я знаю, что SQL

SELECT ... FROM BIGTABLE WHERE KFIELD IN (123,456,789)

также возвращает в миллисекундах, поэтому я хотел бы иметь функцию, которая возвращает список возможных значений, а не только одно - возможно ли это?

К сожалению, приложение работает на Sybase ASA 9. Да, я знаю, что оно устарело и его планируется обновить, но сейчас я ничего не могу с этим поделать, поэтому мне нужна логика, которая будет работать с этой версией БД.


person ps_rs4    schedule 14.05.2010    source источник
comment
какие показатели в таблицах, что показывает showplan и какова схема этих полей?   -  person mmmmmm    schedule 14.05.2010
comment
Это немного сложно. Во-первых, BIGTABLE на самом деле является представлением, я новичок в Sybase, поэтому я не знаю точной терминологии, но она эффективно работает как секционированная таблица, распределенная по нескольким физическим таблицам (реализация может быть более неявной). Базовые таблицы имеют первичный индекс KFIELD, DATEVALUE, который я фактически передаю в запрос (запрос был упрощен). Showplan показывает, что он выполняет полное сканирование таблицы, а не использует первичный ключ, который является проблемой.   -  person ps_rs4    schedule 14.05.2010
comment
Существует второй индекс, основанный только на DATEVALUE, который на самом деле выбирает оптимизатор. Это работает для нескольких разделов, поскольку для этого интервала не извлекается ни одна запись или только небольшое количество записей (хотя это все еще не так эффективно, как использование первичного ключа, и поэтому я все еще запутался). Но как только он попадает в таблицу, содержащую большинство записей за выбранный интервал времени, он вынужден выполнить полное сканирование таблицы. Кажется, что оптимизатор немного торопится, пытаясь предварительно получить таблицу данных, но у меня действительно недостаточно опыта, чтобы сказать наверняка.   -  person ps_rs4    schedule 14.05.2010
comment
К сожалению, я знаю только ASE, но я бы начал с sybase.com/detail?id=1023801   -  person mmmmmm    schedule 17.05.2010


Ответы (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

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

person JonnyWizz    schedule 20.07.2011