Sorgu profilleri, her sorgu için düğüm başına çalıştırma ayrıntılarını yakalar. Performans darboğazlarını tespit etmek ve sorgu performansını optimize etmek için bu profilleri kullanın.
Sorgu profillerini etkinleştirin
Profil toplamayı başlatmak için enable_profile değişkenini ayarlayın:
SET enable_profile=true;
enable_profile değeri true olarak ayarlandığında SelectDB, çalışan her sorgu için bir profil oluşturur. Her profil, tüm düğümlerdeki çalıştırma ayrıntılarını kaydeder.
Sorgu profillerini görüntüleyin
SHOW QUERY PROFILE ifadesi yalnızca V4.0.0'dan önceki SelectDB Core sürümlerinde desteklenir. SelectDB Core V4.0.0 ve sonraki sürümler için sorgu profillerini SelectDB konsolundan önizleyin veya indirin ya da HTTP API'sini kullanın. Ayrıntılar için Sorgu denetimi özelliğini kullanın ve Sorgu profillerini dışa aktarın konularına bakın.
Depolanan tüm profilleri listelemek için aşağıdaki ifadeyi çalıştırın:
SHOW QUERY PROFILE "/"\G;
Sonuçtaki her satır bir profile karşılık gelir:
SHOW QUERY PROFILE "/"\G
*************************** 1. row ***************************
Profile ID: c257c52f93e149ee-ace8ac14e8c9fef9
Task Type: QUERY
Start Time: 2021-04-08 11:30:50
End Time: 2021-04-08 11:30:50
Total: 9ms
Task State: EOF
User: root
Default Db: default_cluster:db1
Sql Statement: select tbl1.k1, sum(tbl1.k2) from tbl1 join tbl2 on tbl1.k1 = tbl2.k1 group by tbl1.k1 order by tbl1.k1
HTTP API yanıtlarında Query ID ve query_id alanları profil kimliğini ifade eder.
Sorgu profillerini analiz edin
Bir sorgudaki performans darboğazını bulmak için aşağıdaki üç adımlı iş akışını kullanın. Her adım, çalıştırma hiyerarşisinde bir seviye daha derine iner.
Adım 1: En yavaş parçayı belirleyin
Amaç: Birincil darboğazın hangi parça olduğunu bulun.
Çalıştırma planı ağacı, parça yapısını ve her parçanın çalıştırma süresini gösterir. Her gönderici düğümdeki MaxActiveTime değeri, ilgili parçadaki tüm çalıştırma birimleri arasındaki en uzun çalıştırma süresidir.
SHOW QUERY PROFILE "/<profile_id>"\G
Örnek çıktı:
SHOW QUERY PROFILE "/c257c52f93e149ee-ace8ac14e8c9fef9"\G
*************************** 1. row ***************************
Fragments:
┌──────────────────────┐
│[-1: DataBufferSender]│
│Fragment: 0 │
│MaxActiveTime: 6.626 ms│
└──────────────────────┘
│
┌──────────────────┐
│[9: EXCHANGE_NODE]│
│Fragment: 0 │
└──────────────────┘
│
┌──────────────────────┐
│[9: DataStreamSender] │
│Fragment: 1 │
│MaxActiveTime: 5.449 ms│
└──────────────────────┘
│
┌──────────────┐
│[4: SORT_NODE]│
│Fragment: 1 │
└──────────────┘
┌┘
┌─────────────────────┐
│[8: AGGREGATION_NODE]│
│Fragment: 1 │
└─────────────────────┘
└┐
┌──────────────────┐
│[7: EXCHANGE_NODE]│
│Fragment: 1 │
└──────────────────┘
│
┌──────────────────────┐
│[7: DataStreamSender] │
│Fragment: 2 │
│MaxActiveTime: 3.505 ms│
└──────────────────────┘
┌┘
┌─────────────────────┐
│[3: AGGREGATION_NODE]│
│Fragment: 2 │
└─────────────────────┘
│
┌───────────────────┐
│[2: HASH_JOIN_NODE]│
│Fragment: 2 │
└───────────────────┘
┌────────────┴────────────┐
┌──────────────────┐ ┌──────────────────┐
│[5: EXCHANGE_NODE]│ │[6: EXCHANGE_NODE]│
│Fragment: 2 │ │Fragment: 2 │
└──────────────────┘ └──────────────────┘
│ │
┌─────────────────────┐ ┌────────────────────────┐
│[5: DataStreamSender]│ │[6: DataStreamSender] │
│Fragment: 4 │ │Fragment: 3 │
│MaxActiveTime: 1.87 ms│ │MaxActiveTime: 636.767 us│
└─────────────────────┘ └────────────────────────┘
│ ┌┘
┌───────────────────┐ ┌───────────────────┐
│[0: OLAP_SCAN_NODE]│ │[1: OLAP_SCAN_NODE]│
│Fragment: 4 │ │Fragment: 3 │
└──────────────────┘ └──────────────────┘
│ │
┌─────────────┐ ┌─────────────┐
│[OlapScanner]│ │[OlapScanner]│
│Fragment: 4 │ │Fragment: 3 │
└─────────────┘ └─────────────┘
│ │
┌─────────────────┐ ┌─────────────────┐
│[SegmentIterator]│ │[SegmentIterator]│
│Fragment: 4 │ │Fragment: 3 │
└─────────────────┘ └─────────────────┘
1 row in set (0.02 sec)
Bu örnekte Fragment 1, en yüksek MaxActiveTime değerine (5,449 ms) sahiptir; bu nedenle birincil darboğaz burasıdır. Fragment 1 ile Adım 2'ye geçin.
Adım 2: En yavaş çalıştırma birimini belirleyin
Amaç: Darboğaz oluşturan parça içinde en çok zaman alan düğüm örneğini bulun.
En yavaş parçayı belirledikten sonra içindeki tüm çalıştırma birimlerini (örnekleri) listeleyin:
SHOW QUERY PROFILE "/<profile_id>/<fragment_id>";
Fragment 1 için örnek çıktı:
SHOW QUERY PROFILE "/c257c52f93e149ee-ace8ac14e8c9fef9/1";
+-----------------------------------+-------------------+------------+
| Instances | Host | ActiveTime |
+-----------------------------------+-------------------+------------+
| c257c52f93e149ee-ace8ac14e8c9ff03 | 10.200.00.01:9060 | 5.449ms |
| c257c52f93e149ee-ace8ac14e8c9ff05 | 10.200.00.02:9060 | 5.367ms |
| c257c52f93e149ee-ace8ac14e8c9ff04 | 10.200.00.03:9060 | 5.358ms |
+-----------------------------------+-------------------+------------+
En yüksek ActiveTime değerine sahip örnek, Adım 3 için hedefinizdir.
Adım 3: İşlenen bazlı ölçümleri inceleyin
Amaç: Hedef çalıştırma biriminde en çok zaman ve kaynağı tüketen işleci belirleyin.
SHOW QUERY PROFILE "/<profile_id>/<fragment_id>/<instance_id>"\G
Fragment 1'deki c257c52f93e149ee-ace8ac14e8c9ff03 örneği için örnek çıktı:
SHOW QUERY PROFILE "/c257c52f93e149ee-ace8ac14e8c9fef9/1/c257c52f93e149ee-ace8ac14e8c9ff03"\G
*************************** 1. row ***************************
Instance:
┌───────────────────────────────────────┐
│[9: DataStreamSender] │
│(Active: 37.222 us, non-child: 0.40) │
│ - Counters: │
│ - BytesSent: 0.00 │
│ - IgnoreRows: 0 │
│ - OverallThroughput: 0.0 /sec │
│ - PeakMemoryUsage: 8.00 KB │
│ - SerializeBatchTime: 0ns │
│ - UncompressedRowBatchSize: 0.00 │
└───────────────────────────────────────┘
└┐
│
┌──────────────────────────────────┐
│[4: SORT_NODE] │
│(Active: 5.421 ms, non-child: 0.71)│
│ - Counters: │
│ - PeakMemoryUsage: 12.00 KB │
│ - RowsReturned: 0 │
│ - RowsReturnedRate: 0 │
└──────────────────────────────────┘
┌┘
│
┌───────────────────────────────────┐
│[8: AGGREGATION_NODE] │
│(Active: 5.355 ms, non-child: 10.68)│
│ - Counters: │
│ - BuildTime: 3.701us │
│ - GetResultsTime: 0 ns │
│ - HTResize: 0 │
│ - HTResizeTime: 1.211 us │
│ - HashBuckets: 0 │
│ - HashCollisions: 0 │
│ - HashFailedProbe: 0 │
│ - HashFilledBuckets: 0 │
│ - HashProbe: 0 │
│ - HashTravelLength: 0 │
│ - LargestPartitionPercent: 0 │
│ - MaxPartitionLevel: 0 │
│ - NumRepartitions: 0 │
│ - PartitionsCreated: 16 │
│ - PeakMemoryUsage: 34.02 MB │
│ - RowsProcessed: 0 │
│ - RowsRepartitioned: 0 │
│ - RowsReturned: 0 │
│ - RowsReturnedRate: 0 │
│ - SpilledPartitions: 0 │
└───────────────────────────────────┘
└┐
│
┌──────────────────────────────────────────┐
│[7: EXCHANGE_NODE] │
│(Active: 4.360 ms, non-child: 46.84) │
│ - Counters: │
│ - BytesReceived: 0.00 │
│ - ConvertRowBatchTime: 387 ns │
│ - DataArrivalWaitTime: 4.357 ms │
│ - DeserializeRowBatchTimer: 0 ns │
│ - FirstBatchArrivalWaitTime: 4.356 ms│
│ - PeakMemoryUsage: 0.00 │
│ - RowsReturned: 0 │
│ - RowsReturnedRate: 0 │
│ - SendersBlockedTotalTimer(*): 0 ns │
└──────────────────────────────────────────┘
Bir düğümde yüksek Active yüzdesi ve yüksek non-child yüzdesi, darboğazın alt işlemcide değil düğümün kendisinde olduğunu gösterir. Optimizasyon çabalarınızı buraya odaklayın.
Sorgu profillerini dışa aktarın
Sorgu profillerini dışa aktarmak için SelectDB Core V3.0.4 veya sonraki bir sürüm gerekir.
Çevrimdışı analiz veya paylaşım amacıyla bir profili dosyaya aktarın.
-
Sorgu profillerini etkinleştirin.
SET enable_profile=true; -
Profilini oluşturmak istediğiniz sorguyu çalıştırın.
-- Run your target query. SelectDB generates a profile for it. SELECT count(1) FROM test_table LIMIT 10; -
Profil kimliğini alın.
SelectDB 4.0.x sürümleri
Sorgu bilgilerini almak için bir HTTP isteği gönderin. Yanıttaki
Query IDalanı profil kimliğidir.curl -u'<userName>:<userPassword>' \ "http://<selectdbAddress>:<httpPort>/rest/v2/manager/query/query_info?is_all_node=true"Örnek yanıt:
{ "msg": "success", "code": 0, "data": { "column_names": [ "Query ID", "FE Node", "Query User", "Execution Database", "Sql", "Query Type", "Start Time", "End Time", "Execution Duration", "Status" ], "rows": [ [ ... ] ] }, "count": 0 }SelectDB 3.0.x sürümleri
Aşağıdaki örnek, SelectDB 3.0'da bilginin nasıl alınacağını göstermektedir:
SHOW QUERY PROFILE "/";Örnek çıktı:
+-----------------------------------+-----------+---------------------+---------------------+-------+------------+-------+------------------------------------+-------------------------------+ | Profile ID | Task Type | Start Time | End Time | Total | Task State | User | Default Db | Sql Statement | +-----------------------------------+-----------+---------------------+---------------------+-------+------------+-------+------------------------------------+-------------------------------+ | b9c9ba063d9d4365-97878361371e757a | QUERY | 2024-02-07 17:40:04 | 2024-02-07 17:40:04 | 32ms | EOF | admin | default_cluster:information_schema | select * from user_privileges | | 8800c306137e4072-9bb1ed419f4ac9f2 | QUERY | 2024-02-07 17:40:00 | 2024-02-07 17:40:00 | 3ms | ERR | admin | default_cluster:information_schema | select * from user_priveleges | | e2efdd1a996c4de2-ab939ad49b409990 | QUERY | 2024-02-07 17:39:51 | 2024-02-07 17:39:51 | 13ms | EOF | admin | | SELECT DATABASE() | +-----------------------------------+-----------+---------------------+---------------------+-------+------------+-------+------------------------------------+-------------------------------+ -
Kimliğini kullanarak profili dışa aktarın.
Yer Tutucu Açıklama Varsayılan <userName>SelectDB örneğine erişmek için kullanıcı adı — <userPassword>SelectDB örneğine erişmek için parola — <selectdbAddress>SelectDB örneğinin uç noktası — <httpPort>HTTP bağlantı noktası numarası 8080 <query_id>3. adımdaki profil kimliği — curl -u'<userName>:<userPassword>' \ "http://<selectdbAddress>:<httpPort>/api/profile?query_id=<query_id>"Çıktıyı bir dosyaya kaydetmek için yanıtı yönlendirin:
curl -u'<userName>:<userPassword>' \ "http://<selectdbAddress>:<httpPort>/api/profile?query_id=<query_id>" > res.txtAşağıdaki yer tutucuları gerçek değerlerinizle değiştirin:
-
(İsteğe bağlı) Dışa aktarılan dosyayı okunabilirlik açısından biçimlendirin.
sudo sed -r 's/\\n/\n/g' res.txt | sed -r 's/\\t/\t/g' > new.txt
Profil parametre referansı
Aşağıdaki tablolar, bir sorgu profilinde toplanan tüm parametreleri açıklar.
Parça
| Parametre | Açıklama |
|---|---|
AverageThreadTokens |
İş parçacığı havuzu kullanımı hariç, parça çalıştırması için kullanılan iş parçacığı sayısı. |
Buffer Pool PeakReservation |
Arabellek havuzunun en yüksek bellek kullanımı. |
MemoryLimit |
Sorgu için bellek sınırı. |
PeakMemoryUsage |
Sorgu sırasında bir çalıştırma biriminin en yüksek bellek kullanımı. |
RowsProduced |
Sütunları işlenen satır sayısı. |
BlockMgr
| Parametre | Açıklama |
|---|---|
BlocksCreated |
BlockManager tarafından oluşturulan blok sayısı. |
BlocksRecycled |
Yeniden kullanılan blok sayısı. |
BytesWritten |
Disk üzerine yazılan verilerin toplam boyutu. |
MaxBlockSize |
Tek bir bloğun boyutu. |
TotalReadBlockTime |
Blokların okunması için harcanan toplam süre. |
DataStreamSender
| Parametre | Açıklama |
|---|---|
BytesSent |
Gönderilen verilerin toplam boyutu. Alıcı sayısı x gönderilen veri boyutu olarak hesaplanır. |
IgnoreRows |
Filtrelenen satır sayısı. |
LocalBytesSent |
Veri alışverişi sırasında yerel düğüm tarafından gönderilen ve yerel düğüm tarafından alınan verilerin boyutu. |
OverallThroughput |
Toplam aktarım hızı. BytesSent / çalıştırma süresi olarak hesaplanır. |
SerializeBatchTime |
Gönderilen verilerin serileştirilmesi için harcanan süre. |
UncompressedRowBatchSize |
Sıkıştırma öncesi gönderilen RowBatch verilerinin boyutu. |
ODBC_TABLE_SINK
| Parametre | Açıklama |
|---|---|
NumSentRows |
Harici bir tabloya yazılan toplam satır sayısı. |
TupleConvertTime |
Gönderilen verilerin INSERT ifadelerine serileştirilmesi için harcanan süre. |
ResultSendTime |
Open Database Connectivity (ODBC) sürücüsü kullanılarak verilerin yazılması için harcanan süre. |
EXCHANGE_NODE
| Parametre | Açıklama |
|---|---|
BytesReceived |
Ağ üzerinden alınan verilerin boyutu. |
MergeGetNext |
Alt düğümde sıralama yapıldığında exchange düğümü birleşik birleştirme ve sıralama gerçekleştirir. Bu, MergeGetNextBatch dahil olmak üzere birleştirme ve sıralama için harcanan toplam süredir. |
MergeGetNextBatch |
Birleştirme düğümünün veri alması için harcanan süre. Tek düzeyli birleştirme ve sıralamada veriler ağ kuyruğundan alınır. Çok düzeyli birleştirme ve sıralamada veriler alt birleştiriciden alınır. |
ChildMergeGetNext |
Çok sayıda gönderici veri gönderdiğinde tek iş parçacıklı birleştirme bir darboğaza neden olur. ApsaraDB for SelectDB, paralel olarak birleştirmek ve sıralamak için alt birleştirme düğümünde birden çok iş parçacığı başlatır. Bu, tüm iş parçacıklarındaki kümülatif süredir. |
ChildMergeGetNextBatch |
Alt birleştirme düğümünün veri alması için harcanan süre. Yüksek değerler, alt veri gönderen düğümde darboğazlar olabileceğini gösterebilir. |
DataArrivalWaitTime |
Göndericinin veri göndermesini beklemek için harcanan toplam süre. |
FirstBatchArrivalWaitTime |
Göndericiden ilk veri grubunun gelmesini beklemek için harcanan süre. |
DeserializeRowBatchTimer |
Ağ verilerinin seri durumdan çıkarılması için harcanan süre. |
SendersBlockedTotalTimer(*) |
DataStreamRecv kuyruk belleği tamamen dolduğunda gönderici tarafında harcanan toplam bekleme süresi. |
ConvertRowBatchTime |
Alınan verilerin RowBatch'e dönüştürülmesi için harcanan süre. |
RowsReturned |
Alınan satır sayısı. |
RowsReturnedRate |
Satırların alınma hızı. |
SORT_NODE
| Parametre | Açıklama |
|---|---|
InMemorySortTime |
Bellek içi sıralama için harcanan süre. |
InitialRunsCreated |
Sıralamanın başlatılma sayısı. Bellek içi sıralama için değer 1 olur. |
SortDataSize |
Sıralanan verilerin toplam boyutu. |
MergeGetNext |
MergeSort'un birden çok sıralı çalışmadan sonraki grubu alması için harcanan süre. Yalnızca veriler diske yazıldığında ölçülür. |
MergeGetNextBatch |
MergeSort'un sonraki sıralı çalışmanın grubunu çıkarması için harcanan süre. Yalnızca veriler diske yazıldığında ölçülür. |
TotalMergesPerformed |
Harici birleştirmenin gerçekleştirilme sayısı. |
AGGREGATION_NODE
| Parametre | Açıklama |
|---|---|
PartitionsCreated |
Toplama sorgusunun bölündüğü bölüm sayısı. |
GetResultsTime |
Bölümlerden toplama sonuçlarının alınması için harcanan süre. |
HTResizeTime |
Hash tablosunun yeniden boyutlandırılması için harcanan süre. |
HTResize |
Hash tablosunun yeniden boyutlandırılma sayısı. |
HashBuckets |
Hash tablosundaki kova sayısı. |
HashBucketsWithDuplicate |
Hash tablosunda yinelenen düğümlere sahip kova sayısı. |
HashCollisions |
Hash tablosundaki hash çarpışma sayısı. |
HashDuplicateNodes |
Hash tablosunda aynı kovaya ait yinelenen düğüm sayısı. |
HashFailedProbe |
Hash tablosunda başarısız olan araştırma işlemi sayısı. |
HashFilledBuckets |
Hash tablosunda verilerle doldurulan kova sayısı. |
HashProbe |
Hash tablosunun sorgulanma sayısı. |
HashTravelLength |
Hash tablosu sorgusu sırasında taşınan adım sayısı. |
HASH_JOIN_NODE
| Parametre | Açıklama |
|---|---|
ExecOption |
Sağ alt düğüm için hash tablosu oluşturma yöntemi: eşzamanlı veya eşzamansız. |
BuildBuckets |
Hash tablosundaki kova sayısı. |
BuildRows |
Hash tablosundaki satır sayısı. |
BuildTime |
Hash tablosunun oluşturulması için harcanan süre. |
LoadFactor |
Boş olmayan kova sayısını gösteren hash tablosunun yükleme faktörü. |
ProbeRows |
Sol alt düğümler tarandıktan sonra hash araştırma işleminin gerçekleştirildiği satır sayısı. |
ProbeTime |
Sol alt düğümünden RowBatch üzerinde GetNext çağrısı yapma süresi hariç, hash araştırması için sol alt düğümlerin taranması amacıyla harcanan süre. |
PushDownComputeTime |
Yüklemeli koşul hesaplama için harcanan süre. |
PushDownTime |
Yüklemeli koşul için harcanan toplam süre. Koşulları karşılayan sağ alt düğümlerdeki join sorguları, sol alt düğümlerde IN sorgularına dönüştürülür. |
CROSS_JOIN_NODE
| Parametre | Açıklama |
|---|---|
ExecOption |
Sağ alt düğüm için RowBatchList oluşturma yöntemi: eşzamanlı veya eşzamansız. |
BuildRows |
RowBatchList satır sayısı (sağ alt düğümdeki satırlar). |
BuildTime |
RowBatchList'in oluşturulması için harcanan süre. |
LeftChildRows |
Sol alt düğümdeki satır sayısı. |
LeftChildTime |
Sol alt düğümünden RowBatch üzerinde GetNext çağrısı yapma süresi hariç, Kartezyen çarpımı oluşturmak için sol ve sağ alt düğümlerin taranması amacıyla harcanan süre. |
UNION_NODE
| Parametre | Açıklama |
|---|---|
MaterializeExprsEvaluateTime |
Bir UNION'ın her iki tarafındaki alan türleri farklı olduğunda tür dönüşüm ifadelerini değerlendirmek ve sonuçları somutlaştırmak için harcanan süre. |
ANALYTIC_EVAL_NODE
| Parametre | Açıklama |
|---|---|
EvaluationTime |
Analitik işlev (pencere işlevi) hesaplaması için harcanan toplam süre. |
GetNewBlockTime |
Başlatma sırasında yeni bir blok ayırmak için harcanan süre. Blok, analitik işlev hesaplaması için Rows penceresini veya tüm bir bölümü önbelleğe alır. |
PinTime |
Yeni bir blok ayırmak veya diske yazılmış bir bloğu yeniden belleğe okumak için harcanan süre. |
UnpinTime |
Bir blok artık gerekli olmadığında veya geçerli işlenen yüksek bellek baskısı altındayken bir bloğun verilerini diske yazmak için harcanan süre. |
OLAP_SCAN_NODE
OLAP_SCAN_NODE, veri tarama görevlerini yönetir. Her biri verilerin bir bölümünü taramaktan sorumlu olan bir veya daha fazla OLAP tarayıcısı oluşturur. Profil, çağrı hiyerarşisini yansıtan üç katmanda düzenlenmiştir: OLAP_SCAN_NODE -> OlapScanner -> SegmentIterator.
Bazı veya tüm koşul koşulları OLAP_SCAN_NODE'a yüklenir. Depolama motoru dizinlerini kullanabilen koşullar filtreleme için depolama motoruna daha da yüklenir; geri kalanlar ise OLAP_SCAN_NODE içinde değerlendirilir.
Bazı ölçüm değerleri depolama biçimine (V1 veya V2) bağlı olarak farklılık gösterir.
Aşağıdaki örnek, tipik bir OLAP_SCAN_NODE profilini göstermektedir:
OLAP_SCAN_NODE (id=0):(Active: 1.2ms, % non-child: 0.00%)
- BytesRead: 265.00 B # Size of data read from data files. For example, 10 x 32-bit integers = 40 bytes. This reflects data fully loaded into memory, not raw I/O size.
- NumDiskAccess: 1 # Number of disks accessed by the ScanNode.
- NumScanners: 20 # Number of scanners created by the ScanNode.
- PeakMemoryUsage: 0.00 # Peak memory usage during the query.
- RowsRead: 7 # Rows returned from the storage engine to the scanner, excluding rows filtered by the scanner.
- RowsReturned: 7 # Rows returned from the ScanNode to the parent node.
- RowsReturnedRate: 6.979K /sec # RowsReturned / ActiveTime.
- TabletCount: 20 # Number of tablets accessed by the ScanNode.
- TotalReadThroughput: 74.70 KB/sec # BytesRead divided by total execution time. For I/O-bound queries, this approaches total disk throughput.
- ScannerBatchWaitTime: 426.886us # Time for the transfer thread to wait for the scanner thread to return RowBatch data.
- ScannerWorkerWaitTime: 17.745us # Time for the scanner thread to wait for available worker threads in the thread pool.
OlapScanner:
- BlockConvertTime: 8.941us # Time to convert a vectorized block to a row-structured RowBlock. The vectorized block is VectorizedRowBatch (V1) or RowBlockV2 (V2).
- BlockFetchTime: 468.974us # Time for the rowset reader to get blocks.
- ReaderInitTime: 5.475ms # Time for the OLAP scanner to initialize readers. Includes MergeHeap creation time (V1) and the time to generate all iterator levels and read the first block group (V2).
- RowsDelFiltered: 0 # Rows filtered based on DELETE information in the tablet and rows marked for deletion in the Unique Key model.
- RowsPushedCondFiltered: 0 # Rows filtered by predicates pushed down from a join operation (e.g., from BuildTable to ProbeTable). This value is approximate; filtering may be skipped if the effect is poor.
- ScanTime: 39.24us # Time for data to travel from ScanNode to the parent node.
- ShowHintsTime_V1: 0ns # V1 only: time to read some data for ScanRange splitting.
SegmentIterator:
- BitmapIndexFilterTimer: 779ns # Time to filter data using bitmap indexes.
- BlockLoadTime: 415.925us # Time for the segment reader (V1) or segment iterator (V2) to get blocks.
- BlockSeekCount: 12 # Number of block seeks during segment reading.
- BlockSeekTime: 222.556us # Time consumed for block seeks during segment reading.
- BlocksLoad: 6 # Number of blocks read.
- CachedPagesNum: 30 # V2 only: number of pages that hit the page cache.
- CompressedBytesRead: 0.00 # V1: size of data before decompression read from file. V2: size of pages before compression that did not hit the page cache.
- DecompressorTimer: 0ns # Time consumed for data decompression.
- IOTimer: 0ns # Actual I/O time for reading data from the operating system.
- IndexLoadTime_V1: 0ns # V1 only: time to read index streams.
- NumSegmentFiltered: 0 # Number of segments completely filtered out based on column statistics and query conditions.
- NumSegmentTotal: 6 # Total number of segments involved in the query.
- RawRowsRead: 7 # Source data rows read from the storage engine after all preceding filtering.
- RowsBitmapIndexFiltered: 0 # V2 only: rows filtered using bitmap indexes.
- RowsBloomFilterFiltered: 0 # V2 only: rows filtered using BloomFilter indexes.
- RowsKeyRangeFiltered: 0 # V2 only: rows filtered using SortkeyIndex indexes.
- RowsStatsFiltered: 0 # V2: rows filtered using ZoneMap indexes, including delete conditions. V1: includes rows filtered using BloomFilter indexes.
- RowsConditionsFiltered: 0 # V2 only: rows filtered by all column indexes combined.
- RowsVectorPredFiltered: 0 # Rows filtered by vectorized condition operations.
- TotalPagesNum: 30 # V2 only: total number of pages read.
- UncompressedBytesRead: 0.00 # V1: size of data after decompression (or file size if not compressed). V2: size of pages that did not hit the page cache after decompression (or page size if not compressed).
- VectorPredEvalTime: 0ns # Time to perform filtering by vectorized condition.
- ShortPredEvalTime: 0ns # Time to perform filtering by short-circuit predicate.
- PredColumnReadTime: 0ns # Time consumed for predicate column reading.
- LazyReadTime: 0ns # Time consumed to read non-predicate columns.
- OutputColumnTime: 0ns # Time consumed for column materialization.
Filtreleme ölçümlerinin birbirleriyle ilişkisi
Bir OLAP_SCAN_NODE profilindeki satır sayısı ölçümleri, koşulların ve dizinlerin her aşamada veri hacmini ne kadar etkili bir şekilde azalttığını ortaya koyar. Aşağıda V2 biçimli filtreleme sırası açıklanmaktadır. V1 biçimli ölçümlerin anlamları biraz farklıdır.
Başlatma aşaması
Filtreleme şu sırayla gerçekleşir:
SortkeyIndex — Sorguda anahtar aralıkları (ön ek anahtar aralıkları) varsa veriler önce filtrelenir. Elenen satırlar
RowsKeyRangeFilterediçinde kaydedilir.Bitmap dizinleri — Bitmap dizinleriyle eşleşen koşullar için doğru sütun filtrelemesi uygulanır. Elenen satırlar
RowsBitmapIndexFilterediçinde kaydedilir.-
BloomFilter dizinleri — Eşitlik koşulları (
=,IN,IS) BloomFilter dizinleri kullanılarak filtrelenir. Elenen satırlarRowsBloomFilterFilterediçinde kaydedilir.NotRowsBloomFilterFiltered, toplam bölüm satırları eksi BloomFilter filtrelemesinden sonraki kalan satırlar olarak hesaplanır. Zaten bitmap dizinleri tarafından elenen satırlarla örtüşebilir. ZoneMap dizinleri — Veriler sorgu ve silme koşullarına göre filtrelenir. Elenen satırlar
RowsStatsFilterediçinde kaydedilir.RowsConditionsFiltered,RowsBloomFilterFilteredveRowsStatsFiltereddahil olmak üzere tüm dizinler tarafından birlikte filtrelenen toplam satırdır.
Sonraki aşama
Başlatmadan sonra kalan veriler ek aşamalardan geçer:
RowsDelFiltered: Silme koşulları tarafından elenen satırlar. Bunlar ayrıcaRowsStatsFilterediçinde de sayılır.RawRowsRead: Tüm önceki filtrelemeden sonra kalan satırlar.RowsRead: Depolama motorundan tarayıcıya döndürülen satırlar. Depolama motoru satırları birleştirebileceğinden bu değer genellikleRawRowsReaddeğerinden daha düşüktür.RawRowsReadileRowsReadarasında büyük bir fark, performans sorunu olabilecek yoğun bir birleştirmeyi gösterir.RowsReturned: ScanNode tarafından üst düğüme nihai olarak döndürülen satırlar. Depolama motoruna yüklenmeyen koşullar tarayıcı düzeyinde uygulandığından bu değer genellikleRowsReaddeğerinden daha düşüktür.RowsReadileRowsReturnedarasında büyük bir fark, filtrelemenin daha verimli olduğu depolama motoruna ulaşmayan birçok yüksek seçicilikli koşul olduğunu gösterir.
Rows***Filtered ölçümleri birlikte, sorgu koşullarının depolama motoruna yüklenip yüklenmediğini ve her dizin türünün ne kadar etkili olduğunu değerlendirmenizi sağlar.
Diğer ölçümler
-
OlapScanneraltındaki ölçümler (IOTimerveBlockFetchTimegibi) tüm tarayıcı iş parçacıklarında kümülatiftir. Tarayıcı iş parçacıkları verileri eşzamansız olarak okuduğundan bu birikmiş değerler toplam tarayıcı çalışma süresini yansıtır, ScanNode duvar saati süresini değil.Activeyüzdesi, ScanNode'un genel çalıştırma planına katkıda bulunduğu zamanın gerçek oranını kaydeder.IOTimeronlarca saniye ikenActiveyalnızca birkaç saniye olması iki nedenden dolayı normaldir:IOTimerparalel çalışan birçok tarayıcıda birikir.Üst düğüm yavaşsa (örneğin, 100 saniye) ScanNode (10 saniye) erken biter ve arka planda verileri hazırlar. Üst düğüm ardından hazırlanan verileri alır, bu nedenle ScanNode'un
Activesüresi kısadır.
NumScanners, tarayıcınınRuntimeStatetarafından yönetilen iş parçacığı havuzuna gönderdiği görev sayısıdır.doris_scanner_thread_pool_thread_numvedoris_scanner_thread_pool_queue_sizeparametreleri iş parçacığı havuzu boyutunu ve kuyruk uzunluğunu kontrol eder. İş parçacığı sayısı çok fazla veya yetersiz olursa sorgu verimliliği etkilenir. Bazı ölçümleri iş parçacığı sayısına bölerek her iş parçacığı için harcanan süreyi kabaca tahmin edebilirsiniz.TabletCount, taranacak tablet sayısıdır. Yüksek tablet sayısı, daha fazla rastgele okuma ve veri birleştirme işlemi anlamına gelir.UncompressedBytesRead, okunan veri hacmini yansıtır. Yüksek bir değer, yoğun G/Ç'yi gösterebilir.Sayfa önbelleği isabet oranını değerlendirmek için
CachedPagesNumdeğeriniTotalPagesNumile karşılaştırın. Daha yüksek isabet oranı hem G/Ç hem de sıkıştırma açma ek yükünü azaltır.
Arabellek havuzu
| Parametre | Açıklama |
|---|---|
AllocTime |
Bellek ayırma için harcanan süre. |
CumulativeAllocationBytes |
Ayrılan belleğin kümülatif boyutu. |
CumulativeAllocations |
Kümülatif bellek ayırma sayısı. |
PeakReservation |
En yüksek rezervasyon boyutu. |
PeakUnpinnedBytes |
Sabitlenmemiş bellek verilerinin boyutu. |
PeakUsedReservation |
Rezervasyonların bellek kullanımı. |
ReservationLimit |
Arabellek havuzundaki rezervasyon sınırı. |