SPI_prepare
SPI_prepare â подгоÑовиÑÑ Ð¾Ð¿ÐµÑаÑоÑ, но пока не вÑполнÑÑÑ ÐµÐ³Ð¾
СинÑакÑиÑ
SPIPlanPtr SPI_prepare(const char *command, intnargs, Oid *argtypes)
ÐпиÑание
SPI_prepare ÑоздаÑÑ Ð¸ возвÑаÑÐ°ÐµÑ Ð¿Ð¾Ð´Ð³Ð¾ÑовленнÑй опеÑаÑÐ¾Ñ Ð´Ð»Ñ Ð·Ð°Ð´Ð°Ð½Ð½Ð¾Ð¹ командÑ. ÐодгоÑовленнÑй опеÑаÑÐ¾Ñ Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð·Ð°Ñем неоднокÑаÑно вÑполнен ÑÑнкÑией SPI_execute_plan.
Ðогда одна и Ñа же или поÑ
ожие ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ Ð²ÑполнÑÑÑÑÑ Ð½ÐµÐ¾Ð´Ð½Ð¾ÐºÑаÑно, обÑÑно вÑгоднее пÑоизвеÑÑи анализ запÑоÑа ÑолÑко Ñаз, а еÑÑ Ð²Ñгоднее Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¿Ð¾Ð²ÑоÑно иÑполÑзоваÑÑ Ð¿Ð»Ð°Ð½ вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ. SPI_prepare пÑеобÑазÑÐµÑ ÑÑÑÐ¾ÐºÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ Ð² подгоÑовленнÑй опеÑаÑоÑ, вклÑÑаÑÑий в ÑÐµÐ±Ñ ÑезÑлÑÑаÑÑ Ð°Ð½Ð°Ð»Ð¸Ð·Ð° запÑоÑа. ÐодгоÑовленнÑй опеÑаÑÐ¾Ñ Ñакже оÑÑавлÑÐµÑ Ð¼ÐµÑÑо Ð´Ð»Ñ ÐºÐµÑиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð¿Ð»Ð°Ð½Ð° вÑполнениÑ, еÑли вÑÐ±Ð¾Ñ ÑпеÑиализиÑованного плана Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð½Ðµ пÑинеÑÑÑ Ð¿Ð¾Ð»ÑзÑ.
ÐодгоÑавливаемÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ Ð¼Ð¾Ð¶Ð½Ð¾ ÑделаÑÑ Ð±Ð¾Ð»ÐµÐµ обÑей, запиÑав паÑамеÑÑÑ ($1, $2, etc.) вмеÑÑо знаÑений, задаваемÑми конÑÑанÑами в обÑÑной команде. ФакÑиÑеÑкие знаÑÐµÐ½Ð¸Ñ Ð¿Ð°ÑамеÑÑов в ÑÑом ÑлÑÑае бÑдÑÑ Ð·Ð°Ð´Ð°Ð²Ð°ÑÑÑÑ Ð¿Ñи вÑзове SPI_execute_plan. ÐÑо позволÑÐµÑ Ð¿ÑименÑÑÑ Ð¿Ð¾Ð´Ð³Ð¾ÑовленнÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ Ð² более ÑиÑоком кÑÑге ÑиÑÑаÑий, Ñем ÑÑо возможно без паÑамеÑÑов.
ÐпеÑаÑоÑ, возвÑаÑаемÑй ÑÑнкÑией SPI_prepare, Ð¼Ð¾Ð¶ÐµÑ Ð¸ÑполÑзоваÑÑÑÑ ÑолÑко в ÑекÑÑем вÑзове ÑÑнкÑии на C, Ñак как SPI_finish оÑÐ²Ð¾Ð±Ð¾Ð¶Ð´Ð°ÐµÑ Ð¿Ð°Ð¼ÑÑÑ, вÑделеннÑÑ Ð´Ð»Ñ Ñакого опеÑаÑоÑа. Ðо ÑÑÐ¾Ñ Ð¾Ð¿ÐµÑаÑÐ¾Ñ Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ ÑоÑ
ÑанÑн на бÑдÑÑее Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ ÑÑнкÑий SPI_keepplan или SPI_saveplan.
ÐÑгÑменÑÑ
const char *commandÑÑÑока командÑ
intnargsÑиÑло Ð²Ñ Ð¾Ð´Ð½ÑÑ Ð¿Ð°ÑамеÑÑов (
$1,$2и Ñ. д.)Oid *argtypesÑказаÑÐµÐ»Ñ Ð½Ð° маÑÑив, ÑодеÑжаÑий OID Ñипов паÑамеÑÑов
ÐозвÑаÑаемое знаÑение
SPI_prepare возвÑаÑÐ°ÐµÑ Ð½ÐµÐ½Ñлевой ÑказаÑÐµÐ»Ñ Ð½Ð° SPIPlan, ÑкÑÑÑÑÑ ÑÑÑÑкÑÑÑÑ, пÑедÑÑавлÑÑÑÑÑ Ð¿Ð¾Ð´Ð³Ð¾ÑовленнÑй опеÑаÑоÑ. Ð ÑлÑÑае оÑибки возвÑаÑаеÑÑÑ NULL, а в SPI_result ÑÑÑанавливаеÑÑÑ Ð¾Ð´Ð¸Ð½ из кодов оÑибок, опÑеделÑннÑÑ
Ð´Ð»Ñ SPI_execute, за иÑклÑÑением Ñого, ÑÑо код SPI_ERROR_ARGUMENT ÑÑÑанавливаеÑÑÑ, когда command â NULL, когда nargs менÑÑе 0 или когда nargs болÑÑе 0, а argtypes â NULL.
ÐÑимеÑаниÑ
ÐÑли паÑамеÑÑÑ Ð½Ðµ опÑеделенÑ, пÑи пеÑвом иÑполÑзовании SPI_execute_plan ÑоздаÑÑÑÑ Ð¾Ð±Ñий план, коÑоÑÑй заÑем бÑÐ´ÐµÑ Ð¿ÑименÑÑÑÑÑ Ð¿Ñи поÑледÑÑÑиÑ
вÑзоваÑ
. ÐÑли же пÑиÑÑÑÑÑвÑÑÑ Ð¿Ð°ÑамеÑÑÑ, SPI_execute_plan бÑÐ´ÐµÑ ÑоздаваÑÑ ÑпеÑиализиÑованнÑе Ð¿Ð»Ð°Ð½Ñ Ð´Ð»Ñ ÐºÐ¾Ð½ÐºÑеÑнÑÑ
знаÑений паÑамеÑÑов. ÐоÑле доÑÑаÑоÑного колиÑеÑÑва иÑполÑзований полÑÑенного подгоÑовленного опеÑаÑоÑа, ÑÑнкÑÐ¸Ñ SPI_execute_plan поÑÑÑÐ¾Ð¸Ñ Ð¾Ð±Ñий план, и еÑли он не бÑÐ´ÐµÑ Ð·Ð½Ð°ÑиÑелÑно доÑоже ÑпеÑиализиÑованнÑÑ
, она наÑнÑÑ Ð¸ÑполÑзоваÑÑ ÐµÐ³Ð¾, а не бÑÐ´ÐµÑ ÑÑÑоиÑÑ Ð¿Ð»Ð°Ð½ заново. ÐÑли ÑÑо поведение по ÑмолÑÐ°Ð½Ð¸Ñ Ð½Ðµ ÑÑÑÑаиваеÑ, его можно измениÑÑ, пеÑедав Ñлаг CURSOR_OPT_GENERIC_PLAN или CURSOR_OPT_CUSTOM_PLAN в SPI_prepare_cursor, ÑÑÐ¾Ð±Ñ Ð¾Ð³ÑаниÑиÑÑÑÑ Ð¸ÑполÑзованием ÑолÑко обÑего или ÑпеÑиализиÑованнÑÑ
планов, ÑооÑвеÑÑÑвенно.
ХоÑÑ Ð¾Ñновной ÑмÑÑл подгоÑовленного опеÑаÑоÑа в Ñом, ÑÑÐ¾Ð±Ñ Ð¸Ð·Ð±ÐµÐ¶Ð°ÑÑ Ð¿Ð¾Ð²ÑоÑного ÑазбоÑа и планиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð·Ð°Ð¿ÑоÑа, Postgres Pro вÑÑ Ð¶Ðµ бÑÐ´ÐµÑ Ð¿ÑинÑдиÑелÑно повÑоÑÑÑÑ ÑÐ°Ð·Ð±Ð¾Ñ Ð¸ планиÑование запÑоÑа пеÑед его вÑполнением, еÑли Ñо вÑемени пÑедÑдÑÑего иÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¿Ð¾Ð´Ð³Ð¾Ñовленного опеÑаÑоÑа пÑоизойдÑÑ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¾Ð¿Ñеделений (DDL) обÑекÑов базÑ, задейÑÑвованнÑÑ
в ÑÑом запÑоÑе. Также, еÑли пеÑед оÑеÑеднÑм иÑполÑзованием бÑло изменено знаÑение search_path, запÑÐ¾Ñ Ð±ÑÐ´ÐµÑ ÑазобÑан заново Ñ Ð½Ð¾Ð²Ñм знаÑением search_path. (ÐоÑледнÑÑ Ð¾ÑобенноÑÑÑ Ð¿Ð¾ÑвилаÑÑ Ð² PostgreSQL 9.3.) ЧÑÐ¾Ð±Ñ ÑзнаÑÑ Ð¾ поведении подгоÑовленнÑÑ
опеÑаÑоÑов болÑÑе, обÑаÑиÑеÑÑ Ðº PREPARE.
ÐÑÑ ÑÑнкÑÐ¸Ñ ÑледÑÐµÑ Ð²ÑзÑваÑÑ ÑолÑко из подклÑÑÑнной ÑÑнкÑии на C.
SPIPlanPtr обÑÑвлен в spi.h как ÑказаÑÐµÐ»Ñ Ð½Ð° ÑкÑÑÑÑÑ ÑÑÑÑкÑÑÑÑ. ÐÑÑаÑÑÑÑ Ð¾Ð±ÑаÑаÑÑÑÑ Ðº ÐµÑ ÑодеÑÐ¶Ð¸Ð¼Ð¾Ð¼Ñ Ð½Ð°Ð¿ÑÑмÑÑ Ð½Ðµ ÑÑоиÑ, Ñак как Ð²Ð°Ñ ÐºÐ¾Ð´ ÑкоÑее вÑего ÑломаеÑÑÑ Ð¿Ñи вÑÑ
оде новÑÑ
веÑÑий Postgres Pro.
ÐÐ¼Ñ SPIPlanPtr обÑÑÑнÑеÑÑÑ Ð¾ÑÑаÑÑи иÑÑоÑиÑеÑкими пÑиÑинами, Ñак как ÑепеÑÑ ÑÑа ÑÑÑÑкÑÑÑа Ð¼Ð¾Ð¶ÐµÑ Ð½Ðµ ÑодеÑжаÑÑ ÑобÑÑвенно план вÑполнениÑ.