All checks were successful
Deploy Static Site / deploy (push) Successful in 6m6s
266 lines
30 KiB
HTML
266 lines
30 KiB
HTML
<!DOCTYPE html>
|
||
<html lang="en">
|
||
|
||
<head>
|
||
<title>PostgreSQL performance diagnostics</title>
|
||
<meta name="generator" content="Help+Manual" />
|
||
<meta name="keywords" content="" />
|
||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
|
||
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
|
||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||
<meta name="description" content="In this article, we will explore performance diagnostic methods for PostgreSQL, consisting of three key steps:" />
|
||
<meta name="picture" content="" />
|
||
<meta property="og:type" content="website" />
|
||
<meta property="og:title" content="Full documentation for BRIX365 platform. Low-code developer guide. User guide. Admin guide. Developer guide." />
|
||
<meta property="og:url" content="https://brix365.com/en/help" />
|
||
<meta property="og:image" content="" />
|
||
<link rel="icon" href="favicon.png" type="image/png" />
|
||
|
||
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap" rel="stylesheet" />
|
||
<link rel="stylesheet" href="./jquery-ui.min.css" />
|
||
<link rel="stylesheet" href="default.css" />
|
||
<link rel="stylesheet" href="./search-yandex.css" />
|
||
<link rel="stylesheet" href="./article.css" />
|
||
<link rel="stylesheet" href="./glossary.css" />
|
||
<link rel="stylesheet" href="./theme.css" />
|
||
<script type="text/javascript" src="jquery.js"></script>
|
||
<script type="text/javascript" src="helpman_settings.js"></script>
|
||
<script type="text/javascript" src="helpman_topicinit.js"></script>
|
||
|
||
<script type="text/javascript" src="highlight.js"></script>
|
||
<script type="text/javascript">
|
||
$(document).ready(function(){highlight();});
|
||
</script>
|
||
</head>
|
||
|
||
<body>
|
||
|
||
<script>!function(e,t,c,n,r,a,m){e.ym=e.ym||function(){(e.ym.a=e.ym.a||[]).push(arguments)},e.ym.l=1*new Date;for(var s=0;s<document.scripts.length;s++)if(document.scripts[s].src===n)return;a=t.createElement(c),m=t.getElementsByTagName(c)[0],a.async=1,a.src=n,m.parentNode.insertBefore(a,m)}(window,document,"script","https://mc.yandex.ru/metrika/tag.js"),ym(83179930,"init",{clickmap:!0,trackLinks:!0,accurateTrackBounce:!0,webvisor:!0})</script><noscript><div><img alt=""src=https://mc.yandex.ru/watch/83179930 style=position:absolute;left:-9999px></div></noscript>
|
||
|
||
<header class="header elma-365">
|
||
<div class="container">
|
||
<a class="header__logo" href="https://brix365.com/en/help">
|
||
<img src="./logo-en.svg" alt="header logo">
|
||
</a>
|
||
<!-- <div class="hero__search-form" id="search-panel">
|
||
<form class="search-form" onsubmit="ym(83180416,'reachGoal','poisk')">
|
||
<label class="search-form__label">
|
||
<span id="reset-search" class="search__icon"></span>
|
||
<input class="search-form__input" type="text">
|
||
</label>
|
||
<input class="search-form__submit" type="submit" value="Submit">
|
||
</form>
|
||
</div> -->
|
||
|
||
<div class="hero__search-form" id="search-panel"> <form class="search-form"> <label class="search-form__label"> <span id="reset-search" class="search__icon"></span> <input class="search-form__input" type="text"> </label> <input class="search-form__submit" type="submit" value="Submit"> </form> </div>
|
||
<div class="hero__search">
|
||
<a href="#" id="search-icon" class="hero__search-icon">
|
||
<img src="search-icon-white.svg" alt="search string">
|
||
</a>
|
||
<a href="#" id="side-menu-icon" class="hero__side-icon">
|
||
<img src="side_menu.svg" alt="side menu">
|
||
</a>
|
||
</div>
|
||
<div class="header__navi">
|
||
|
||
<ul class="header__list"><li><span class="solution-select"><span class="solution-select__selected"></span><svg width="7" height="4" viewBox="0 0 7 4" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M1 1L3.5 3.5L6 1" stroke="white" stroke-linecap="round" stroke-linejoin="round"/></svg><ul class="solution-select__list"><li><a class="project-link" href="https://brix365.com/en/help/platform/get-trial.html">Platform</a></li><li><a class="project-link" href="https://brix365.com/en/help/ecm/ecm-functions.html">ECM</a></li><li><a class="project-link" href="https://brix365.com/en/help/crm/crm_overview.html">CRM</a></li><li><a class="project-link" href="https://brix365.com/en/help/service/service-functions.html">Service</a></li><li><a class="project-link" href="https://brix365.com/en/help/projects/projects-functions.html">Projects</a></li><li><a class="project-link" href="https://brix365.com/en/help/business_solutions/-elma365-store.html">Business Solutions</a></li></ul></span></li><li><a href="https://api.brix365.com/en/" target="_blank">API</a></li><li><a href="https://tssdk.brix365.com/" target="_blank">SDK</a></li></ul>
|
||
|
||
|
||
</div>
|
||
</div>
|
||
|
||
</header>
|
||
|
||
|
||
|
||
|
||
<main class="main container">
|
||
|
||
<aside class="sidebar" id="sidebar">
|
||
<div class="sidebar__header">
|
||
<a class="header__logo" href="https://brix365.com/en/help">
|
||
<img src="./logo-light-en.svg">
|
||
</a>
|
||
<span class="sidebar__close elma-365-close" id="close"></span>
|
||
</div>
|
||
<div class="sidebar__wrapper" id="side-menu">
|
||
|
||
</div>
|
||
</aside>
|
||
|
||
<article class="article" id="article">
|
||
<div class="article-inner">
|
||
<div class="content">
|
||
<header class="article__header">
|
||
<div class="article__bread" style="display:flex; gap:10px;">
|
||
<span id="subcategory" class="search-res__item-category search-res__item-category_subcategory subcategory article__badge"></span>
|
||
|
||
<div class="topic__breadcrumbs">
|
||
<p><a href="elma365-on-premises.html">BRIX On-Premises</a> > Other > BRIX maintenance / PostgreSQL performance diagnostics</p>
|
||
</div>
|
||
|
||
</div>
|
||
<div class="topic__title"><h1 class="p_Heading1"><span class="f_Heading1">PostgreSQL performance diagnostics</span></h1>
|
||
</div>
|
||
|
||
</header>
|
||
<section class="article__content">
|
||
<div class="scroll-top-inner">
|
||
<a href="#h1-article" class="scroll-top"></a>
|
||
</div>
|
||
<!-- Placeholder for topic body. -->
|
||
<p style="text-align: justify; line-height: 1.20; margin: 7px 0 0 0;">In this article, we will explore performance diagnostic methods for <a href="postgresql.html" class="topiclink">PostgreSQL</a>, consisting of three key steps:</p>
|
||
<ol style="list-style-type:decimal">
|
||
<li value="1" style="text-align: justify; line-height: 1.20; margin-top: 7px; margin-right: 0; margin-bottom: 0;"><a href="postgresql-performance-diagnostics.html#optimize-cluster" class="topiclink">Optimize the cluster</a>.</li><li value="2" style="text-align: justify; line-height: 1.20; margin-top: 7px; margin-right: 0; margin-bottom: 0;"><a href="postgresql-performance-diagnostics.html#log-analysis" class="topiclink">Analyze the logs</a>.</li><li value="3" style="text-align: justify; line-height: 1.20; margin-top: 0; margin-right: 0; margin-bottom: 0;"><a href="postgresql-performance-diagnostics.html#analysis-of-plans" class="topiclink">Analyze the plans</a>.</li></ol>
|
||
<h2 class="p_Heading2"><a id="optimize-cluster" class="hmanchor"></a><span class="f_Heading2">Step 1: Optimize the cluster</span></h2>
|
||
<p style="line-height: 1.20;">To enhance the performance of your database, employ the following PostgreSQL performance diagnostic methods:</p>
|
||
<ul style="list-style-type:disc">
|
||
<li style="line-height: 1.20;">Apply vertical or horizontal scaling and then analyze the queries;</li><li style="line-height: 1.20;">Set up the configuration parameters of the deployed cluster. For example, use online configuration parameter generators. See more details in the <a href="https://pgconfigurator.cybertec-postgresql.com/" target="_blank" class="weblink">CYBERTEC</a> service.</li></ul>
|
||
<p style="text-align: justify; line-height: 1.20;">An example of generating optimal settings for a cluster based on entered server characteristics:</p>
|
||
<p class="p_Normal"><img alt="postgresql-performance-diagnostics-1" title="postgresql-performance-diagnostics-1" width="1600" height="734" style="margin:0;width:1600px;height:734px;border:none" src="postgresql-performance-diagnostics-1.png"/></p>
|
||
<h2 class="p_Heading2"><a id="log-analysis" class="hmanchor"></a><span class="f_Heading2">Step 2: Analyze the logs</span></h2>
|
||
<p style="line-height: 1.28; margin: 0 0 11px 0;">Please note that enabling query analyzers may consume approximately 10% of resources. However, after completing the analysis and optimizing queries, performance can significantly improve.</p>
|
||
<p style="line-height: 1.28; margin: 0 0 11px 0;">You can use built-in tools to analyze PostgreSQL performance, identifying bottlenecks and slow queries:</p>
|
||
<ul style="list-style-type:disc">
|
||
<li class="p_Normal"><a href="postgresql-performance-diagnostics.html#pg-stat-statements" class="topiclink">pg_stat_statements</a>;</li><li class="p_Normal"><a href="postgresql-performance-diagnostics.html#pg-stat-kcache" class="topiclink">pg_stat_kcache</a>;</li><li class="p_Normal"><a href="postgresql-performance-diagnostics.html#auto-explain" class="topiclink">auto_explain</a>;</li><li class="p_Normal"><a href="postgresql-performance-diagnostics.html#log-min-duration-statement" class="topiclink">log_min_duration_statement</a>.</li></ul>
|
||
<h3 class="p_Heading3"><a id="pg-stat-statements" class="hmanchor"></a><span class="f_Heading3">pg_stat_statements tool</span></h3>
|
||
<p style="line-height: 1.28; margin: 0 0 11px 0;">One of the most useful tools for performance analysis in PostgreSQL, this module gathers statistics on executed SQL queries, including their text, execution time, and call coun.</p>
|
||
<ol style="list-style-type:decimal">
|
||
<li value="1" style="line-height: 1.28; margin-top: 0; margin-right: 0; margin-bottom: 11px;">To enable <code><b>pg_stat_statements</b></code><span style="font-size: 13px;">,</span> set the parameter in <span style="font-weight: bold;">postgresql.conf</span>:</li></ol>
|
||
<p class="p_CodeExample" style="page-break-inside: avoid;"><span class="f_CodeExample">shared_preload_libraries = 'pg_stat_statements';</span></p>
|
||
<ol style="list-style-type:decimal" start="2">
|
||
<li value="2" class="p_CodeExample" style="page-break-inside: avoid;">Restart PostgreSQL and execute a query for performance analysis:</li></ol>
|
||
<p class="p_CodeExample" style="page-break-inside: avoid;"><span class="f_CodeExample">SELECT query, total_time, calls FROM pg_stat_statements ORDER BY total_time DESC LIMIT 10;</span></p>
|
||
<h3 class="p_Heading3"><a id="pg-stat-kcache" class="hmanchor"></a><span class="f_Heading3">pg_stat_kcache tool</span></h3>
|
||
<p style="line-height: 1.28; margin: 0 0 11px 0;">This extension monitors the state of the operating system cache used by the database, helpful for assessing caching efficiency and potential bottlenecks. </p>
|
||
<ol style="list-style-type:decimal">
|
||
<li value="1" style="line-height: 1.28; margin-top: 0; margin-right: 0; margin-bottom: 11px;">To enable <code><b>pg_stat_statements</b></code><span style="font-size: 13px;">,</span> set the parameter in <span style="font-weight: bold;">postgresql.conf</span>:</li></ol>
|
||
<p class="p_CodeExample" style="page-break-inside: avoid;"><span class="f_CodeExample">shared_preload_libraries = 'pg_stat_kcache'</span></p>
|
||
<ol style="list-style-type:decimal" start="2">
|
||
<li value="2" class="p_CodeExample" style="page-break-inside: avoid;">Restart PostgreSQL and execute queries to analyze cache performance.</li></ol>
|
||
<p class="p_CodeExample" style="page-break-inside: avoid;"><span class="f_CodeExample">SELECT * FROM pg_stat_kcache; # General statistics query</span><br />
|
||
<span class="f_CodeExample">SELECT * FROM pg_stat_kcache_buffers; # Shared buffers cache statistics</span><br />
|
||
<span class="f_CodeExample">SELECT * FROM pg_stat_kcache_files; # File cache statistics</span><br />
|
||
<span class="f_CodeExample">SELECT * FROM pg_stat_kcache_directories; # Directory cache statistics</span></p>
|
||
<h3 class="p_Heading3"><a id="auto-explain" class="hmanchor"></a><span class="f_Heading3">auto_explain tool</span></h3>
|
||
<p style="line-height: 1.28; margin: 0 0 11px 0;">This module automatically analyzes queries and displays the execution plan for queries taking a long time to execute.</p>
|
||
<p style="line-height: 1.28; margin: 0 0 11px 0;">To enable <code><b>auto_explain</b></code><span style="font-size: 13px;">,</span> set the parameter in <span style="font-weight: bold;">postgresql.conf:</span></p>
|
||
<p class="p_CodeExample" style="page-break-inside: avoid;"><span class="f_CodeExample">session_preload_libraries = 'auto_explain'</span><br />
|
||
<span class="f_CodeExample">auto_explain.log_min_duration = 1000; ## Log queries taking more than 1000 milliseconds</span><br />
|
||
<span class="f_CodeExample">auto_explain.log_analyze = true; ## Log output of EXPLAIN ANALYZE command</span><br />
|
||
<span class="f_CodeExample">auto_explain.log_buffers = true; ## Enable buffer usage statistics</span></p>
|
||
<h3 class="p_Heading3"><a id="log-min-duration-statement" class="hmanchor"></a><span class="f_Heading3">log_min_duration_statement tool</span></h3>
|
||
<p style="line-height: 1.28; margin: 0 0 11px 0;">This parameter allows you to configure logging for queries taking longer than the specified duration in milliseconds. For example, to log queries taking more than 1000 milliseconds, set the parameter in <span style="font-weight: bold;">postgresql.conf</span>:</p>
|
||
<p class="p_CodeExample" style="page-break-inside: avoid;"><span class="f_CodeExample">log_min_duration_statement = 1000; ## Log queries taking more than 1000 milliseconds</span></p>
|
||
<h2 class="p_Heading2"><a id="analysis-of-plans" class="hmanchor"></a><span class="f_Heading2">Step 3: Analyze the plans</span></h2>
|
||
<p style="line-height: 1.28; margin: 0 0 11px 0;">Optimizing queries can be complex and often involves an iterative process. Make changes gradually and measure the impact of each change on query performance. It is also recommended to test optimizations in a staging environment before applying them to the production database to ensure there are no unforeseen consequences.</p>
|
||
<p style="line-height: 1.28; margin: 0 0 11px 0;">The PostgreSQL query plan describes the execution of an SQL query, including sorting, filtering, and resource usage during execution.</p>
|
||
<p style="line-height: 1.28; margin: 0 0 11px 0;"><a class="dropdown-toggle" href="javascript:HMToggle('toggle','TOGGLE0186A1')">Plan example</a></p>
|
||
<div id="TOGGLE0186A1" class="dropdown-toggle-body" style="text-align: left; text-indent: 0; line-height: 1.28; padding: 0 0 0 0; margin: 0 0 11px 0;"><table style="border:none; border-spacing:0;">
|
||
<tr>
|
||
<td style="vertical-align:top; padding:0; border:none"><p class="p_CodeExample" style="white-space: normal; page-break-inside: avoid;"><span class="f_CodeExample">Query Text: SELECT (main.body) FROM "head"."tasks" AS main WHERE ("head".f_cast_isots(main.body#>>'{__deletedAt}') IS NULL AND (((main.body#>>'{__item}')::jsonb) = '{"namespace":"service_desk","code":"night_request_handling","id":"018b822c-e7b0-c751-1914-2b698ad2b01d"}'::jsonb) AND ((main.body#>>'{__parentId}')::text) IS NULL) ORDER BY "head".f_cast_isots(main.body#>>'{__createdAt}') DESC, (main.body#>>'{__id}') LIMIT 11 OFFSET 0</span><br />
|
||
<span class="f_CodeExample"> Limit (cost=20249.14..235800.34 rows=11 width=1504) (actual rows=3 loops=1)</span><br />
|
||
<span class="f_CodeExample"> Output: body, (head.f_cast_isots((body #>> '{__createdAt}'::text[]))), ((body #>> '{__id}'::text[]))</span><br />
|
||
<span class="f_CodeExample"> Buffers: shared hit=1066102 read=249864 written=1207</span><br />
|
||
<span class="f_CodeExample"> I/O Timings: read=1293.051 write=17.127</span><br />
|
||
<span class="f_CodeExample"> -> Incremental Sort (cost=20249.14..627711.61 rows=31 width=1504) (actual rows=3 loops=1)</span><br />
|
||
<span class="f_CodeExample"> Output: body, (head.f_cast_isots((body #>> '{__createdAt}'::text[]))), ((body #>> '{__id}'::text[]))</span><br />
|
||
<span class="f_CodeExample"> Sort Key: (head.f_cast_isots((main.body #>> '{__createdAt}'::text[]))) DESC, ((main.body #>> '{__id}'::text[]))</span><br />
|
||
<span class="f_CodeExample"> Presorted Key: (head.f_cast_isots((main.body #>> '{__createdAt}'::text[])))</span><br />
|
||
<span class="f_CodeExample"> Full-sort Groups: 1 Sort Method: quicksort Average Memory: 31kB Peak Memory: 31kB</span><br />
|
||
<span class="f_CodeExample"> Buffers: shared hit=1066102 read=249864 written=1207</span><br />
|
||
<span class="f_CodeExample"> I/O Timings: read=1293.051 write=17.127</span><br />
|
||
<span class="f_CodeExample"> -> Index Scan Backward using "tasks:f___createdAt" on head.tasks main (cost=0.43..627710.21 rows=31 width=1504) (actual rows=3 loops=1)</span><br />
|
||
<span class="f_CodeExample"> Output: body, head.f_cast_isots((body #>> '{__createdAt}'::text[])), (body #>> '{__id}'::text[])</span><br />
|
||
<span class="f_CodeExample"> Filter: (((main.body #>> '{__parentId}'::text[]) IS NULL) AND (((main.body #>> '{__item}'::text[]))::jsonb = '{"id": "018b822c-e7b0-c751-1914-2b698ad2b01d", "code":</span><br />
|
||
<span class="f_CodeExample"> "night_request_handling", "namespace": "service_desk"}'::jsonb) AND (head.f_cast_isots((main.body #>> '{__deletedAt}'::text[])) IS NULL))</span><br />
|
||
<span class="f_CodeExample"> Rows Removed by Filter: 633258</span><br />
|
||
<span class="f_CodeExample"> Buffers: shared hit=1066102 read=249864 written=1207</span><br />
|
||
<span class="f_CodeExample"> I/O Timings: read=1293.051 write=17.127</span><br />
|
||
<span class="f_CodeExample"> JIT:</span><br />
|
||
<span class="f_CodeExample"> Functions: 6</span><br />
|
||
<span class="f_CodeExample"> Options: Inlining false, Optimization false, Expressions true, Deforming true</span></p>
|
||
</td>
|
||
</tr>
|
||
</table>
|
||
</div>
|
||
<p style="line-height: 1.28; margin: 0 0 11px 0;">Let's break down the various parts of the plan mentioned in the above example:</p>
|
||
<ul style="list-style-type:disc">
|
||
<li style="line-height: 1.28; margin-top: 0; margin-right: 0; margin-bottom: 11px;"><code><b>Query Text</b></code><span style="font-size: 13px;">. </span>The analyzed SQL query. Selects data from a table named <code><b>tasks</b></code> in the <code><b>head</b></code> schema with specific conditions and orders the results;</li><li style="line-height: 1.28; margin-top: 0; margin-right: 0; margin-bottom: 11px;"><code><b>Limit</b></code><span style="font-size: 13px;">. </span>Information about the expected cost of the query and the number of rows it expects to return. In the provided example, the query expects to return 11 rows;</li><li style="line-height: 1.28; margin-top: 0; margin-right: 0; margin-bottom: 11px;"><code><b>Output</b></code><span style="font-size: 13px;">.</span><span style="font-size: 13px; color: #394149;"> </span>Enumeration of columns that will be included in the query's output data: body, a computed expression, and another computed expression;</li><li style="line-height: 1.28; margin-top: 0; margin-right: 0; margin-bottom: 11px;"><code><b>Buffers</b></code><span style="font-size: 13px;">. </span>Shows the application of buffers, the number of read operations, and the number of write operations. It determines the overall fetches, reads, and writes;</li><li style="line-height: 1.28; margin-top: 0; margin-right: 0; margin-bottom: 11px;"><code><b>I/O Timings</b></code><span style="font-size: 13px;">.</span> Information about the time spent on read and write operations;</li><li style="line-height: 1.28; margin-top: 0; margin-right: 0; margin-bottom: 11px;"><code><b>Incremental Sort</b></code><span style="font-size: 13px;">.</span> Sorting operation, which is part of the query execution. It defines the sorting criteria and memory usage;</li><li style="line-height: 1.28; margin-top: 0; margin-right: 0; margin-bottom: 11px;"><code><b>Index Scan Backward using</b></code><span style="font-size: 13px;">.</span>The main operation during query execution. It's a scan of the <code><b>tasks:f___createdAt</b></code><span style="font-size: 13px;"> </span>index sed for filtering and retrieving rows from the <code><b>tasks</b></code> table based on specified conditions. The conditions are listed in the <code><b>Filter</b></code>, section, checking for specific values in JSONB data and the absence of a value in the <code><b>__parentId</b></code><span style="font-size: 13px;"> </span>field.<code><b>Rows Removed by Filter</b></code> indicate how many rows were filtered based on these conditions.</li><li style="line-height: 1.28; margin-top: 0; margin-right: 0; margin-bottom: 11px;"><code><b>JIT</b></code><span style="font-size: 13px;">.</span> Information about JIT compilation of functions and optimization settings.</li></ul>
|
||
<h2 class="p_Heading2"><span class="f_Heading2">Plan visualization</span></h2>
|
||
<p style="line-height: 1.20;">You can also analyze the execution of the SQL query. Using plan visualization provides detailed information on how PostgreSQL executes the query and potential performance issues. You can use pgAdmin or third-party services for this purpose. </p>
|
||
<p style="line-height: 1.20;">Example of visualization:</p>
|
||
<ul style="list-style-type:disc">
|
||
<li style="line-height: 1.20;"><a href="https://explain.dalibo.com/" target="_blank" class="weblink">explain.dalibo</a>;</li></ul>
|
||
<p class="p_Normal"><img alt="postgresql-performance-diagnostics-2" title="postgresql-performance-diagnostics-2" width="410" height="224" style="margin:0;width:410px;height:224px;border:none" src="postgresql-performance-diagnostics-2.png"/></p>
|
||
|
||
<div class="bottom-nav">
|
||
|
||
<a id="prev-link" class="topic__navi_prev" href="kubernetes-air-gap.html">
|
||
<span class="bottom-nav__arrow bottom-nav__arrow--prev"></span> <span
|
||
class="bottom-nav__link">kubernetes-air-gap.html</span>
|
||
</a>
|
||
|
||
|
||
<a id="next-link" class="topic__navi_next" href="yandex-cloud-postgresql-performance-diagnostics.html">
|
||
<span class="bottom-nav__link">yandex-cloud-postgresql-performance-diagnostics.html</span> <span
|
||
class="bottom-nav__arrow bottom-nav__arrow--next"></span>
|
||
</a>
|
||
|
||
</div>
|
||
<!-- добавляет на страницу строку блок Была ли статья полезной? -->
|
||
<div class="feedback" id="feedback"><div class="feedback-help"><span><b>Was this helpful?</b></span><form action="" method="POST" class="feedback-form" id="feedback-form"><div class="feedback__popup feedback__popup-response" id="feedback__popup_thx" style="display: none;">Thanks for your feedback!</div><div class="feedback__popup" id="feedback__popup_why" style="display: none;"><div class="feedback__popup-header">Please specify why:</div><input type="radio" name="category" id="bad_recommendation" value="bad_recommendation"><label for="bad_recommendation">Recommendations did not help me</label><input type="radio" name="category" id="difficult_text" value="difficult_text"><label for="difficult_text">Article is hard to understand</label><input type="radio" name="category" id="no_answer" value="no_answer"><label for="no_answer">Didn`t answer my question</label><input type="radio" name="category" id="bad_header" value="bad_header"><label for="bad_header">Content does not match the topic</label><input type="radio" name="category" id="other_reason" value="other_reason"><label for="other_reason">Other</label></div><div class="feedback__popup" id="feedback__popup-other" style="display: none;"><div class="feedback__popup-header">How we can improve it?</div><textarea class="feedback__textarea" name="other" id=""></textarea><input type="submit" class="feedback__other-btn" value="Submit"></div><div class="feedback-form__btn-group"><input type="radio" name="useful" id="feedback__useful_yes" value="true"><label for="feedback__useful_yes"><img src="like.svg" class="small-img" alt="like"><spanclass="feedback-form__btn-group_yes-btn">Yes</spanclass="feedback-form__btn-group_yes-btn"></label><input type="radio" name="useful" id="feedback__useful_no" value="false"><label for="feedback__useful_no"><img src="dislike.svg" class="small-img" alt="dislike"><spanclass="feedback-form__btn-group_no-btn">No</spanclass="feedback-form__btn-group_no-btn"></label></div><select name="category"><option disabled="">Please specify why</option><option value="bad_recommendation" selected="">Recommendations did not help me</option><option value="difficult_text">Article is hard to understand</option><option value="no_answer">Didn`t answer my question</option><option value="bad_header">Content does not match the topic</option><option value="other_reason">Other</option></select><input type="submit"></form></div><div class="found_typo"><p style="margin: 0px; margin-top: 16px !important;"><span><b>Found a typo?</b></span> Select it and press <i>Ctrl+Enter</i> to send us feedback</p></div></div>
|
||
|
||
</section>
|
||
</div>
|
||
<aside class="article__sidebar" style="display:none">
|
||
<input type="checkbox" />
|
||
<div class="article__arrow"></div>
|
||
<div class="table-of-contents elma365-right" id="toc2Content">
|
||
<h3 class="h3-toc">In this topic</h3>
|
||
<nav id="toc2"></nav>
|
||
</div>
|
||
</aside>
|
||
</div>
|
||
</article>
|
||
</main>
|
||
<footer class="footer">
|
||
<div class="footer-container">
|
||
<div class="footer-mobile">
|
||
|
||
<ul class="footer-mobile__list"><li><a href="https://brix365.com/en/" target="_blank">BRIX</a></li><li><a href="https://tssdk.brix365.com/en/latest/" target="_blank">SDK</a></li><li><a href="https://api.brix365.com/en/" target="_blank">API</a></li></ul><ul class="footer-mobile__list"><li><a href="https://brix365.com/en/help/platform/get-trial.html">Platform</a></li><li><a href="https://brix365.com/en/help/ecm/ecm-functions.html">ECM</a></li><li><a href="https://brix365.com/en/help/service/service-functions.html">Service</a></li><li><a href="https://brix365.com/en/help/projects/projects-functions.html">Projects</a></li></ul>
|
||
|
||
|
||
</div>
|
||
<div class="footer-wrap">
|
||
|
||
<div><span class="mobile-question-popup">Send feedback</span><form method="POST" action class="question__popup question-xs" id="question__popup"><div class="question-wrap"><span class="close"></span><span class="title">Ask a question</span><label for="help_question" style="display: none;"></label><textarea name="help_question" id="help_question"></textarea><input type="submit" value="Send"></div></form><div class="hidden fade-in question-success-xs">Sent</div></div>
|
||
|
||
<div class="footer-flex-b">
|
||
<span class="footer-copy">© 2025 BRIX</span>
|
||
<ul class="footer-list">
|
||
|
||
<li class="footer-item">
|
||
<a href="#" class="arrow-top" style="display: block;"></a>
|
||
</li>
|
||
|
||
</ul>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
</footer>
|
||
<iframe name="hmnavigation" style="display:none!important"></iframe>
|
||
<script src="./jquery-ui.js"></script>
|
||
<!--script src="//cdn.jsdelivr.net/npm/featherlight@1.7.14/release/featherlight.min.js" type="text/javascript" charset="utf-8"></script-->
|
||
<script src="./jquery.tocify.min.js"></script>
|
||
<script src="./TypoReporter.min.js"></script>
|
||
<script src="./google-search.js"></script>
|
||
<script src="./main.js"></script>
|
||
<script type="text/javascript">
|
||
HMInitToggle('TOGGLE0186A1','hm.type','dropdown','hm.state','0');
|
||
</script>
|
||
</body>
|
||
|
||
</html>
|