51
қарапайым функциялар мен айнымалы параметрлі функциялар арасында
болуы мүмкін. Мысалы, foo(numeric) және foo(VARIADIC numeric[])
функцияларын құрылады. Бұл жағдайда бір сандық аргументті, мысалы
foo(10.1), жіберуде қай функция таңдалу керектігі айқын емес. Осы мәселені
шешуде іздеу жолымен бірінші табылған функция таңдалынады; егер екі
функция бір сұлбада орналасса, тұрақты аргуметті функция таңдалынады.
С тіліндегі функцияларды қайта жүктегенде қосымша шектеу бар: С
деңгейінің қайта жүктелген фунциялар жанұясындағы әрбір функциялар атауы
басқа С басқа деңгейлерінің, ішкі және динамикалық жүктелген функциялар
атауынан өзгеше болу керек. Егер осы ереже бұзылған жағдайда, оның
іс
әрекеті қоршаған ортадан тәуелді. Пайдаланушы орындау кезінде
жиынтықтау қателігін алуы мүмкін немесе басқа функция шақырылады
(әдетте ішкі). CREATE FUNCTION SQL
командасы үшін AS сөйлемінің
альтрнатиыті формасы SQL
функция атауын С тіліндегі бастапқы кодттан
ажыратуға мүмкіндік береді. Мысалы:
CREATE FUNCTION test(int) RETURNS int
AS 'файл_аты', 'test_1arg'
LANGUAGE C;
CREATE FUNCTION test(int, int) RETURNS int
AS 'файл_аты', 'test_2arg'
LANGUAGE C;
С тіліндегі функциялар аты көптеген белгілі бір мүмкін ережелерге
сүйенеді.
6.5 Функциялардың өзгергіш категориясы
Әрбір функция мұмкін нұсқаларымен үшін өзгергіш сипаттамасы
анықталады: VOLATILE, STABLE және IMMUTABLE. Егер осы сипаттама
CREATE FUNCTION командасында айқын берілмесе, әдепкі бойынша
VOLATILE аталынады. Өзгергіш категориясы өзімен оптимизатор үшін
кейбір функцияның әрекетіне уәде ретінде көрсетіледі:
- Өзгергіш функциясы (VOLATILE) кез келген нәрсе жасай алады,
сонымен қатар деректер қорын өзгертуге; ол бірдей аргументті бірнеше
шақыруда әр түрлі нәтиже қайтара алады. Оптимизатор осындай
фунциялардың іс
әрекеті туралы ешқандай болжам жасамайды. Өзгерім
функцияларын қолданатын сұраныстарда, оның нәтижесін талап еткенде, ол
әрбір қатар үшін қайта есептеліп отырады.
- Тұрақты функция (STABLE) деректер қорын өзгерте алмайд және бір
оператор ішіндегі әрбір қатар үшін бірдей аргумент алып, гарант түрінде бір
нәтиже қайтарады. Бұл сипаттама оптимизаторға функцияның көптеген
шақыруларды осы біреуімен ауыстыруға мүмкіндік жасайды. Жекелегенде,
осындай функциясы бар күйді қауіпсіз түрде индекс бойынша іздеу шартында
қолдануға болады. Индекс бойынша іздеуде мақсатты мән әрбір қатарға емес
52
бір рет есептелетіндіктен, VOLATILE сипаттасы бар функцияны қолдану
мүмкін болмайды.
- Өзгермейтін функция (IMMUTABLE) деректер қорын өзгерте алмайды
және кепілді әрдайым бірдей аргументтерге бірдей нәтижелер қайтарады. Бұл
сипаттама оптимизаторға функция өзгермейтін аргументтермен сұраныста
шақырылғанда алдын
ала фунцияны есептеуге мүмкіндік береді. Мысалы,
SELECT ... WHERE x = 1 + 1 түрдегі сұранысты SELECT ... WHERE x = 2
түрдегі дейін жеңілдетуге болады, өйткені төмендегі функция қосу операторы
IMMUTABLE түрінде белгіленген.
Оптимизатор ең жақсы нәтижелері үшін функцияға оған сәйкес өзгергіш
сипаттамасын ең қатал орнатуы керек.
Жанама әсері бар кез келген функция VOLATILE деп белгіленуі қажет,
өйткені оңтайландыру кезінде оған шақыру кезінде алынып тасталмау үшін.
Егер функцияның мәні бір сұраныс кезінде өзгеру мүмкіндігі болса, онда
функцияның жанама әсері болмаса да оны VOLATILE деп белгілеу керек;
осындай функция түрлеріне random(), currval() и timeofday() функциялары
жатады.
Басқа маңызды мысал ретінде current_timestamp функциялар жанұясы
жатады; олардың сипаттамасы STABLE, өйткені олардың мәндері бір
транзакциясы ауданында өзгермейді. Жобаланып және бірден орындалатын
қарапайым интерактивті сұраныстар туралы жай болса STABLE және
IMMUTABLE сипаттамалары арасында айырмашылық аз; функция жобалау
барысында бір мәрте орындала ма, әлде көп мәрте кейін орындала ма маңызы
жоқ. Елеулі айырмашылық жоба сақталып және кейіннен көп мәрте қолданған
жағдайда пайда болады. Егер функция IMMUTABLE деп белгіленген болса, ал
шынында ол өзгермейтін болмаса, ол жобалау кезңнде константаға түсірілуі
мүмкін, сол себептен келесі жобаны іске асыру кезінде оның орнына орынсыз
мән қолданылады. Бұл әдіс әсіресе қауіпті егер дайын операторлар немесе
жобаны кэштейтін функция тілдерін (мысалы, PL/pgSQL) қолданған жағдайда.
SQL тілінде немесе басқа стандартты процедуралық тілде жазылған
функцияда өзгергіш сипаттамасымен анықталатын бір маңызды қасиеті бар:
функцияна шақыратын SQL командасы жүргізген өзгеріс көрінісі. VOLATILE
функциясы осындай өзгерістерді көріп отырады, ал STABLE және
IMMUTABLE функциялары көре алмайды. Бұл әрекет MVCC суреттері
арқылы жүзеге асады. STABLE және IMMUTABLE сұранысты шақырғанның
басында алынған суретті қолданады, ал VOLATILE болса олар орындайтын әр
сұраныстың басында алынған жаңа суретті қолданады.
С тілінде жазылған функциялар суреттермен қалауы бойынша жұмыс
жасай алады, алайда әдетте олар аналогты жұмыс жасағаны дұрыс. Суреттер
жұмыс жасаудың осындай ретінің салдары тек SELECT командасы бар
функция STABLE белгілеуі қауіпсіз; паралель орындалатын сұраныстармен
өзгерілетін кестелерден мәліметтерді алған жағдайда да STABLE белгілеуін
таңдаған дұрыс. PostgreSQL STABLE функциясының барлық командаларын
сұранысты шақыру үшін алынған суретпен орындайды. Сол себептен бүкіл