Руководство по созданию эффективных запросов



Download 17,08 Mb.
Pdf ko'rish
bet176/210
Sana25.06.2022
Hajmi17,08 Mb.
#704548
TuriРуководство
1   ...   172   173   174   175   176   177   178   179   ...   210
Bog'liq
OptimizZaprvPostgreSQL

Листинг 12.9 

Функция, создающая часть динамического SQL
CREATE OR REPLACE FUNCTION age_category_dyn (p_age text)
RETURNS text
LANGUAGE plpgsql
AS $body$
BEGIN
RETURN ($$CASE
WHEN $$ || p_age || $$ <= 2 THEN 'Infant'
WHEN $$ || p_age || $$ <= 12 THEN 'Child'
WHEN $$ || p_age || $$ < 65 THEN 'Adult'
ELSE 'Senior'
END$$);
END;
$body$;
Обратите внимание на разницу. Такой запрос возвращает значение 
'Adult'
:
SELECT age_category(25)
А следующий запрос
SELECT age_category_dyn('age')
вернет текстовую строку, содержащую фрагмент кода
CASE
WHEN age <= 2 THEN 'Infant'
WHEN age <= 12 THEN 'Child'
WHEN age < 65 THEN 'Adult'
ELSE 'Senior'
END
Чтобы использовать эту функцию, вам нужно будет упаковать запрос 
в функцию, но мы уже знаем, как это сделать, – см. лис тинг 12.10.
Теперь мы можем выполнить следующую команду:
SELECT * FROM passenger_age_category_select (5000000)
На выполнение уйдет около 11 секунд, что больше, чем у команды без ка-
ких-либо вызовов функций, но все же меньше, чем у исходной версии функ-
ции 
age_category
. И опять же, в реальных аналитических запросах эффект 
будет более заметным.


230

Динамический SQL
Листинг 12.10 

Использование новой функции 
age_category_dyn
для построения 
динамического запроса
CREATE TYPE passenger_age_cat_record AS (
passenger_id int,
age_category text
);
CREATE OR REPLACE FUNCTION passenger_age_category_select (p_limit int)
RETURNS ЫУЕЩА passenger_age_cat_record
ASс$body$
BEGIN
RETURN QUERY EXECUTE
$$SELECT passenger_id,
$$ || age_category_dyn('age') || $$ AS age_category
FROM passenger
LIMIT $$ || p_limit::text;
END;
$body$
LANGUAGE plpgsql;
Кто-то может возразить, что создание функций, генерирующих код, не 
стоит повышения производительности. Повторим: не существует универ-
сального принципа, определяющего, выгодно ли создание функций с точки 
зрения производительности, декомпозиции кода или переносимости. В гла-
ве 11 упоминалось, что декомпозиция для функций PL/pgSQL работает не так, 
как для объектно-ориентированных языков программирования, и обещали 
показать примеры. Один из примеров как раз приведен в этом разделе. Здесь 
функция 
age_category_dyn
помогает декомпозиции кода, поскольку алгоритм 
присвоения возрастной категории можно менять только в одном месте. В то 
же время это меньше влияет на производительность, чем более традиционная 
функция с параметрами. В большинстве случаев создание функции, выпол-
няющей динамический SQL, занимает больше времени, поскольку отладка 
усложняется. Однако когда функция уже создана, изменения можно вносить 
быстро. Решить, что более важно – начальное время разработки или среднее 
время выполнения, – могут только разработчики приложений и баз данных.

Download 17,08 Mb.

Do'stlaringiz bilan baham:
1   ...   172   173   174   175   176   177   178   179   ...   210




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©hozir.org 2024
ma'muriyatiga murojaat qiling

kiriting | ro'yxatdan o'tish
    Bosh sahifa
юртда тантана
Боғда битган
Бугун юртда
Эшитганлар жилманглар
Эшитмадим деманглар
битган бодомлар
Yangiariq tumani
qitish marakazi
Raqamli texnologiyalar
ilishida muhokamadan
tasdiqqa tavsiya
tavsiya etilgan
iqtisodiyot kafedrasi
steiermarkischen landesregierung
asarlaringizni yuboring
o'zingizning asarlaringizni
Iltimos faqat
faqat o'zingizning
steierm rkischen
landesregierung fachabteilung
rkischen landesregierung
hamshira loyihasi
loyihasi mavsum
faolyatining oqibatlari
asosiy adabiyotlar
fakulteti ahborot
ahborot havfsizligi
havfsizligi kafedrasi
fanidan bo’yicha
fakulteti iqtisodiyot
boshqaruv fakulteti
chiqarishda boshqaruv
ishlab chiqarishda
iqtisodiyot fakultet
multiservis tarmoqlari
fanidan asosiy
Uzbek fanidan
mavzulari potok
asosidagi multiservis
'aliyyil a'ziym
billahil 'aliyyil
illaa billahil
quvvata illaa
falah' deganida
Kompyuter savodxonligi
bo’yicha mustaqil
'alal falah'
Hayya 'alal
'alas soloh
Hayya 'alas
mavsum boyicha


yuklab olish