39.1. ÐеÑево запÑоÑа #
ЧÑÐ¾Ð±Ñ Ð¿Ð¾Ð½ÑÑÑ, как ÑабоÑÐ°ÐµÑ ÑиÑÑема пÑавил, нÑжно знаÑÑ, когда она вÑзÑваеÑÑÑ, ÑÑо пÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ Ð½Ð° Ð²Ñ Ð¾Ð´ и какой ÑезÑлÑÑÐ°Ñ Ð²ÑдаÑÑ.
СиÑÑема пÑавил внедÑена Ð¼ÐµÐ¶Ð´Ñ Ð°Ð½Ð°Ð»Ð¸Ð·Ð°ÑоÑом запÑоÑов и планиÑовÑиком. Ðна пÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ ÑазобÑаннÑй запÑоÑ, одно деÑево запÑоÑа, и опÑеделÑннÑе полÑзоваÑелем пÑавила пеÑезапиÑи, Ñоже пÑедÑÑавленнÑе деÑевÑÑми Ñ Ð½ÐµÐºÐ¾ÑоÑой дополниÑелÑной инÑоÑмаÑией, и ÑоздаÑÑ Ð½ÐµÐºÐ¾ÑоÑое колиÑеÑÑво деÑевÑев запÑоÑов в ÑезÑлÑÑаÑе. Таким обÑазом, на Ð²Ñ Ð¾Ð´Ðµ и вÑÑ Ð¾Ð´Ðµ ÑÑой ÑиÑÑÐµÐ¼Ñ Ð¾ÐºÐ°Ð·ÑваеÑÑÑ Ñо, ÑÑо Ð¼Ð¾Ð¶ÐµÑ ÑÑоÑмиÑоваÑÑ Ð°Ð½Ð°Ð»Ð¸Ð·Ð°ÑÐ¾Ñ Ð·Ð°Ð¿ÑоÑов, и как ÑледÑÑвие, вÑÑ, Ñ Ñем ÑабоÑÐ°ÐµÑ ÑÑа ÑиÑÑема, пÑедÑÑавимо в виде опеÑаÑоÑов SQL.
Так ÑÑо же Ñакое деÑево запÑоÑа? ÐÑо внÑÑÑеннее пÑедÑÑавление опеÑаÑоÑа SQL, в коÑоÑом вÑе обÑазÑÑÑие его ÑаÑÑи Ñ
ÑанÑÑÑÑ Ð¾ÑделÑно. ÐÑи деÑевÑÑ Ð¼Ð¾Ð¶Ð½Ð¾ ÑвидеÑÑ Ð² жÑÑнале ÑеÑвеÑа, еÑли ÑÑÑановиÑÑ Ð¿Ð°ÑамеÑÑÑ ÐºÐ¾Ð½ÑигÑÑаÑии debug_print_parse, debug_print_rewritten или debug_print_plan. ÐейÑÑÐ²Ð¸Ñ Ð¿Ñавил Ñакже Ñ
ÑанÑÑÑÑ Ð² виде деÑевÑев запÑоÑов, в ÑиÑÑемном каÑалоге pg_rewrite. Ðни не ÑоÑмаÑиÑÑÑÑÑÑ ÐºÐ°Ðº пÑи вÑводе в жÑÑнал, но ÑодеÑÐ¶Ð°Ñ ÑоÑно ÑакÑÑ Ð¶Ðµ инÑоÑмаÑиÑ.
ÐÐ»Ñ Ð¿ÑоÑÑÐµÐ½Ð¸Ñ Ð½ÐµÑоÑмаÑиÑованного деÑева ÑÑебÑеÑÑÑ Ð½ÐµÐºÐ¾ÑоÑÑй навÑк. Ðо Ñак как пÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ð´ÐµÑева запÑоÑов в виде SQL доÑÑаÑоÑно, ÑÑÐ¾Ð±Ñ Ð¿Ð¾Ð½ÑÑÑ ÑиÑÑÐµÐ¼Ñ Ð¿Ñавил, в ÑÑой главе не бÑÐ´ÐµÑ ÑаÑÑказÑваÑÑÑÑ, как Ð¸Ñ ÑиÑаÑÑ.
ЧиÑÐ°Ñ SQL-пÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ð´ÐµÑевÑев запÑоÑов в ÑÑой главе, Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ понимаÑÑ, на какие ÑаÑÑи ÑазбиваеÑÑÑ Ð¾Ð¿ÐµÑаÑоÑ, когда он пÑеобÑазÑеÑÑÑ Ð² ÑÑÑÑкÑÑÑÑ Ð´ÐµÑева запÑоÑа. ÐеÑево запÑоÑа ÑоÑÑÐ¾Ð¸Ñ Ð¸Ð· ÑледÑÑÑÐ¸Ñ ÑаÑÑей:
- Ñип командÑ
ÐÑо пÑоÑÑое знаÑение, говоÑÑÑее, ÐºÐ°ÐºÐ°Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð° (
SELECT,INSERT,UPDATEилиDELETE) ÑгенеÑиÑовала деÑево запÑоÑов.- ÑпиÑок оÑноÑений
СпиÑок оÑноÑений пÑедÑÑавлÑÐµÑ Ñобой маÑÑив оÑноÑений, иÑполÑзÑемÑÑ Ð² запÑоÑе. РзапÑоÑе
SELECTон вклÑÑÐ°ÐµÑ Ð¾ÑноÑениÑ, ÑказаннÑе поÑле клÑÑевого ÑловаFROM.ÐаждÑй ÑÐ»ÐµÐ¼ÐµÐ½Ñ ÑпиÑка оÑноÑений пÑедÑÑавлÑÐµÑ ÑаблиÑÑ Ð¸Ð»Ð¸ пÑедÑÑавление и говоÑиÑ, Ñ ÐºÐ°ÐºÐ¸Ð¼ именем они ÑпоминаÑÑÑÑ Ð² дÑÑÐ³Ð¸Ñ ÑаÑÑÑÑ Ð·Ð°Ð¿ÑоÑа. РдеÑеве запÑоÑов запиÑÑваÑÑÑÑ Ð½Ð¾Ð¼ÐµÑа ÑлеменÑов ÑпиÑка оÑноÑений, а не Ð¸Ñ Ð¸Ð¼ÐµÐ½Ð°, поÑÑÐ¾Ð¼Ñ Ð´Ð»Ñ Ð½ÐµÐ³Ð¾ неакÑÑалÑна пÑоблема дÑблиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð¸Ð¼Ñн, как Ð´Ð»Ñ Ð¾Ð¿ÐµÑаÑоÑа SQL. Ð¢Ð°ÐºÐ°Ñ Ð¿Ñоблема Ð¼Ð¾Ð¶ÐµÑ Ð²Ð¾Ð·Ð½Ð¸ÐºÐ½ÑÑÑ Ð¿Ñи обÑединении ÑпиÑков оÑноÑений, обÑазованнÑÑ ÑазнÑми пÑавилами. Ð ÑÑой главе Ð´Ð°Ð½Ð½Ð°Ñ ÑиÑÑаÑÐ¸Ñ ÑаÑÑмаÑÑиваÑÑÑÑ Ð½Ðµ бÑдеÑ.
- ÑезÑлÑÑиÑÑÑÑее оÑноÑение
ÐÐ½Ð´ÐµÐºÑ Ð² ÑпиÑке оÑноÑений, ÑказÑваÑÑий на оÑноÑение, коÑоÑое бÑÐ´ÐµÑ Ð¿Ð¾Ð»ÑÑаÑÑ ÑезÑлÑÑаÑÑ Ð·Ð°Ð¿ÑоÑа.
РзапÑоÑаÑ
SELECTÑезÑлÑÑиÑÑÑÑее оÑноÑение оÑÑÑÑÑÑвÑеÑ. (ÐÑобÑй ÑлÑÑайSELECT INTOпÑакÑиÑеÑки ÑавнознаÑенCREATE TABLEÑ Ð¿Ð¾ÑледÑÑÑимINSERT ... SELECTи здеÑÑ Ð¾ÑделÑно не ÑаÑÑмаÑÑиваеÑÑÑ.)ÐÐ»Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´
INSERT,UPDATEиDELETEÑезÑлÑÑиÑÑÑÑим оÑноÑением бÑÐ´ÐµÑ ÑаблиÑа (или пÑедÑÑавление!), в коÑоÑой бÑдÑÑ Ð¿ÑоиÑÑ Ð¾Ð´Ð¸ÑÑ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ.- вÑÑ Ð¾Ð´Ð½Ð¾Ð¹ ÑпиÑок
ÐÑÑ Ð¾Ð´Ð½Ð¾Ð¹ ÑпиÑок â ÑÑо ÑпиÑок вÑÑажений, опÑеделÑÑÑÐ¸Ñ ÑезÑлÑÑÐ°Ñ Ð·Ð°Ð¿ÑоÑа. Ð ÑлÑÑае
SELECT, ÑÑо вÑÑажениÑ, коÑоÑÑе обÑазÑÑÑ Ð¾ÐºÐ¾Ð½ÑаÑелÑнÑй Ð½Ð°Ð±Ð¾Ñ Ð²ÑÑ Ð¾Ð´Ð½ÑÑ Ð´Ð°Ð½Ð½ÑÑ . Ðни ÑооÑвеÑÑÑвÑÑÑ Ð²ÑÑажениÑм, запиÑаннÑм Ð¼ÐµÐ¶Ð´Ñ ÐºÐ»ÑÑевÑми ÑловамиSELECTиFROM. (Указание*â ÑÑо пÑоÑÑо кÑаÑкое обознаÑение имÑн вÑÐµÑ ÑÑолбÑов оÑноÑениÑ. ÐнализаÑÐ¾Ñ ÑазвоÑаÑÐ¸Ð²Ð°ÐµÑ ÐµÐ³Ð¾ в ÑпиÑок оÑделÑнÑÑ ÑÑолбÑов, Ñак ÑÑо ÑиÑÑема пÑавил никогда не Ð²Ð¸Ð´Ð¸Ñ ÐµÐ³Ð¾.)Ðомандам
DELETEне нÑжен обÑÑнÑй вÑÑ Ð¾Ð´Ð½Ð¾Ð¹ ÑпиÑок, Ñак как они не вÑдаÑÑ Ð½Ð¸ÐºÐ°ÐºÐ¸Ðµ ÑезÑлÑÑаÑÑ. ÐмеÑÑо ÑÑого планиÑовÑик добавлÑÐµÑ Ð² пÑÑÑой вÑÑ Ð¾Ð´Ð½Ð¾Ð¹ ÑпиÑок ÑпеÑиалÑнÑÑ Ð·Ð°Ð¿Ð¸ÑÑ CTID, ÑÑÐ¾Ð±Ñ Ð¸ÑполниÑÐµÐ»Ñ Ð¼Ð¾Ð³ найÑи ÑдалÑемÑÑ ÑÑÑокÑ. (CTID добавлÑеÑÑÑ, когда ÑезÑлÑÑиÑÑÑÑее оÑноÑение â обÑÑÐ½Ð°Ñ ÑаблиÑа. ÐÑли ÑÑо пÑедÑÑавление, планиÑовÑиком добавлÑеÑÑÑ Ð¿ÐµÑеменнаÑ, ÑодеÑжаÑÐ°Ñ Ð²ÑÑ ÑÑÑокÑ, как ÑаÑÑказÑваеÑÑÑ Ð² ÐодÑазделе 39.2.4.)ÐÐ»Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´
INSERTвÑÑ Ð¾Ð´Ð½Ð¾Ð¹ ÑпиÑок опиÑÑÐ²Ð°ÐµÑ Ð½Ð¾Ð²Ñе ÑÑÑоки, коÑоÑÑе Ð´Ð¾Ð»Ð¶Ð½Ñ Ð¿Ð¾Ð¿Ð°ÑÑÑ Ð² ÑезÑлÑÑиÑÑÑÑее оÑноÑение. Ðн вклÑÑÐ°ÐµÑ Ð²ÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð² пÑедложенииVALUESили пÑедложенииSELECTвINSERT ... SELECT. Ðа пеÑвом ÑÑапе пÑоÑеÑÑ Ð¿ÐµÑезапиÑи добавлÑÐµÑ ÑлеменÑÑ Ð²ÑÑ Ð¾Ð´Ð½Ð¾Ð³Ð¾ ÑпиÑка Ð´Ð»Ñ ÑÑолбÑов, коÑоÑÑм ниÑего не пÑиÑвоила иÑÑ Ð¾Ð´Ð½Ð°Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð°, но имеÑÑÐ¸Ñ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ Ð¿Ð¾ ÑмолÑаниÑ. ÐÑе оÑÑалÑнÑе ÑÑолбÑÑ (без заданного знаÑÐµÐ½Ð¸Ñ Ð¸ знаÑÐµÐ½Ð¸Ñ Ð¿Ð¾ ÑмолÑаниÑ) планиÑовÑик заполнÑÐµÑ ÐºÐ¾Ð½ÑÑанÑой NULL.ÐÐ»Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´
UPDATEвÑÑ Ð¾Ð´Ð½Ð¾Ð¹ ÑпиÑок опиÑÑÐ²Ð°ÐµÑ Ð½Ð¾Ð²Ñе ÑÑÑоки, коÑоÑÑе Ð´Ð¾Ð»Ð¶Ð½Ñ Ð·Ð°Ð¼ÐµÐ½Ð¸ÑÑ ÑÑаÑÑе. Ð ÑиÑÑеме пÑавил он ÑодеÑÐ¶Ð¸Ñ ÑолÑко вÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð¸Ð· ÑаÑÑиSET ÑÑÐ¾Ð»Ð±ÐµÑ = вÑÑажение. ÐÐ»Ñ Ð¿ÑопÑÑеннÑÑ ÑÑолбÑов планиÑовÑик вÑÑавлÑÐµÑ Ð²ÑÑажениÑ, копиÑÑÑÑие знаÑÐµÐ½Ð¸Ñ Ð¸Ð· ÑÑаÑой ÑÑÑоки в новÑÑ. Так же, как и Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð¾Ð¹DELETE, пÑи ÑÑом добавлÑеÑÑÑ CTID или пеÑÐµÐ¼ÐµÐ½Ð½Ð°Ñ Ñо вÑей ÑÑÑокой, ÑÑÐ¾Ð±Ñ Ð¸ÑполниÑÐµÐ»Ñ Ð¼Ð¾Ð³ найÑи изменÑемÑÑ ÑÑаÑÑÑ ÑÑÑокÑ.ÐÐ°Ð¶Ð´Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑ Ð² вÑÑ Ð¾Ð´Ð½Ð¾Ð¼ ÑпиÑке ÑодеÑÐ¶Ð¸Ñ Ð²ÑÑажение, коÑоÑое Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ ÐºÐ¾Ð½ÑÑанÑой, пеÑеменной, ÑказÑваÑÑей на ÑÑÐ¾Ð»Ð±ÐµÑ Ð¾ÑноÑÐµÐ½Ð¸Ñ Ð² ÑаблиÑе оÑноÑений, паÑамеÑÑом или деÑевом вÑÑажений, обÑазованнÑм из конÑÑанÑ, пеÑеменнÑÑ , опеÑаÑоÑов, вÑзовов ÑÑнкÑий и Ñ. д.
- ÑÑловие ÑилÑÑÑа
УÑловие ÑилÑÑÑа запÑоÑа â ÑÑо вÑÑажение, во многом Ð¿Ð¾Ñ Ð¾Ð¶ÐµÐµ на Ñе, ÑÑо ÑодеÑжаÑÑÑ Ð² вÑÑ Ð¾Ð´Ð½Ð¾Ð¼ ÑпиÑке. РезÑлÑÑÐ°Ñ ÑÑого вÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ â логиÑеÑкий, он говоÑиÑ, должна ли вÑполнÑÑÑÑÑ Ð¾Ð¿ÐµÑаÑÐ¸Ñ (
INSERT,UPDATE,DELETEилиSELECT) Ð´Ð»Ñ Ð´Ð°Ð½Ð½Ð¾Ð¹ ÑÑÑоки в ÑезÑлÑÑаÑе. Ðно ÑооÑвеÑÑÑвÑÐµÑ Ð¿ÑедложениÑWHERESQL-опеÑаÑоÑа.- деÑево ÑоединениÑ
ÐеÑево ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ð·Ð°Ð¿ÑоÑа показÑÐ²Ð°ÐµÑ ÑÑÑÑкÑÑÑÑ Ð¿ÑедложениÑ
FROM. ÐÐ»Ñ Ð¿ÑоÑÑÑÑ Ð·Ð°Ð¿ÑоÑов видаSELECT ... FROM a, b, c, деÑево ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ â ÑÑо пÑоÑÑо ÑпиÑок ÑлеменÑовFROM, Ñак как они могÑÑ ÑоединÑÑÑÑÑ Ð² лÑбом поÑÑдке. Ðо Ñ Ð²ÑÑажениÑмиJOIN, оÑобенно Ñ Ð²Ð½ÐµÑними ÑоединениÑми, пÑÐ¸Ñ Ð¾Ð´Ð¸ÑÑÑ ÑоединÑÑÑ Ð¾ÑноÑÐµÐ½Ð¸Ñ Ð¸Ð¼ÐµÐ½Ð½Ð¾ в заданном поÑÑдке. Ð ÑÑом ÑлÑÑае деÑево ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ð¾ÑÑÐ°Ð¶Ð°ÐµÑ ÑÑÑÑкÑÑÑÑ Ð²ÑÑаженийJOIN. ÐгÑаниÑениÑ, ÑвÑзаннÑе Ñ ÐºÐ¾Ð½ÐºÑеÑнÑми пÑедложениÑмиJOIN(из вÑÑаженийONилиUSING), Ñоже ÑÐ¾Ñ ÑанÑÑÑÑÑ Ð² виде ÑÑловнÑÑ Ð²ÑÑажений, добавленнÑÑ Ðº ÑооÑвеÑÑÑвÑÑÑим Ñзлам деÑева ÑоединениÑ. Ðак оказалоÑÑ, вÑÑажениеWHEREвеÑÑ Ð½ÐµÐ³Ð¾ ÑÑÐ¾Ð²Ð½Ñ Ñоже Ñдобно Ñ ÑаниÑÑ ÐºÐ°Ðº ÑÑловие, добавленное к ÑлеменÑÑ Ð²ÐµÑÑ Ð½ÐµÐ³Ð¾ ÑÑÐ¾Ð²Ð½Ñ Ð´ÐµÑева ÑоединениÑ. ÐоÑÑÐ¾Ð¼Ñ Ð² деÑеве ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ð½Ð° Ñамом деле пÑедÑÑавлÑÑÑÑÑ Ð¾Ð±Ð° пÑÐµÐ´Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð¾Ð¿ÐµÑаÑоÑаSELECTâFROMиWHERE.- дÑÑгие
ÐÑÑгие ÑаÑÑи деÑева запÑоÑа, напÑимеÑ, пÑедложение
ORDER BY, в данном конÑекÑÑе не пÑедÑÑавлÑÑÑ Ð¸Ð½ÑеÑеÑа. СиÑÑема пÑавил вÑполнÑÐµÑ Ð² Ð½Ð¸Ñ Ð½ÐµÐºÐ¾ÑоÑÑе подÑÑановки, пÑименÑÑ Ð¿Ñавила, но ÑÑо не Ð¸Ð¼ÐµÐµÑ Ð½ÐµÐ¿Ð¾ÑÑедÑÑвенного оÑноÑÐµÐ½Ð¸Ñ Ðº оÑновам ÑиÑÑÐµÐ¼Ñ Ð¿Ñавил.