Bir Hologres örneğinde çalışan sorguları tanılama ve yönetme.
Genel bakış
Hologres, PostgreSQL ile uyumludur. Bir örnekteki sorgu çalışma süresini izlemek için hg_stat_activity (pg_stat_activity) görünümü kullanın. Bu konuda aşağıdaki işlemler açıklanmaktadır:
hg_stat_activity (pg_stat_activity) görünümü: SQL çalışma süresi bilgilerini görüntüleme.
HoloWeb'de aktif sorguları yönetme: HoloWeb konsolunda aktif sorguları görüntüleme ve yönetme.
Kilit sorunlarını giderme: Bir SQL ifadesinin kilit tutup tutmadığını veya bir kilit tarafından engellenip engellenmediğini belirleme.
Bir sorguyu sonlandırma: Performansı düşük olan sorguları sonlandırma.
Aktif bir sorgu için zaman aşımını değiştirme: Kilitlenmeleri önlemek için çalıştırma zaman aşımını değiştirme.
Boşta kalan bir sorgu için zaman aşımını değiştirme: Kilitlenmeleri önlemek için boşta kalan sorgu zaman aşımını değiştirme.
Yavaş sorgu günlüklerini sorgulama: Yavaş veya başarısız olan sorguları tanılama ve optimize etme.
SSS:
ERROR: canceling statement due to statement timeouthatasının nedenleri ve çözümleri.
Hologres, sorgu başına bellek veya CPU sınırlamasını desteklemez. Sorgu kaynaklarını kontrol etmek için iş yükü kaynaklarını yönetmek ve zamanlamak amacıyla bir sorgu kuyruğu kullanın.
SQL kullanarak aktif sorguları görüntüleme
Aktif sorguları görüntülemek için aşağıdaki SQL ifadelerini kullanın:
-
Aktif sorguları, yürütme aşamalarını ve kaynak tüketimini görüntüleyin.
NotSüper kullanıcılar tüm kullanıcıların çalışma zamanı bilgilerini görüntüleyebilir. Diğer kullanıcılar yalnızca kendi bilgilerini görebilir.
-- For Hologres V2.0 and later SELECT query,state,query_id,transaction_id,running_info, extend_info FROM hg_stat_activity WHERE state = 'active' AND backend_type = 'client backend' AND application_name != 'hologres' -- For Hologres V1.3 and earlier SELECT query,state,pid FROM pg_stat_activity WHERE state = 'active' AND backend_type = 'client backend' AND application_name != 'hologres'Örnek sonuç:
------------------------------------------------------------------------------- query | insert into test_hg_stat_activity select i, (i % 7) :: text, (i % 1007) from generate_series(1, 10000000)i; state | active query_id | 100713xxxx transaction_id | 100713xxxx running_info | {"current_stage" : {"stage_duration_ms" :5994, "stage_name" :"EXECUTE" }, "engine_type" :"{HQE,PQE}", "fe_id" :1, "warehouse_id" :0 } extend_info | {"affected_rows" :9510912, "scanned_rows" :9527296 } -
Çalışan sorguları CPU tüketimine göre sıralayın.
-- For Hologres V2.0 and later SELECT query,((extend_info::json)->'total_cpu_max_time_ms')::text::bigint AS cpu_cost,state,query_id,transaction_id FROM hg_stat_activity WHERE state = 'active' ORDER BY 2 DESC;Örnek sonuç:
--------------------------------------------------------------------------------- query | select xxxxx cpu_cost | 523461 state | active query_id | 10053xxxx transaction_id | 10053xxxx --------------------------------------------------------------------------------- query | insert xxxx cpu_cost | 4817 state | active query_id | 1008305xxx transaction_id | 1008305xxx -
Çalışan sorguları bellek tüketimine göre sıralayın.
-- For Hologres V2.0 and later SELECT query,((extend_info::json)->'total_mem_max_bytes')::text::bigint AS mem_max_cost,state,query_id,transaction_id FROM hg_stat_activity WHERE state = 'active' ORDER BY 2 DESC;Örnek sonuç:
--------------------------------------------------------------------------------- query | update xxxx; mem_max_cost | 5727634542 state | active query_id | 10053302784827629 transaction_id | 10053302784827629 --------------------------------------------------------------------------------- query | select xxxx; mem_max_cost | 19535640 state | active query_id | 10083259096119559 transaction_id | 10083259096119559 -
Geçerli örnekte uzun süredir çalışan sorguları görüntüleyin.
-- For Hologres V2.0 and later SELECT current_timestamp - query_start AS runtime, datname::text, usename, query, query_id FROM hg_stat_activity WHERE state != 'idle' AND backend_type = 'client backend' AND application_name != 'hologres' ORDER BY 1 DESC; -- For Hologres V1.3 and earlier SELECT current_timestamp - query_start AS runtime, datname::text, usename, query, pid FROM pg_stat_activity WHERE state != 'idle' AND backend_type = 'client backend' AND application_name != 'hologres' ORDER BY 1 DESC;Örnek sonuç:
runtime | datname | usename | query_id | current_query -----------------+----------------+----------+------------------------------------ 00:00:24.258388 | holotest | 123xxx | 1267xx | UPDATE xxx; 00:00:1.186394 | testdb | 156xx | 1783xx | select xxxx;UPDATEifadesi 24 saniyedir tamamlanmadan çalışmaktadır.
HoloWeb'de aktif sorguları yönetme
HoloWeb konsolunda aktif sorguları görüntüleyin ve yönetin.
HoloWeb konsolunda oturum açın. HoloWeb'e bağlanma ve sorgu çalıştırma.
Üst gezinme çubuğunda Diagnostics and Optimization seçeneğine tıklayın.
Sol gezinme bölmesinde Management for Information About Active Queries > Active Query Tasks seçeneğini belirleyin.
-
Active Query Tasks sayfasında, geçerli örnek için aktif sorguları görüntülemek ve yönetmek üzere Search öğesine tıklayın.
Sonuçlar aşağıdaki alanları içerir:
Parametre
Açıklama
Sorgu başlangıcı
Sorgunun ne zaman başladığı.
Çalışma süresi
Yürütme süresi.
PID
Sorguyu işleyen arka uç sürecinin kimliği.
Sorgu
Çalıştırılan SQL ifadesi.
Durum
Bağlantı durumu. Yaygın değerler:
-
active: Sorgu çalışıyor.
-
idle: Bağlantı boşta.
-
idle in transaction: Bir işlem içinde boşta.
-
idle in transaction (Aborted): Başarısız bir işlem içinde boşta.
-
\N: Boş durum, genellikle bir sistem arka plan sürecidir. Yok sayılabilir.
Kullanıcı adı
Geçerli bağlantının kullanıcı adı.
Uygulama
Sorguyu başlatan uygulama.
İstemci adresi
İstemci IP adresi.
Uzun süren bir sorguyu sonlandırmak için ilgili satırın Actions sütunundaki Cancel seçeneğine tıklayın. Birden çok sorgu seçip Batch Cancel seçeneğine de tıklayabilirsiniz.
-
-
(İsteğe bağlı) Sorgu ayrıntılarını görüntülemek için Actions sütunundaki Details seçeneğine tıklayın.
Details sayfasında şunları yapabilirsiniz:
Copy: SQL ifadesini kopyalayın.
Format: SQL ifadesini biçimlendirin.
Kilit sorunlarını giderme
Bir SQL ifadesinin kilit tutup tutmadığını veya bir kilit tarafından engellenip engellenmediğini belirlemek için aktif sorguları kontrol edin. Kilitler ve kilit sorun giderme.
Bir sorguyu sonlandırma
Performansı düşük olan sorguları aşağıdaki komutlarla sonlandırın.
-
Tek bir sorguyu sonlandırma:
SELECT pg_cancel_backend(<pid>); -
Birden çok sorguyu toplu olarak sonlandırma:
SELECT pg_cancel_backend(pid) ,query ,datname ,usename ,application_name ,client_addr ,client_port ,backend_start ,state FROM pg_stat_activity WHERE length(query) > 0 AND pid != pg_backend_pid() AND backend_type = 'client backend' AND application_name != 'hologres'
Aktif sorgu zaman aşımını değiştirme
Aktif sorgular için çalıştırma zaman aşımını değiştirin.
-
Sözdizimi
SET statement_timeout = <time>; -
Parametre açıklaması
time: Zaman aşımı değeri. Aralık: 0 ila 2147483647. Varsayılan birim: milisaniye. Farklı bir birim kullanmak için değeri ve birimi tek tırnak içine alın. Varsayılan: 10 saat. Bu ayar oturuma özeldir.NotZaman aşımının uygulanması için
SET statement_timeout = <time>ifadesi, hedef SQL ifadesiyle aynı toplu işte çalıştırılmalıdır. -
Kullanım örnekleri
-
Zaman aşımını 5.000 dakika olarak ayarlayın. Bir birim belirtildiği için değeri tek tırnak içine alın.
SET statement_timeout = '5000min' ; SELECT * FROM tablename; -
Zaman aşımını 5.000 ms olarak ayarlayın.
SET statement_timeout = 5000 ; SELECT * FROM tablename;
-
Boşta kalan sorgu zaman aşımını değiştirme
idle_in_transaction_session_timeout parametresi, boşta kalan işlemlerin ne zaman sonlandırılacağını kontrol eder. Bu ayar yapılmazsa boşta kalan işlemler asla zaman aşımına uğramaz ve bu durum kilitlenmelere neden olabilir.
-
Kullanım senaryoları
Bu zaman aşımını, sızan işlemlerden kaynaklanan kilitlenmeleri önlemek için ayarlayın. Örneğin, aşağıdaki işlem
COMMITifadesi eksik olduğu için hiçbir zaman commit edilmez ve bu durum veritabanı düzeyinde kilitlenmeye yol açabilecek bir işlem sızıntısına neden olur.BEGIN; SELECT * FROM t;Bu sorunu çözmek için idle_in_transaction_session_timeout değerini ayarlayın. Açık bir işlem idle_in_transaction_session_timeout tarafından belirtilen süre içinde commit edilmez veya geri alınırsa sistem işlemi otomatik olarak geri alır ve bağlantıyı kapatır.
-
Sözdizimi
-- Modify the idle transaction timeout at the session level. SET idle_in_transaction_session_timeout=<time>; -- Modify the idle transaction timeout at the database level. ALTER database db_name SET idle_in_transaction_session_timeout=<time>; -
Parametre açıklaması
time: Zaman aşımı değeri. Aralık: 0 ila 2147483647. Varsayılan birim: milisaniye. Farklı bir birim kullanmak için değeri ve birimi tek tırnak içine alın. Varsayılan: Hologres V0.10 ve önceki sürümlerde 0 (otomatik sonlandırma yok); Hologres V1.1 ve sonraki sürümlerde 10 dakika. 10 dakikadan daha uzun süre boşta kalan işlemler geri alınır.NotAşırı kısa bir zaman aşımı ayarlamayın. Sistem, hala kullanımda olan işlemleri geri alabilir.
-
Kullanım örnekleri
Zaman aşımını 300.000 ms olarak ayarlayın.
-- Modify the idle transaction timeout at the session level. SET idle_in_transaction_session_timeout=300000; -- Modify the idle transaction timeout at the database level. ALTER database db_name SET idle_in_transaction_session_timeout=300000;
Yavaş sorgu günlüklerini sorgulama
Hologres V0.10 ve sonraki sürümler yavaş sorgu günlüklerini destekler. Yavaş sorgu günlüklerini görüntüleme ve analiz etme.
SSS
-
Belirti
Bir SQL ifadesi çalıştırıldığında aşağıdaki hata döndürülür:
ERROR: canceling statement due to statement timeout. -
Nedenler ve çözümler
-
Neden 1: İstemcide veya Hologres örneğinde bir zaman aşımı yapılandırılmıştır. Yaygın zaman aşımı ayarları:
Data Service API'lerinin değiştirilemeyen sabit bir zaman aşımı vardır:
10s. Çalıştırma süresini azaltmak için SQL ifadelerinizi optimize edin.HoloWeb veya DataWorks'teki Hologres SQL modülünün sabit bir sorgu zaman aşımı vardır:
1h. Çalıştırma süresini azaltmak için SQL'inizi optimize edin.-
Örnek düzeyinde bir zaman aşımı ayarlanmıştır. Kontrol etmek için aşağıdaki SQL'i çalıştırın. Hataya örnek zaman aşımı neden oluyorsa gerektiği gibi ayarlayın.
SHOW statement_timeout; İstemcide veya uygulamada bir zaman aşımı ayarlanmıştır. İstemci zaman aşımı ayarlarını kontrol edin ve gerektiği gibi değiştirin.
-
Neden 2: Bir DML ifadesi çalışırken tabloda
DROPveyaTRUNCATEişlemi gerçekleştirilmiştir.TRUNCATEişlemidrop+createişlemine eşdeğerdir. Çalışan bir DML ifadesi satır veya tablo kilidi tutar (Kilitler ve kilit sorun giderme). Aynı tablo üzerinde eşzamanlı birDROPveyaTRUNCATEişlemi bu kilit için yarışır ve sistemin DML ifadesinistatement timeouthatasıyla iptal etmesine neden olur.Çözüm: Tablo üzerinde eşzamanlı
DROPveyaTRUNCATEişlemleri olup olmadığını görmek için yavaş sorgu günlüğünü kontrol edin ve bunlardan kaçının.-- Example: Query the logs for drop/truncate operations on a specific table over the past day. SELECT * FROM hologres.hg_query_log WHERE command_tag IN ('DROP TABLE','TRUNCATE TABLE') AND query LIKE '%xxx%' AND query_start >= now() - interval '1 day';
-