11.10. СемейÑÑва и клаÑÑÑ Ð¾Ð¿ÐµÑаÑоÑов
РопÑеделении индекÑа можно ÑказаÑÑ ÐºÐ»Ð°ÑÑ Ð¾Ð¿ÐµÑаÑоÑов Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ ÑÑолбÑа индекÑа.
CREATE INDEXимÑONÑаблиÑа(ÑÑолбеÑклаÑÑ_опеÑаÑоÑов[паÑамеÑÑÑ ÑоÑÑиÑовки] [, ...]);
ÐлаÑÑ Ð¾Ð¿ÐµÑаÑоÑов опÑеделÑеÑ, какие опеÑаÑоÑÑ Ð±ÑÐ´ÐµÑ Ð¸ÑполÑзоваÑÑ Ð¸Ð½Ð´ÐµÐºÑ Ð´Ð»Ñ ÑÑого ÑÑолбÑа. ÐапÑимеÑ, индекÑ-B-деÑево по ÑÑолбÑÑ int4 бÑÐ´ÐµÑ Ð¸ÑполÑзоваÑÑ ÐºÐ»Ð°ÑÑ int4_ops; ÑÑÐ¾Ñ ÐºÐ»Ð°ÑÑ Ð¾Ð¿ÐµÑаÑоÑов вклÑÑÐ°ÐµÑ Ð¾Ð¿ÐµÑаÑии Ñо знаÑениÑми Ñипа int4. Ðа пÑакÑике ÑаÑÑо доÑÑаÑоÑно пÑинÑÑÑ ÐºÐ»Ð°ÑÑ Ð¾Ð¿ÐµÑаÑоÑов, назнаÑеннÑй Ð´Ð»Ñ Ñипа ÑÑолбÑа клаÑÑом по ÑмолÑаниÑ. Ðднако Ð´Ð»Ñ Ð½ÐµÐºÐ¾ÑоÑÑÑ
Ñипов даннÑÑ
могÑÑ Ð¸Ð¼ÐµÑÑ ÑмÑÑл неÑколÑко ÑазнÑÑ
ваÑианÑов индекÑиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð¸ ÑеализоваÑÑ Ð¸Ñ
как Ñаз позволÑÑÑ ÑазнÑе клаÑÑÑ Ð¾Ð¿ÐµÑаÑоÑов. ÐапÑимеÑ, комплекÑнÑе ÑиÑла можно ÑоÑÑиÑоваÑÑ ÐºÐ°Ðº по веÑеÑÑвенной ÑаÑÑи, Ñак и по модÑлÑ. ÐолÑÑиÑÑ Ð´Ð²Ð° ваÑианÑа индекÑов Ð´Ð»Ñ Ð½Ð¸Ñ
можно, опÑеделив два клаÑÑа опеÑаÑоÑов Ð´Ð»Ñ Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ Ñипа и вÑбÑав ÑооÑвеÑÑÑвÑÑÑий клаÑÑ Ð¿Ñи Ñоздании индекÑа. ÐÑбÑаннÑй клаÑÑ Ð¾Ð¿ÐµÑаÑоÑов задаÑÑ Ð¾Ñновной поÑÑдок ÑоÑÑиÑовки даннÑÑ
(его можно ÑÑоÑниÑÑ, добавив паÑамеÑÑÑ COLLATE, ASC/DESC и/или NULLS FIRST/NULLS LAST).
Ðомимо клаÑÑов опеÑаÑоÑов по ÑмолÑÐ°Ð½Ð¸Ñ ÐµÑÑÑ ÐµÑÑ Ð½ÐµÑколÑко вÑÑÑоеннÑÑ :
ÐлаÑÑÑ Ð¾Ð¿ÐµÑаÑоÑов
text_pattern_ops,varchar_pattern_opsиbpchar_pattern_opsподдеÑживаÑÑ Ð¸Ð½Ð´ÐµÐºÑÑ-B-деÑевÑÑ Ð´Ð»Ñ Ñиповtext,varcharиchar, ÑооÑвеÑÑÑвенно. ÐÑ ÑÑандаÑÑнÑÑ ÐºÐ»Ð°ÑÑов опеÑаÑоÑов они оÑлиÑаÑÑÑÑ Ñем, ÑÑо ÑÑавниваÑÑ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ Ð¿Ð¾ Ñимволам, не пÑименÑÑ Ð¿Ñавила ÑоÑÑиÑовки, опÑеделÑннÑе локалÑÑ. ÐлагодаÑÑ ÑÑÐ¾Ð¼Ñ Ð¾Ð½Ð¸ Ð¿Ð¾Ð´Ñ Ð¾Ð´ÑÑ Ð´Ð»Ñ Ð·Ð°Ð¿ÑоÑов Ñ Ð¿Ð¾Ð¸Ñком по ÑÐ°Ð±Ð»Ð¾Ð½Ñ (ÑLIKEи ÑегÑлÑÑнÑми вÑÑажениÑми POSIX), когда Ð»Ð¾ÐºÐ°Ð»Ñ Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ Ð½Ðµ ÑÑандаÑÑÐ½Ð°Ñ Â«C». ÐапÑимеÑ, Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе пÑоиндекÑиÑоваÑÑ ÑÑолбеÑvarcharÑак:CREATE INDEX test_index ON test_table (col varchar_pattern_ops);
ÐамеÑÑÑе, ÑÑо пÑи ÑÑом Ñакже ÑледÑÐµÑ ÑоздаÑÑ Ð¸Ð½Ð´ÐµÐºÑ Ñ ÐºÐ»Ð°ÑÑом опеÑаÑоÑов по ÑмолÑаниÑ, еÑли Ð²Ñ Ñ Ð¾ÑиÑе ÑÑкоÑиÑÑ Ð·Ð°Ð¿ÑоÑÑ Ñ Ð¾Ð±ÑÑнÑми ÑÑавнениÑми
<,<=,>и>=за ÑÑÑÑ Ð¿ÑÐ¸Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¸Ð½Ð´ÐµÐºÑов. ÐлаÑÑÑ Ð¾Ð¿ÐµÑаÑоÑовне Ð¿Ð¾Ð´Ñ Ð¾Ð´ÑÑ Ð´Ð»Ñ ÑÐ°ÐºÐ¸Ñ ÑÑавнений. (Ðднако Ð´Ð»Ñ Ð¿ÑовеÑки ÑавенÑÑв ÑÑи клаÑÑÑ Ð¾Ð¿ÐµÑаÑоÑов вполне пÑигоднÑ.) РподобнÑÑ ÑлÑÑаÑÑ Ð´Ð»Ñ Ð¾Ð´Ð½Ð¾Ð³Ð¾ ÑÑолбÑа можно ÑоздаÑÑ Ð½ÐµÑколÑко индекÑов Ñ ÑазнÑми клаÑÑами опеÑаÑоÑов. ÐÑли же Ð²Ñ Ð¸ÑполÑзÑеÑе Ð»Ð¾ÐºÐ°Ð»Ñ C, клаÑÑÑ Ð¾Ð¿ÐµÑаÑоÑовxxx_pattern_opsвам не нÑжнÑ, Ñак как Ð´Ð»Ñ Ð¿Ð¾Ð¸Ñка по ÑÐ°Ð±Ð»Ð¾Ð½Ñ Ð² локали C бÑÐ´ÐµÑ Ð´Ð¾ÑÑаÑоÑно индекÑов Ñ ÐºÐ»Ð°ÑÑом опеÑаÑоÑов по ÑмолÑаниÑ.xxx_pattern_ops
СледÑÑÑий запÑÐ¾Ñ Ð²ÑÐ²Ð¾Ð´Ð¸Ñ ÑпиÑок вÑÐµÑ ÑÑÑеÑÑвÑÑÑÐ¸Ñ ÐºÐ»Ð°ÑÑов опеÑаÑоÑов:
SELECT am.amname AS index_method,
opc.opcname AS opclass_name,
opc.opcintype::regtype AS indexed_type,
opc.opcdefault AS is_default
FROM pg_am am, pg_opclass opc
WHERE opc.opcmethod = am.oid
ORDER BY index_method, opclass_name;ÐлаÑÑ Ð¾Ð¿ÐµÑаÑоÑов на Ñамом деле ÑвлÑеÑÑÑ Ð²Ñего лиÑÑ Ð¿Ð¾Ð´Ð¼Ð½Ð¾Ð¶ÐµÑÑвом болÑÑой ÑÑÑÑкÑÑÑÑ, назÑваемой ÑемейÑÑвом опеÑаÑоÑов. Ð ÑлÑÑаÑÑ , когда неÑколÑко Ñипов даннÑÑ Ð²ÐµÐ´ÑÑ ÑÐµÐ±Ñ Ð¾Ð´Ð¸Ð½Ð°ÐºÐ¾Ð²Ð¾, ÑаÑÑо Ð¸Ð¼ÐµÐµÑ ÑмÑÑл опÑеделиÑÑ Ð¾Ð¿ÐµÑаÑоÑÑ Ñак, ÑÑÐ¾Ð±Ñ Ð¾Ð½Ð¸ могли иÑполÑзоваÑÑÑÑ Ñ Ð¸Ð½Ð´ÐµÐºÑами ÑÑÐ°Ð·Ñ Ð½ÐµÑколÑÐºÐ¸Ñ Ñипов. СделаÑÑ ÑÑо можно, ÑгÑÑппиÑовав клаÑÑÑ Ð¾Ð¿ÐµÑаÑоÑов Ð´Ð»Ñ ÑÑÐ¸Ñ Ñипов в одном ÑемейÑÑве опеÑаÑоÑов. Такие многоÑелевÑе опеÑаÑоÑÑ, ÑвлÑÑÑÑ Ñленами ÑемейÑÑва, не бÑдÑÑ ÑвÑÐ·Ð°Ð½Ñ Ñ ÐºÐ°ÐºÐ¸Ð¼-либо одним его клаÑÑом.
РаÑÑиÑÐµÐ½Ð½Ð°Ñ Ð²ÐµÑÑÐ¸Ñ Ð¿ÑедÑдÑÑего запÑоÑа показÑÐ²Ð°ÐµÑ ÑемейÑÑво опеÑаÑоÑов, к коÑоÑÐ¾Ð¼Ñ Ð¿ÑÐ¸Ð½Ð°Ð´Ð»ÐµÐ¶Ð¸Ñ ÐºÐ°Ð¶Ð´Ñй клаÑÑ Ð¾Ð¿ÐµÑаÑоÑов:
SELECT am.amname AS index_method,
opc.opcname AS opclass_name,
opf.opfname AS opfamily_name,
opc.opcintype::regtype AS indexed_type,
opc.opcdefault AS is_default
FROM pg_am am, pg_opclass opc, pg_opfamily opf
WHERE opc.opcmethod = am.oid AND
opc.opcfamily = opf.oid
ORDER BY index_method, opclass_name;ÐÑÐ¾Ñ Ð·Ð°Ð¿ÑÐ¾Ñ Ð²ÑÐ²Ð¾Ð´Ð¸Ñ Ð²Ñе ÑÑÑеÑÑвÑÑÑие ÑемейÑÑва опеÑаÑоÑов и вÑе опеÑаÑоÑÑ, вклÑÑÑннÑе в ÑÑи ÑемейÑÑва:
SELECT am.amname AS index_method,
opf.opfname AS opfamily_name,
amop.amopopr::regoperator AS opfamily_operator
FROM pg_am am, pg_opfamily opf, pg_amop amop
WHERE opf.opfmethod = am.oid AND
amop.amopfamily = opf.oid
ORDER BY index_method, opfamily_name, opfamily_operator;