{"id":497520,"date":"2026-10-06T09:23:41","date_gmt":"2026-10-06T09:23:41","guid":{"rendered":"https:\/\/savepearlharbor.com\/?p=497520"},"modified":"-0001-11-30T00:00:00","modified_gmt":"2026-10-06T09:23:41","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=497520","title":{"rendered":"\u041f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e\u0435 (\u043a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0442\u043d\u043e\u0435) \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u0432 \u043d\u0430\u00a0\u0441\u0435\u043a\u0446\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0442\u0430\u0431\u043b\u0438\u0446\u0430\u0445"},"content":{"rendered":"<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440! \u0421\u0435\u0439\u0447\u0430\u0441 \u043c\u043d\u043e\u0433\u0438\u0435 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 \u0430\u043a\u0442\u0438\u0432\u043d\u043e \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0442\u0441\u044f \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u043c \u00ab\u0438\u043c\u043f\u043e\u0440\u0442\u043e\u0437\u0430\u043c\u0435\u0449\u0435\u043d\u0438\u044f\u00bb \u0438 \u043c\u043d\u0435 \u0432\u044b\u043f\u0430\u043b\u0430 \u0437\u0430\u0434\u0430\u0447\u0430 \u043e\u0442\u0432\u0435\u0447\u0430\u0442\u044c \u0437\u0430\u00a0\u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 \u0438 \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u044e \u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u043b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f. \u0421\u0435\u0440\u0432\u0438\u0441 \u043b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d \u043d\u0430\u00a0Spring \u0438 \u043f\u043e\u0441\u043b\u0435 \u043e\u0442\u043a\u0430\u0437\u0430 \u043e\u0442\u00a0Oracle \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0411\u0414 PostgreSQL \u0434\u043b\u044f\u00a0\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u043b\u043e\u0433\u043e\u0432. \u0412\u00a0\u0441\u0440\u0435\u0434\u043d\u0435\u043c \u0440\u0430\u0437\u043c\u0435\u0440 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043b\u043e\u0433\u043e\u0432 \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 ~3\u0422\u0431. \u0412\u00a0\u043a\u0430\u043a\u043e\u0439\u2011\u0442\u043e \u043c\u043e\u043c\u0435\u043d\u0442 \u043f\u043e\u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043b\u043e\u0441\u044c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043b\u043e\u0433\u043e\u0432 \u043d\u043e\u0432\u044b\u043c\u0438 \u0438\u043d\u0434\u0435\u043a\u0441\u0430\u043c\u0438, \u0438 \u044f \u0445\u043e\u0447\u0443 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c, \u0441\u00a0\u043a\u0430\u043a\u0438\u043c\u0438 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430\u043c\u0438 \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0441\u00a0\u0442\u043e\u043b\u043a\u043d\u0443\u0442\u044c\u0441\u044f \u0438 \u043a\u0430\u043a\u00a0\u0438\u0445 \u0440\u0435\u0448\u0430\u043b\u0438. \u0412\u0430\u0436\u043d\u043e \u0437\u0430\u043c\u0435\u0447\u0430\u043d\u0438\u044f:<\/p>\n<ul>\n<li>\n<p>\u0412\u00a0\u0441\u0442\u0430\u0442\u044c\u0435 \u043f\u0440\u0438\u043c\u0435\u0440 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0438\u043d\u0434\u0435\u043a\u0441\u0430 \u043e\u0441\u043d\u043e\u0432\u0430\u043d \u043d\u0430\u00a0\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u0441\u0430\u043c\u043e\u043f\u0438\u0441\u043d\u044b\u0445 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440 (\u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u044b \u0431\u0443\u0434\u0443\u0442 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u044b) <\/p>\n<\/li>\n<li>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0438\u043d\u0434\u0435\u043a\u0441\u0430 \u043d\u0430\u00a0\u0432\u0441\u0435\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 base_log (\u0432\u043a\u043b\u044e\u0447\u0430\u044f \u0443\u0436\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0435 \u0441\u0435\u043a\u0446\u0438\u0438)<\/p>\n<\/li>\n<\/ul>\n<h2>\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435<\/h2>\n<p>\u0418\u0442\u0430\u043a, \u0438\u043c\u0435\u0435\u0442\u0441\u044f \u0441\u0445\u0435\u043c\u0430 app, \u0433\u0434\u0435 \u0435\u0441\u0442\u044c \u0442\u0430\u0431\u043b\u0438\u0447\u043a\u0430 \u0441\u00a0\u043b\u043e\u0433\u0430\u043c\u0438 \u00abbase_log\u00bb. \u0423\u00a0\u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0438\u043c\u0435\u0435\u0442\u0441\u044f \u043f\u0430\u0440\u0442\u0438\u0446\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u043e\u00a0\u0434\u0430\u0442\u0435\u00a0\u2014 \u043f\u0435\u0440\u0438\u043e\u0434 \u043e\u0434\u043d\u0430 \u043d\u0435\u0434\u0435\u043b\u044f. \u0412\u00a0\u044d\u0442\u0443 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u043e \u043f\u0438\u0448\u0443\u0442\u0441\u044f \u043b\u043e\u0433\u0438, \u0430\u00a0\u0432\u0441\u0435 ddl\/dml \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u043b\u0438\u0432\u0430\u044e\u0442\u0441\u044f Liquibase. \u0417\u0430\u0434\u0430\u0447\u0430\u00a0\u2014 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u043f\u043e\u00a0\u043f\u043e\u043b\u044e operation_uid (\u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438) \u0438 start_date (\u0434\u0430\u0442\u0430 \u043d\u0430\u0447\u0430\u043b\u0430 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438). \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0438\u043d\u0434\u0435\u043a\u0441\u0430 \u0432\u00a0\u043b\u043e\u0431 \u0437\u0430\u043d\u044f\u043b\u043e\u00a0\u0431\u044b \u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 (\u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0431\u043e\u043b\u0435\u0435 \u0434\u0432\u0443\u0445 \u0447\u0430\u0441\u043e\u0432) \u0438 \u0442\u0430\u043a\u043e\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u043d\u0435\u00a0\u043f\u043e\u0434\u0445\u043e\u0434\u0438\u043b, \u0442\u0430\u043a \u043a\u0430\u043a\u00a0\u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c\u00a0\u0431\u044b \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u0435\u0440\u0432\u0438\u0441. \u0422\u0430\u043a \u0432\u00a0PostgreSQL \u0434\u043b\u044f\u00a0\u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0438\u043d\u0434\u0435\u043a\u0441\u0430 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0430 <u>SHARE<\/u> (ShareLock), \u0442\u043e \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u0442\u0441\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0442\u043d\u043e\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0438\u043d\u0434\u0435\u043a\u0441\u0430.<\/p>\n<p><strong>\u041a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0442\u043d\u044b\u0439 \u0438\u043d\u0434\u0435\u043a\u0441<\/strong> (concurrently index)\u00a0\u2014 \u0444\u043e\u043d\u043e\u0432\u043e\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0438\u043d\u0434\u0435\u043a\u0441\u0430. \u042d\u0442\u0430 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0430 (\u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e) \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0438\u043d\u0434\u0435\u043a\u0441\u0430 \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f \u043e\u0442\u00a0\u043e\u0431\u044b\u0447\u043d\u043e\u0439 \u0442\u0435\u043c, \u0447\u0442\u043e\u00a0\u043e\u043d\u0430 \u043d\u0435\u00a0\u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b, \u0430\u00a0\u0437\u043d\u0430\u0447\u0438\u0442 \u0438 \u043d\u0435\u00a0\u0431\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u0442 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0437\u0430\u043f\u0438\u0441\u0438. \u0421\u00a0\u0434\u0440\u0443\u0433\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b, \u043e\u043d\u0430 \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 \u0431\u043e\u043b\u044c\u0448\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0438 \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u044f\u0435\u0442 \u0431\u043e\u043b\u044c\u0448\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u043b\u0441\u044f \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0441\u00a0\u043a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0442\u043d\u044b\u043c \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435\u043c \u0438\u043d\u0434\u0435\u043a\u0441\u0430, \u043e\u0434\u043d\u0430\u043a\u043e \u0438\u043d\u0434\u0435\u043a\u0441 \u0441\u00a0\u0442\u0430\u043a\u0438\u043c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u043c \u043d\u0435\u043b\u044c\u0437\u044f \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043d\u0430\u00a0\u0441\u0435\u043a\u0446\u0438\u043e\u043d\u0438\u0440\u0443\u0435\u043c\u043e\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 (\u0441\u043c. <a href=\"https:\/\/www.postgresql.org\/docs\/current\/ddl-partitioning.html\" rel=\"noopener nofollow\">https:\/\/www.postgresql.org\/docs\/current\/ddl\u2011partitioning.html<\/a>):<\/p>\n<blockquote>\n<p>To avoid this, you can use CREATE INDEX ON ONLY the partitioned table, which creates the new index marked as invalid, preventing automatic application to existing partitions. Instead, indexes can then be created individually on each partition using CONCURRENTLY and attached to the partitioned index on the parent using ALTER INDEX \u2026 ATTACH PARTITION. Once indexes for all the partitions are attached to the parent index, the parent index will be marked valid automatically.<\/p>\n<\/blockquote>\n<p>\u041d\u0430\u00a0\u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u043c \u0441\u0430\u0439\u0442\u0435 \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u0442\u0441\u044f \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u043f\u043e\u00a0\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0443: <\/p>\n<ol>\n<li>\n<p>\u0421\u043e\u0437\u0434\u0430\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u043d\u0430\u00a0\u043e\u0441\u043d\u043e\u0432\u043d\u0443\u044e (\u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u0443\u044e) \u0442\u0430\u0431\u043b\u0438\u0446\u0443;<\/p>\n<\/li>\n<li>\n<p>\u0421\u043e\u0437\u0434\u0430\u0442\u044c \u043a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0442\u043d\u044b\u0439 \u0438\u043d\u0434\u0435\u043a\u0441 \u043d\u0430\u00a0\u043a\u0430\u0436\u0434\u0443\u044e \u0441\u0435\u043a\u0446\u0438\u044e;<\/p>\n<\/li>\n<li>\n<p>\u0421\u043e\u0435\u0434\u0438\u043d\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u043d\u0430\u00a0\u0441\u0435\u043a\u0446\u0438\u0438 \u0441\u00a0\u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c \u043d\u0430\u00a0\u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0439 \u0442\u0430\u0431\u043b\u0438\u0447\u043a\u0435.<\/p>\n<\/li>\n<\/ol>\n<p>\u041f\u043e\u00a0\u044d\u0442\u043e\u043c\u0443 \u043f\u043b\u0430\u043d\u0443 \u0438 \u0440\u0435\u0448\u0435\u043d\u043e\u00a0\u0431\u044b\u043b\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c, \u043d\u043e\u00a0\u0435\u0441\u0442\u044c \u0434\u0432\u0430 \u043d\u044e\u0430\u043d\u0441\u0430:<\/p>\n<ol>\n<li>\n<p>\u0412\u0441\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u043b\u0438\u0432\u0430\u044e\u0442\u0441\u044f Liquibase \u0440\u0430\u0432\u043d\u043e\u043c\u0435\u0440\u043d\u043e \u043f\u043e\u00a0\u0441\u0442\u0435\u043d\u0434\u0430\u043c, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0437\u043d\u0430\u0442\u044c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0435\u043a\u0446\u0438\u0439 \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e. \u041d\u0443\u0436\u043d\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0434\u043e\u0441\u0442\u0430\u043d\u0435\u0442 \u0432\u0441\u0435 \u0441\u0435\u043a\u0446\u0438\u0438, \u0441\u043e\u0437\u0434\u0430\u0441\u0442 \u043d\u0430\u00a0\u043d\u0438\u0445 \u043a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0442\u043d\u044b\u0439 \u0438\u043d\u0434\u0435\u043a\u0441 \u0438 \u0441\u043e\u0435\u0434\u0438\u043d\u0438\u0442 \u0441\u00a0\u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0439 \u0442\u0430\u0431\u043b\u0438\u0447\u043a\u043e\u0439. <\/p>\n<\/li>\n<li>\n<p>\u041a\u00a0\u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u0432\u00a0PostgreSQL \u043d\u0435\u043b\u044c\u0437\u044f \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043a\u043e\u043d\u043a\u0440\u0443\u0442\u0435\u043d\u044b\u0439 \u0438\u043d\u0434\u0435\u043a\u0441 \u0447\u0435\u0440\u0435\u0437 \u0444\u0443\u043d\u043a\u0446\u0438\u044e, \u0442\u043e \u0435\u0441\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c execute \u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u0432\u0430\u0440\u0438\u0430\u0446\u0438\u0438. \u0422\u0435\u043a\u0441\u0442 \u043e\u0448\u0438\u0431\u043a\u0438: <\/p>\n<\/li>\n<\/ol>\n<p><code>Error: CREATE INDEX CONCURRENTLY cannot be executed from a function<\/code><\/p>\n<p>\u041f\u043e\u044d\u0442\u043e\u043c\u0443\u00a0\u0431\u044b\u043b\u043e \u0440\u0435\u0448\u0435\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0440\u043e\u043b\u0438\u043b\u0438\u0441\u044c\u00a0\u0431\u044b Liquibase, \u0430\u00a0\u0437\u0430\u0442\u0435\u043c\u00a0\u0431\u044b\u043b\u0438\u00a0\u0431\u044b \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u044b \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u043e\u043c \u0441\u0435\u0440\u0432\u0435\u0440\u0430. \u0418\u0442\u043e\u0433\u043e\u0432\u044b\u0435 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0430\u0446\u0438\u0438 \u043f\u043e\u00a0\u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044e \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u0432 \u043d\u0430\u00a0\u0432\u044b\u0441\u043e\u043a\u043e\u043d\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u044b\u0445 \u0442\u0430\u0431\u043b\u0438\u0446\u0430\u0445 \u0440\u0430\u0437\u0431\u0435\u0440\u0435\u043c \u0432\u00a0\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c \u043f\u0430\u0440\u0430\u0433\u0440\u0430\u0444\u0435.<\/p>\n<h2>\u041f\u043b\u0430\u043d \u043f\u043e\u00a0\u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044e \u0440\u0430\u0431\u043e\u0442 \u0434\u043b\u044f\u00a0\u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0438\u043d\u0434\u0435\u043a\u0441\u0430<\/h2>\n<p>\u0418\u0442\u0430\u043a, \u0432\u00a0\u0411\u0414\u00a0\u0431\u044b\u043b\u0438 \u043f\u0440\u043e\u043b\u0438\u0442\u044b \u0441\u0430\u043c\u043e\u043f\u0438\u0441\u043d\u044b\u0435 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u044b \u0441\u00a0\u043f\u043e\u043c\u043e\u0449\u044c\u044e liquibase. \u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0438\u0445 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0432\u00a0\u0441\u0442\u0440\u043e\u0433\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435:<\/p>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<td>\n<p align=\"left\"><strong>\u2116<\/strong><\/p>\n<\/td>\n<td data-colwidth=\"260\" width=\"260\">\n<p align=\"left\"><strong>\u0427\u0442\u043e<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\"><strong>\u041a\u0430\u043a<\/strong><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">1<\/p>\n<\/td>\n<td data-colwidth=\"260\" width=\"260\">\n<p align=\"left\">\u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0438\u043d\u0434\u0435\u043a\u0441\u0430 \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0434\u043b\u044f\u00a0\u0440\u0443\u0447\u043d\u043e\u0433\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u0432 \u043d\u0430\u00a0\u0441\u0435\u043a\u0446\u0438\u044f\u0445<\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>call applog.create_index_log(\u2018base_log\u2019, \u2018operation_uid\u2019, \u2018start_date\u2019);<\/code><\/p>\n<p align=\"left\">The table was successfully locked <\/p>\n<p align=\"left\">\u2022\u043f\u043e\u0441\u043b\u0435 \u043f.1\u00a0\u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u0442\u0441\u044f \u044f\u0432\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c COMMIT. <\/p>\n<p align=\"left\">\u2022\u044d\u0442\u043e \u043a\u043e\u043c\u0430\u043d\u0434\u0430 \u0441\u043e\u0437\u0434\u0430\u0441\u0442 \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u0439 \u0438\u043d\u0434\u0435\u043a\u0441 \u043d\u0430\u00a0\u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 (\u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0439) \u0442\u0430\u0431\u043b\u0438\u0446\u0435<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">2<\/p>\n<\/td>\n<td data-colwidth=\"260\" width=\"260\">\n<p align=\"left\">\u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b, \u0447\u0442\u043e\u0431\u044b \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u043d\u0430\u00a0\u0441\u0435\u043a\u0446\u0438\u044f\u0445. <\/p>\n<p align=\"left\">\u0412\u00a0\u0434\u0430\u043d\u043d\u043e\u043c \u043f\u0443\u043d\u043a\u0442\u0435 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d \u043f\u0440\u0438\u043c\u0435\u0440 \u043a\u043e\u043c\u0430\u043d\u0434 \u0434\u043b\u044f\u00a0\u043c\u043e\u0435\u0433\u043e \u0441\u043b\u0443\u0447\u0430\u044f.<\/p>\n<\/td>\n<td>\n<p align=\"left\">create index concurrently base_log_default_operation_uid_start_date_idx on applog.base_log_default (operation_uid,start_date); <\/p>\n<p align=\"left\">create index concurrently base_log_y2023_w42_operation_uid_start_date_idx on applog.base_log_y2023_w42\u00a0(operation_uid,start_date); <\/p>\n<p align=\"left\">create index concurrently base_log_y2024_w20_operation_uid_start_date_idx on applog.base_log_y2024_w20\u00a0(operation_uid,start_date); <\/p>\n<p align=\"left\">[2025\u201306-09 15:11:11] completed in 152\u00a0ms<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">3<\/p>\n<\/td>\n<td data-colwidth=\"260\" width=\"260\">\n<p align=\"left\">\u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0443, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0441\u043e\u0435\u0434\u0438\u043d\u0438\u0442 \u0438\u043d\u0434\u0435\u043a\u0441\u044b (\u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0439 \u0438\u043d\u0434\u0435\u043a\u0441 \u0441\u00a0\u0442\u0435\u043c\u0438, \u0447\u0442\u043e\u00a0\u043d\u0430\u00a0\u0441\u0435\u043a\u0446\u0438\u044f\u0445)<\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>call applog.attach_index_on_partition(\u2018applog.base_log\u2019,\u2018operation_uid_start_date\u2019);<\/code><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">4<\/p>\n<\/td>\n<td data-colwidth=\"260\" width=\"260\">\n<p align=\"left\">\u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443<\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>select indisvalid from pg_index where indexrelid::regclass::text = \u2018base_log_operation_uid_start_date_idx\u2019; <\/code><\/p>\n<p align=\"left\">\u2022\u0421\u043e\u0431\u0440\u0430\u043d\u043d\u044b\u0439 \u0438\u043d\u0434\u0435\u043a\u0441\u00a0\u2014 \u044d\u0442\u043e indisvalid=true (\u0442\u043e \u0435\u0441\u0442\u044c, \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u0434\u043b\u044f\u00a0\u043f\u043e\u0438\u0441\u043a\u0430), \u0434\u043e\u00a0\u0442\u0435\u0445 \u043f\u043e\u0440, \u043f\u043e\u043a\u0430 \u0438\u043d\u0434\u0435\u043a\u0441 \u043d\u0435\u00a0\u0441\u043e\u0431\u0440\u0430\u043b\u0441\u044f \u0435\u0433\u043e \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e indisvalid \u0431\u0443\u0434\u0435\u0442 false<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<h2>\u0421\u043f\u0438\u0441\u043e\u043a \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440<\/h2>\n<p>1) \u041f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0430 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u043b\u043e\u043a\u0430\u00a0\u2014 \u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e. \u0420\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u0442\u0441\u044f \u0435\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c, \u0447\u0442\u043e\u0431\u044b \u043d\u0435\u00a0\u0437\u0430\u0432\u0438\u0441\u043d\u0443\u0442\u044c \u0441\u00a0\u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0435\u043c \u0441\u0432\u043e\u0435\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u0438. \u041f\u043e\u043b\u0435\u0437\u043d\u043e \u0432\u00a0\u043d\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u044b\u0445 \u0442\u0430\u0431\u043b\u0438\u0446\u0430\u0445, \u0447\u0442\u043e\u0431\u044b \u0441\u043b\u043e\u0432\u0438\u0442\u044c Deadlock<\/p>\n<pre><code class=\"pgsql\">\u041a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439: \u041f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0430 \u0434\u043b\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u044f\u0432\u043d\u043e\u0439 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0438 \u043d\u0430 \u0442\u0430\u0431\u043b\u0438\u0446\u0443create or replace procedure applog.set_lock(    i_table_name varchar, \/* input -- \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0432 lowercase (\u0431\u0435\u0437 \u0441\u0445\u0435\u043c\u044b) *\/    i_lock_type varchar, \/* input -- \u0442\u0438\u043f \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0438, \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f: ACCESS SHARE, ROW SHARE, ROW EXCLUSIVE, SHARE UPDATE EXCLUSIVE, SHARE, SHARE ROW EXCLUSIVE, EXCLUSIVE, ACCESS EXCLUSIVE *\/    i_lock_attempts int \/* input -- \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e 1\/10 \u0441\u0435\u043a\u0443\u043d\u0434\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0430\u0434\u043e \u0436\u0434\u0430\u0442\u044c (-1 \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0433\u043e \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0435, 0 \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u0435\u0441\u043b\u0438 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0430 \u043d\u0435 \u043d\u0443\u0436\u043d\u0430) *\/) as$$declare    l_check_exist numeric;    l_counter     int;    l_my_sleep    varchar;    l_schema_name varchar = 'applog'; -- \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0441\u0445\u0435\u043c\u044bbegin    l_counter := 0;    select count(*) into l_check_exist from information_schema.columns    where table_schema = l_schema_name      and table_name = lower($1);    if l_check_exist != 0 and i_lock_attempts != 0 then        loop            begin                execute 'lock table ' || l_schema_name || '.' || i_table_name || ' in ' || i_lock_type || ' mode nowait';                raise notice 'The table was successfully locked';                exit;            exception                when sqlstate '55P03' then                    raise notice 'Retry: %', l_counter;                    select pg_sleep(0.1) into l_my_sleep;                    l_counter := l_counter + 1;                    if l_counter &gt;= i_lock_attempts then                        raise exception 'Failed to lock table: %', i_table_name;                    end if;            end;        end loop;    end if;end;$$    language plpgsql;<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper\"><\/span><\/a><\/div><\/pre>\n<p>2) \u041f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0441\u043e\u0437\u0434\u0430\u0435\u0442 \u0438\u043d\u0434\u0435\u043a\u0441 \u043d\u0430\u00a0\u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0443 create_index_on_partition, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0434\u043b\u044f\u00a0\u043a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0442\u043d\u043e\u0433\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u0432 \u043d\u0430\u00a0\u0441\u0435\u043a\u0446\u0438\u044f\u0445<\/p>\n<pre><code class=\"pgsql\">--\u041a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439: \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0430 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0438\u043d\u0434\u0435\u043a\u0441\u0430 \u043d\u0430 \u0441\u0435\u043a\u0446\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0442\u0430\u0431\u043b\u0438\u0446\u0430\u0445.-- \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0438\u043d\u0434\u0435\u043a\u0441 \u0441 \u043e\u043f\u0446\u0438\u0435\u0439 only \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0438\u043d\u0434\u0435\u043a\u0441 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043d\u0435 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u043b\u0441\u044f \u043d\u0430 \u0441\u0435\u043a\u0446\u0438\u044f\u0445create or replace procedure applog.create_index_log(    i_table_name varchar(150), --\u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b    i_column_name_1 varchar(150), --\u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0441\u0442\u043e\u043b\u0431\u0446\u0430 1    i_column_name_2 varchar(150)  --\u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0441\u0442\u043e\u043b\u0431\u0446\u0430 2) as$$declare    l_full_index_name         varchar(256);    l_index_name              varchar(256);    l_union_column            varchar(356);    l_union_column_index_name varchar(356);    l_lock_type               varchar(356);begin    -- \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u044f\u0435\u043c \u043a\u043e\u043b\u043e\u043d\u043a\u0438, \u043f\u043e \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043d\u0443\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441\u044b    l_union_column = i_column_name_1 || ',' || i_column_name_2 || '';    -- \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u044f\u0435\u043c \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043a\u043e\u043b\u043e\u043d\u043e\u043a, \u0447\u0442\u043e\u0431\u044b \u0432\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0432 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0438\u043d\u0434\u0435\u043a\u0441\u0430    l_union_column_index_name = i_column_name_1 || '_' || i_column_name_2 || '';    l_index_name = i_table_name || '_';    -- \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u043c \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0438\u043d\u0434\u0435\u043a\u0441\u0430 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u043b\u0438 \u043e\u043d \u0443\u0436\u0435    l_full_index_name = l_index_name || l_union_column_index_name || '_idx';    if (select count(*) from pg_indexes where schemaname = 'applog' and lower(indexname) = lower(l_full_index_name)) = 0 then        -- \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u043b\u043e\u043a \u043d\u0430 \u0442\u0430\u0431\u043b\u0438\u0446\u0443        l_lock_type = 'exclusive';        call applog.set_lock(i_table_name,l_lock_type, 5);        -- \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u0438\u043d\u0434\u0435\u043a\u0441 \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u043d\u0443\u044e \u0442\u0430\u0431\u043b\u0438\u0446\u0443 (\u043d\u0435 \u043d\u0430 \u0441\u0435\u043a\u0446\u0438\u0438)        execute 'create index ' || l_full_index_name || ' on only applog.' || i_table_name || ' (' || l_union_column || ')';    end if;    -- \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0443, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0441\u043e\u0437\u0434\u0430\u0435\u0442 \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u043d\u0430 \u0441\u0435\u043a\u0446\u0438\u044f\u0445 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u044b    call applog.create_index_on_partition(i_table_name, l_union_column, l_union_column_index_name);end;$$    language plpgsql;<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>3) \u041f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0441\u043e\u0435\u0434\u0438\u043d\u044f\u0435\u0442 \u0438\u043d\u0434\u0435\u043a\u0441 \u043d\u0430\u00a0\u0441\u0435\u043a\u0446\u0438\u0438 \u0441\u00a0\u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c \u043d\u0430\u00a0\u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0442\u0430\u0431\u043b\u0438\u0447\u043a\u0435<\/p>\n<pre><code class=\"pgsql\">--\u041a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439: \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0430 \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0433\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0430 \u0441 \u043f\u0430\u0440\u0442\u0438\u0446\u0438\u044f\u043c\u0438create or replace procedure applog.attach_index_on_partition(    i_table_name varchar(150), --\u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b    i_union_column_index_name varchar(150) --\u0441\u043f\u0438\u0441\u043e\u043a \u0441\u0442\u043e\u043b\u0431\u0446\u043e\u0432 \u0447\u0435\u0440\u0435\u0437 \"_\") as$$declare    l_table_indexes        record;    l_sql_query            varchar(256);    l_full_index_name      varchar(256);    l_full_index_name_part varchar(256);    l_index_name           varchar(256);begin    l_index_name = substr(i_table_name, length('applog..')) || '_';    -- \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u043d\u0430 \u0441\u0435\u043a\u0446\u0438\u044f\u0445 \u0438 \u0441\u043e\u0435\u0434\u0438\u043d\u044f\u0435\u043c \u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u0435    FOR l_table_indexes IN select distinct (tablename) as partition_name, substring(tablename from length(l_index_name)+1) as prefix                           from pg_indexes                           where schemaname = 'applog'                             and tablename like l_index_name||'%'                           order by tablename        loop            l_full_index_name = l_index_name || i_union_column_index_name || '_idx';            l_full_index_name_part = l_index_name || l_table_indexes.prefix || '_' || i_union_column_index_name || '_idx';            l_sql_query = 'alter index applog.' || l_full_index_name || ' attach partition applog.' || l_full_index_name_part || '';            execute l_sql_query;        end loop;end;$$    language plpgsql;<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>4) \u041f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0434\u043b\u044f\u00a0\u043a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0442\u043d\u043e\u0433\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u0432 \u043d\u0430\u00a0\u0441\u0435\u043a\u0446\u0438\u044f\u0445<\/p>\n<pre><code class=\"pgsql\">--\u041a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439: \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0438\u043d\u0434\u0435\u043a\u0441\u0430 \u043d\u0430 \u0432\u0441\u0435\u0445 \u043f\u0430\u0440\u0442\u0438\u0446\u0438\u044f\u0445create or replace procedure applog.create_index_on_partition(    i_table_name varchar(150), --\u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b    i_union_column varchar(150), --\u0441\u043f\u0438\u0441\u043e\u043a \u0441\u0442\u043e\u043b\u0431\u0446\u043e\u0432 \u0447\u0435\u0440\u0435\u0437 \u0437\u0430\u043f\u044f\u0442\u0443\u044e    i_union_column_index_name varchar(150) --\u0441\u043f\u0438\u0441\u043e\u043a \u0441\u0442\u043e\u043b\u0431\u0446\u043e\u0432 \u0447\u0435\u0440\u0435\u0437 \"_\") as$$declare    l_table_indexes   record;    l_sql_query       varchar(256);    l_full_index_name varchar(256);    l_index_name      varchar(256);begin    l_index_name = i_table_name || '_';    -- \u0438\u0449\u0435\u043c \u0432\u0441\u0435 \u0441\u0435\u043a\u0446\u0438\u0438 \u043e\u0441\u043d. \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0438 \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u0439 \u0438\u043d\u0434\u0435\u043a\u0441    FOR l_table_indexes IN select distinct (tablename) as partition_name, substring(tablename from length(l_index_name)+1) as prefix                           from pg_indexes                           where schemaname = 'applog'                             and tablename like l_index_name||'%'                           order by tablename        loop            l_full_index_name = l_index_name || l_table_indexes.prefix || '_' || i_union_column_index_name || '_idx';            l_sql_query = 'create index concurrently ' || l_full_index_name || ' on applog.' || l_table_indexes.partition_name ||                          ' (' ||                          i_union_column || ')';            raise notice '%;',l_sql_query;            l_full_index_name = '';        end loop;end;$$    language plpgsql;<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<h2>\u0418\u0442\u043e\u0433<\/h2>\n<p>\u041d\u0430\u0434\u0435\u044e\u0441\u044c, \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b \u043f\u043e\u043c\u043e\u0436\u0435\u0442 \u043a\u043e\u043c\u0443\u2011\u0442\u043e \u043f\u0440\u0438\u00a0\u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u0438\u043d\u0434\u0435\u043a\u0441\u0430 \u0432\u00a0\u043d\u0435\u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0439 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0438. \u041a\u043e\u0433\u0434\u0430 \u044f \u0441\u0442\u043e\u043b\u043a\u043d\u0443\u043b\u0441\u044f \u0441\u00a0\u043f\u0440\u043e\u0431\u043b\u0435\u043c\u043e\u0439, \u043d\u0430\u00a0\u043f\u0440\u043e\u0441\u0442\u043e\u0440\u0430\u0445 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0430\u0445 \u043d\u0435\u00a0\u043d\u0430\u0448\u0435\u043b \u0433\u043e\u0442\u043e\u0432\u043e\u0433\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u044f.<\/p>\n<\/div>\n<p>\u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/1090908\/\">https:\/\/habr.com\/ru\/articles\/1090908\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440! \u0421\u0435\u0439\u0447\u0430\u0441 \u043c\u043d\u043e\u0433\u0438\u0435 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 \u0430\u043a\u0442\u0438\u0432\u043d\u043e \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0442\u0441\u044f \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u043c \u00ab\u0438\u043c\u043f\u043e\u0440\u0442\u043e\u0437\u0430\u043c\u0435\u0449\u0435\u043d\u0438\u044f\u00bb \u0438 \u043c\u043d\u0435 \u0432\u044b\u043f\u0430\u043b\u0430 \u0437\u0430\u0434\u0430\u0447\u0430 \u043e\u0442\u0432\u0435\u0447\u0430\u0442\u044c \u0437\u0430\u00a0\u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 \u0438 \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u044e \u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u043b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f. \u0421\u0435\u0440\u0432\u0438\u0441 \u043b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d \u043d\u0430\u00a0Spring \u0438 \u043f\u043e\u0441\u043b\u0435 \u043e\u0442\u043a\u0430\u0437\u0430 \u043e\u0442\u00a0Oracle \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0411\u0414 PostgreSQL \u0434\u043b\u044f\u00a0\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u043b\u043e\u0433\u043e\u0432. \u0412\u00a0\u0441\u0440\u0435\u0434\u043d\u0435\u043c \u0440\u0430\u0437\u043c\u0435\u0440 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043b\u043e\u0433\u043e\u0432 \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 ~3\u0422\u0431. \u0412\u00a0\u043a\u0430\u043a\u043e\u0439\u2011\u0442\u043e \u043c\u043e\u043c\u0435\u043d\u0442 \u043f\u043e\u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043b\u043e\u0441\u044c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043b\u043e\u0433\u043e\u0432 \u043d\u043e\u0432\u044b\u043c\u0438 \u0438\u043d\u0434\u0435\u043a\u0441\u0430\u043c\u0438, \u0438 \u044f \u0445\u043e\u0447\u0443 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c, \u0441\u00a0\u043a\u0430\u043a\u0438\u043c\u0438 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430\u043c\u0438 \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0441\u00a0\u0442\u043e\u043b\u043a\u043d\u0443\u0442\u044c\u0441\u044f \u0438 \u043a\u0430\u043a\u00a0\u0438\u0445 \u0440\u0435\u0448\u0430\u043b\u0438. \u0412\u0430\u0436\u043d\u043e \u0437\u0430\u043c\u0435\u0447\u0430\u043d\u0438\u044f:\u0412\u00a0\u0441\u0442\u0430\u0442\u044c\u0435 \u043f\u0440\u0438\u043c\u0435\u0440 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0438\u043d\u0434\u0435\u043a\u0441\u0430 \u043e\u0441\u043d\u043e\u0432\u0430\u043d \u043d\u0430\u00a0\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u0441\u0430\u043c\u043e\u043f\u0438\u0441\u043d\u044b\u0445 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440 (\u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u044b \u0431\u0443\u0434\u0443\u0442 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u044b) \u041f\u0440\u0438\u043c\u0435\u0440 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0438\u043d\u0434\u0435\u043a\u0441\u0430 \u043d\u0430\u00a0\u0432\u0441\u0435\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 base_log (\u0432\u043a\u043b\u044e\u0447\u0430\u044f \u0443\u0436\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0435 \u0441\u0435\u043a\u0446\u0438\u0438)\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435\u0418\u0442\u0430\u043a, \u0438\u043c\u0435\u0435\u0442\u0441\u044f \u0441\u0445\u0435\u043c\u0430 app, \u0433\u0434\u0435 \u0435\u0441\u0442\u044c \u0442\u0430\u0431\u043b\u0438\u0447\u043a\u0430 \u0441\u00a0\u043b\u043e\u0433\u0430\u043c\u0438 \u00abbase_log\u00bb. \u0423\u00a0\u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0438\u043c\u0435\u0435\u0442\u0441\u044f \u043f\u0430\u0440\u0442\u0438\u0446\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u043e\u00a0\u0434\u0430\u0442\u0435\u00a0\u2014 \u043f\u0435\u0440\u0438\u043e\u0434 \u043e\u0434\u043d\u0430 \u043d\u0435\u0434\u0435\u043b\u044f. \u0412\u00a0\u044d\u0442\u0443 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u043e \u043f\u0438\u0448\u0443\u0442\u0441\u044f \u043b\u043e\u0433\u0438, \u0430\u00a0\u0432\u0441\u0435 ddl\/dml \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u043b\u0438\u0432\u0430\u044e\u0442\u0441\u044f Liquibase. \u0417\u0430\u0434\u0430\u0447\u0430\u00a0\u2014 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u043f\u043e\u00a0\u043f\u043e\u043b\u044e operation_uid (\u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438) \u0438 start_date (\u0434\u0430\u0442\u0430 \u043d\u0430\u0447\u0430\u043b\u0430 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438). \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0438\u043d\u0434\u0435\u043a\u0441\u0430 \u0432\u00a0\u043b\u043e\u0431 \u0437\u0430\u043d\u044f\u043b\u043e\u00a0\u0431\u044b \u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 (\u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0431\u043e\u043b\u0435\u0435 \u0434\u0432\u0443\u0445 \u0447\u0430\u0441\u043e\u0432) \u0438 \u0442\u0430\u043a\u043e\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u043d\u0435\u00a0\u043f\u043e\u0434\u0445\u043e\u0434\u0438\u043b, \u0442\u0430\u043a \u043a\u0430\u043a\u00a0\u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c\u00a0\u0431\u044b \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u0435\u0440\u0432\u0438\u0441. \u0422\u0430\u043a \u0432\u00a0PostgreSQL \u0434\u043b\u044f\u00a0\u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0438\u043d\u0434\u0435\u043a\u0441\u0430 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0430 SHARE (ShareLock), \u0442\u043e \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u0442\u0441\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0442\u043d\u043e\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0438\u043d\u0434\u0435\u043a\u0441\u0430.\u041a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0442\u043d\u044b\u0439 \u0438\u043d\u0434\u0435\u043a\u0441 (concurrently index)\u00a0\u2014 \u0444\u043e\u043d\u043e\u0432\u043e\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0438\u043d\u0434\u0435\u043a\u0441\u0430. \u042d\u0442\u0430 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0430 (\u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e) \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0438\u043d\u0434\u0435\u043a\u0441\u0430 \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f \u043e\u0442\u00a0\u043e\u0431\u044b\u0447\u043d\u043e\u0439 \u0442\u0435\u043c, \u0447\u0442\u043e\u00a0\u043e\u043d\u0430 \u043d\u0435\u00a0\u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b, \u0430\u00a0\u0437\u043d\u0430\u0447\u0438\u0442 \u0438 \u043d\u0435\u00a0\u0431\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u0442 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0437\u0430\u043f\u0438\u0441\u0438. \u0421\u00a0\u0434\u0440\u0443\u0433\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b, \u043e\u043d\u0430 \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 \u0431\u043e\u043b\u044c\u0448\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0438 \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u044f\u0435\u0442 \u0431\u043e\u043b\u044c\u0448\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u043b\u0441\u044f \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0441\u00a0\u043a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0442\u043d\u044b\u043c \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435\u043c \u0438\u043d\u0434\u0435\u043a\u0441\u0430, \u043e\u0434\u043d\u0430\u043a\u043e \u0438\u043d\u0434\u0435\u043a\u0441 \u0441\u00a0\u0442\u0430\u043a\u0438\u043c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u043c \u043d\u0435\u043b\u044c\u0437\u044f \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043d\u0430\u00a0\u0441\u0435\u043a\u0446\u0438\u043e\u043d\u0438\u0440\u0443\u0435\u043c\u043e\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 (\u0441\u043c. https:\/\/www.postgresql.org\/docs\/current\/ddl\u2011partitioning.html):To avoid this, you can use CREATE INDEX ON ONLY the partitioned table, which creates the new index marked as invalid, preventing automatic application to existing partitions. Instead, indexes can then be created individually on each partition using CONCURRENTLY and attached to the partitioned index on the parent using ALTER INDEX \u2026 ATTACH PARTITION. Once indexes for all the partitions are attached to the parent index, the parent index will be marked valid automatically.\u041d\u0430\u00a0\u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u043c \u0441\u0430\u0439\u0442\u0435 \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u0442\u0441\u044f \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u043f\u043e\u00a0\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0443: \u0421\u043e\u0437\u0434\u0430\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u043d\u0430\u00a0\u043e\u0441\u043d\u043e\u0432\u043d\u0443\u044e (\u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u0443\u044e) \u0442\u0430\u0431\u043b\u0438\u0446\u0443;\u0421\u043e\u0437\u0434\u0430\u0442\u044c \u043a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0442\u043d\u044b\u0439 \u0438\u043d\u0434\u0435\u043a\u0441 \u043d\u0430\u00a0\u043a\u0430\u0436\u0434\u0443\u044e \u0441\u0435\u043a\u0446\u0438\u044e;\u0421\u043e\u0435\u0434\u0438\u043d\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u043d\u0430\u00a0\u0441\u0435\u043a\u0446\u0438\u0438 \u0441\u00a0\u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c \u043d\u0430\u00a0\u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0439 \u0442\u0430\u0431\u043b\u0438\u0447\u043a\u0435.\u041f\u043e\u00a0\u044d\u0442\u043e\u043c\u0443 \u043f\u043b\u0430\u043d\u0443 \u0438 \u0440\u0435\u0448\u0435\u043d\u043e\u00a0\u0431\u044b\u043b\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c, \u043d\u043e\u00a0\u0435\u0441\u0442\u044c \u0434\u0432\u0430 \u043d\u044e\u0430\u043d\u0441\u0430:\u0412\u0441\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u043b\u0438\u0432\u0430\u044e\u0442\u0441\u044f Liquibase \u0440\u0430\u0432\u043d\u043e\u043c\u0435\u0440\u043d\u043e \u043f\u043e\u00a0\u0441\u0442\u0435\u043d\u0434\u0430\u043c, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0437\u043d\u0430\u0442\u044c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0435\u043a\u0446\u0438\u0439 \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e. \u041d\u0443\u0436\u043d\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0434\u043e\u0441\u0442\u0430\u043d\u0435\u0442 \u0432\u0441\u0435 \u0441\u0435\u043a\u0446\u0438\u0438, \u0441\u043e\u0437\u0434\u0430\u0441\u0442 \u043d\u0430\u00a0\u043d\u0438\u0445 \u043a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0442\u043d\u044b\u0439 \u0438\u043d\u0434\u0435\u043a\u0441 \u0438 \u0441\u043e\u0435\u0434\u0438\u043d\u0438\u0442 \u0441\u00a0\u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0439 \u0442\u0430\u0431\u043b\u0438\u0447\u043a\u043e\u0439. \u041a\u00a0\u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u0432\u00a0PostgreSQL \u043d\u0435\u043b\u044c\u0437\u044f \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043a\u043e\u043d\u043a\u0440\u0443\u0442\u0435\u043d\u044b\u0439 \u0438\u043d\u0434\u0435\u043a\u0441 \u0447\u0435\u0440\u0435\u0437 \u0444\u0443\u043d\u043a\u0446\u0438\u044e, \u0442\u043e \u0435\u0441\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c execute \u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u0432\u0430\u0440\u0438\u0430\u0446\u0438\u0438. \u0422\u0435\u043a\u0441\u0442 \u043e\u0448\u0438\u0431\u043a\u0438: Error: CREATE INDEX CONCURRENTLY cannot be executed from a function\u041f\u043e\u044d\u0442\u043e\u043c\u0443\u00a0\u0431\u044b\u043b\u043e \u0440\u0435\u0448\u0435\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0440\u043e\u043b\u0438\u043b\u0438\u0441\u044c\u00a0\u0431\u044b Liquibase, \u0430\u00a0\u0437\u0430\u0442\u0435\u043c\u00a0\u0431\u044b\u043b\u0438\u00a0\u0431\u044b \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u044b \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u043e\u043c \u0441\u0435\u0440\u0432\u0435\u0440\u0430. \u0418\u0442\u043e\u0433\u043e\u0432\u044b\u0435 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0430\u0446\u0438\u0438 \u043f\u043e\u00a0\u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044e \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u0432 \u043d\u0430\u00a0\u0432\u044b\u0441\u043e\u043a\u043e\u043d\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u044b\u0445 \u0442\u0430\u0431\u043b\u0438\u0446\u0430\u0445 \u0440\u0430\u0437\u0431\u0435\u0440\u0435\u043c \u0432\u00a0\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c \u043f\u0430\u0440\u0430\u0433\u0440\u0430\u0444\u0435.\u041f\u043b\u0430\u043d \u043f\u043e\u00a0\u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044e \u0440\u0430\u0431\u043e\u0442 \u0434\u043b\u044f\u00a0\u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0438\u043d\u0434\u0435\u043a\u0441\u0430\u0418\u0442\u0430\u043a, \u0432\u00a0\u0411\u0414\u00a0\u0431\u044b\u043b\u0438 \u043f\u0440\u043e\u043b\u0438\u0442\u044b \u0441\u0430\u043c\u043e\u043f\u0438\u0441\u043d\u044b\u0435 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u044b \u0441\u00a0\u043f\u043e\u043c\u043e\u0449\u044c\u044e liquibase. \u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0438\u0445 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0432\u00a0\u0441\u0442\u0440\u043e\u0433\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435:\u2116\u0427\u0442\u043e\u041a\u0430\u043a1\u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0438\u043d\u0434\u0435\u043a\u0441\u0430 \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0434\u043b\u044f\u00a0\u0440\u0443\u0447\u043d\u043e\u0433\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u0432 \u043d\u0430\u00a0\u0441\u0435\u043a\u0446\u0438\u044f\u0445call applog.create_index_log(\u2018base_log\u2019, \u2018operation_uid\u2019, \u2018start_date\u2019);The table was successfully locked \u2022\u043f\u043e\u0441\u043b\u0435 \u043f.1\u00a0\u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u0442\u0441\u044f \u044f\u0432\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c COMMIT. \u2022\u044d\u0442\u043e \u043a\u043e\u043c\u0430\u043d\u0434\u0430 \u0441\u043e\u0437\u0434\u0430\u0441\u0442 \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u0439 \u0438\u043d\u0434\u0435\u043a\u0441 \u043d\u0430\u00a0\u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 (\u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0439) \u0442\u0430\u0431\u043b\u0438\u0446\u04352\u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b, \u0447\u0442\u043e\u0431\u044b \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u043d\u0430\u00a0\u0441\u0435\u043a\u0446\u0438\u044f\u0445. \u0412\u00a0\u0434\u0430\u043d\u043d\u043e\u043c \u043f\u0443\u043d\u043a\u0442\u0435 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d \u043f\u0440\u0438\u043c\u0435\u0440 \u043a\u043e\u043c\u0430\u043d\u0434 \u0434\u043b\u044f\u00a0\u043c\u043e\u0435\u0433\u043e \u0441\u043b\u0443\u0447\u0430\u044f.create index concurrently base_log_default_operation_uid_start_date_idx on applog.base_log_default (operation_uid,start_date); create index concurrently base_log_y2023_w42_operation_uid_start_date_idx on applog.base_log_y2023_w42\u00a0(operation_uid,start_date); create index concurrently base_log_y2024_w20_operation_uid_start_date_idx on applog.base_log_y2024_w20\u00a0(operation_uid,start_date); [2025\u201306-09 15:11:11] completed in 152\u00a0ms3\u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0443, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0441\u043e\u0435\u0434\u0438\u043d\u0438\u0442 \u0438\u043d\u0434\u0435\u043a\u0441\u044b (\u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0439 \u0438\u043d\u0434\u0435\u043a\u0441 \u0441\u00a0\u0442\u0435\u043c\u0438, \u0447\u0442\u043e\u00a0\u043d\u0430\u00a0\u0441\u0435\u043a\u0446\u0438\u044f\u0445)call applog.attach_index_on_partition(\u2018applog.base_log\u2019,\u2018operation_uid_start_date\u2019);4\u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443select indisvalid from pg_index where indexrelid::regclass::text = \u2018base_log_operation_uid_start_date_idx\u2019; \u2022\u0421\u043e\u0431\u0440\u0430\u043d\u043d\u044b\u0439 \u0438\u043d\u0434\u0435\u043a\u0441\u00a0\u2014 \u044d\u0442\u043e indisvalid=true (\u0442\u043e \u0435\u0441\u0442\u044c, \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u0434\u043b\u044f\u00a0\u043f\u043e\u0438\u0441\u043a\u0430), \u0434\u043e\u00a0\u0442\u0435\u0445 \u043f\u043e\u0440, \u043f\u043e\u043a\u0430 \u0438\u043d\u0434\u0435\u043a\u0441 \u043d\u0435\u00a0\u0441\u043e\u0431\u0440\u0430\u043b\u0441\u044f \u0435\u0433\u043e \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e indisvalid \u0431\u0443\u0434\u0435\u0442 false\u0421\u043f\u0438\u0441\u043e\u043a \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u04401) \u041f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0430 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u043b\u043e\u043a\u0430\u00a0\u2014 \u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e. \u0420\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u0442\u0441\u044f \u0435\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c, \u0447\u0442\u043e\u0431\u044b \u043d\u0435\u00a0\u0437\u0430\u0432\u0438\u0441\u043d\u0443\u0442\u044c \u0441\u00a0\u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0435\u043c \u0441\u0432\u043e\u0435\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u0438. \u041f\u043e\u043b\u0435\u0437\u043d\u043e \u0432\u00a0\u043d\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u044b\u0445 \u0442\u0430\u0431\u043b\u0438\u0446\u0430\u0445, \u0447\u0442\u043e\u0431\u044b \u0441\u043b\u043e\u0432\u0438\u0442\u044c Deadlock\u041a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439: \u041f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0430 \u0434\u043b\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u044f\u0432\u043d\u043e\u0439 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0438 \u043d\u0430 \u0442\u0430\u0431\u043b\u0438\u0446\u0443create or replace procedure applog.set_lock(    i_table_name varchar, \/* input &#8212; \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0432 lowercase (\u0431\u0435\u0437 \u0441\u0445\u0435\u043c\u044b) *\/    i_lock_type varchar, \/* input &#8212; \u0442\u0438\u043f \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0438, \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f: ACCESS SHARE, ROW SHARE, ROW EXCLUSIVE, SHARE UPDATE EXCLUSIVE, SHARE, SHARE ROW EXCLUSIVE, EXCLUSIVE, ACCESS EXCLUSIVE *\/    i_lock_attempts int \/* input &#8212; \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e 1\/10 \u0441\u0435\u043a\u0443\u043d\u0434\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0430\u0434\u043e \u0436\u0434\u0430\u0442\u044c (-1 \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0433\u043e \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0435, 0 \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u0435\u0441\u043b\u0438 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0430 \u043d\u0435 \u043d\u0443\u0436\u043d\u0430) *\/) as$$declare    l_check_exist numeric;    l_counter     int;    l_my_sleep    varchar;    l_schema_name varchar = &#8216;applog&#8217;; &#8212; \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0441\u0445\u0435\u043c\u044bbegin    l_counter := 0;    select count(*) into l_check_exist from information_schema.columns    where table_schema = l_schema_name      and table_name = lower($1);    if l_check_exist != 0 and i_lock_attempts != 0 then        loop            begin                execute &#8216;lock table &#8216; || l_schema_name || &#8216;.&#8217; || i_table_name || &#8216; in &#8216; || i_lock_type || &#8216; mode nowait&#8217;;                raise notice &#8216;The table was successfully locked&#8217;;                exit;            exception                when sqlstate &#8217;55P03&#8242; then                    raise notice &#8216;Retry: %&#8217;, l_counter;                    select pg_sleep(0.1) into l_my_sleep;                    l_counter := l_counter + 1;                    if l_counter &gt;= i_lock_attempts then                        raise exception &#8216;Failed to lock table: %&#8217;, i_table_name;                    end if;            end;        end loop;    end if;end;$$    language plpgsql;2) \u041f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0441\u043e\u0437\u0434\u0430\u0435\u0442 \u0438\u043d\u0434\u0435\u043a\u0441 \u043d\u0430\u00a0\u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0443 create_index_on_partition, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0434\u043b\u044f\u00a0\u043a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0442\u043d\u043e\u0433\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u0432 \u043d\u0430\u00a0\u0441\u0435\u043a\u0446\u0438\u044f\u0445&#8212;\u041a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439: \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0430 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0438\u043d\u0434\u0435\u043a\u0441\u0430 \u043d\u0430 \u0441\u0435\u043a\u0446\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0442\u0430\u0431\u043b\u0438\u0446\u0430\u0445.&#8212; \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0438\u043d\u0434\u0435\u043a\u0441 \u0441 \u043e\u043f\u0446\u0438\u0435\u0439 only \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0438\u043d\u0434\u0435\u043a\u0441 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043d\u0435 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u043b\u0441\u044f \u043d\u0430 \u0441\u0435\u043a\u0446\u0438\u044f\u0445create or replace procedure applog.create_index_log(    i_table_name varchar(150), &#8212;\u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b    i_column_name_1 varchar(150), &#8212;\u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0441\u0442\u043e\u043b\u0431\u0446\u0430 1    i_column_name_2 varchar(150)  &#8212;\u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0441\u0442\u043e\u043b\u0431\u0446\u0430 2) as$$declare    l_full_index_name         varchar(256);    l_index_name              varchar(256);    l_union_column            varchar(356);    l_union_column_index_name varchar(356);    l_lock_type               varchar(356);begin    &#8212; \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u044f\u0435\u043c \u043a\u043e\u043b\u043e\u043d\u043a\u0438, \u043f\u043e \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043d\u0443\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441\u044b    l_union_column = i_column_name_1 || &#8216;,&#8217; || i_column_name_2 || &#187;;    &#8212; \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u044f\u0435\u043c \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043a\u043e\u043b\u043e\u043d\u043e\u043a, \u0447\u0442\u043e\u0431\u044b \u0432\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0432 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0438\u043d\u0434\u0435\u043a\u0441\u0430    l_union_column_index_name = i_column_name_1 || &#8216;_&#8217; || i_column_name_2 || &#187;;    l_index_name = i_table_name || &#8216;_&#8217;;    &#8212; \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u043c \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0438\u043d\u0434\u0435\u043a\u0441\u0430 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u043b\u0438 \u043e\u043d \u0443\u0436\u0435    l_full_index_name = l_index_name || l_union_column_index_name || &#8216;_idx&#8217;;    if (select count(*) from pg_indexes where schemaname = &#8216;applog&#8217; and lower(indexname) = lower(l_full_index_name)) = 0 then        &#8212; \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u043b\u043e\u043a \u043d\u0430 \u0442\u0430\u0431\u043b\u0438\u0446\u0443        l_lock_type = &#8216;exclusive&#8217;;        call applog.set_lock(i_table_name,l_lock_type, 5);        &#8212; \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u0438\u043d\u0434\u0435\u043a\u0441 \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u043d\u0443\u044e \u0442\u0430\u0431\u043b\u0438\u0446\u0443 (\u043d\u0435 \u043d\u0430 \u0441\u0435\u043a\u0446\u0438\u0438)        execute &#8216;create index &#8216; || l_full_index_name || &#8216; on only applog.&#8217; || i_table_name || &#8216; (&#8216; || l_union_column || &#8216;)&#8217;;    end if;    &#8212; \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0443, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0441\u043e\u0437\u0434\u0430\u0435\u0442 \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u043d\u0430 \u0441\u0435\u043a\u0446\u0438\u044f\u0445 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u044b    call applog.create_index_on_partition(i_table_name, l_union_column, l_union_column_index_name);end;$$    language plpgsql;3) \u041f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0441\u043e\u0435\u0434\u0438\u043d\u044f\u0435\u0442 \u0438\u043d\u0434\u0435\u043a\u0441 \u043d\u0430\u00a0\u0441\u0435\u043a\u0446\u0438\u0438 \u0441\u00a0\u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c \u043d\u0430\u00a0\u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0442\u0430\u0431\u043b\u0438\u0447\u043a\u0435&#8212;\u041a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439: \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0430 \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0433\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0430 \u0441 \u043f\u0430\u0440\u0442\u0438\u0446\u0438\u044f\u043c\u0438create or replace procedure applog.attach_index_on_partition(    i_table_name varchar(150), &#8212;\u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b    i_union_column_index_name varchar(150) &#8212;\u0441\u043f\u0438\u0441\u043e\u043a \u0441\u0442\u043e\u043b\u0431\u0446\u043e\u0432 \u0447\u0435\u0440\u0435\u0437 &#171;_&#187;) as$$declare    l_table_indexes        record;    l_sql_query            varchar(256);    l_full_index_name      varchar(256);    l_full_index_name_part varchar(256);    l_index_name           varchar(256);begin    l_index_name = substr(i_table_name, length(&#8216;applog..&#8217;)) || &#8216;_&#8217;;    &#8212; \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u043d\u0430 \u0441\u0435\u043a\u0446\u0438\u044f\u0445 \u0438 \u0441\u043e\u0435\u0434\u0438\u043d\u044f\u0435\u043c \u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u0435    FOR l_table_indexes IN select distinct (tablename) as partition_name, substring(tablename from length(l_index_name)+1) as prefix                           from pg_indexes                           where schemaname = &#8216;applog&#8217;                             and tablename like l_index_name||&#8217;%&#8217;                           order by tablename        loop            l_full_index_name = l_index_name || i_union_column_index_name || &#8216;_idx&#8217;;            l_full_index_name_part = l_index_name || l_table_indexes.prefix || &#8216;_&#8217; || i_union_column_index_name || &#8216;_idx&#8217;;            l_sql_query = &#8216;alter index applog.&#8217; || l_full_index_name || &#8216; attach partition applog.&#8217; || l_full_index_name_part || &#187;;            execute l_sql_query;        end loop;end;$$    language plpgsql;4) \u041f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0434\u043b\u044f\u00a0\u043a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0442\u043d\u043e\u0433\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u0432 \u043d\u0430\u00a0\u0441\u0435\u043a\u0446\u0438\u044f\u0445&#8212;\u041a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439: \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0430&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-497520","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/497520","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=497520"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/497520\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=497520"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=497520"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=497520"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}