blob: a7ea61beeeb6220a1963050b743fee5c52f57b68 [file] [log] [blame]
<!DOCTYPE html>
<html lang="en-US">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title> </title>
<meta name="generator" content="VuePress 1.7.1">
<link rel="icon" href="/favicon.ico">
<meta name="description" content=" ">
<meta name="Description" content="Apache IoTDB: Time Series Database for IoT">
<meta name="Keywords" content="TSDB, time series, time series database, IoTDB, IoT database, IoT data management,时序数据库, 时间序列管理, IoTDB, 物联网数据库, 实时数据库, 物联网数据管理, 物联网数据">
<meta name="baidu-site-verification" content="wfKETzB3OT">
<meta name="google-site-verification" content="mZWAoRY0yj_HAr-s47zHCGHzx5Ju-RVm5wDbPnwQYFo">
<link rel="preload" href="/assets/css/0.styles.679f71b6.css" as="style"><link rel="preload" href="/assets/js/app.ee472f44.js" as="script"><link rel="preload" href="/assets/js/3.49f0f20a.js" as="script"><link rel="preload" href="/assets/js/8.e8c4adeb.js" as="script"><link rel="prefetch" href="/assets/js/10.a9e4399a.js"><link rel="prefetch" href="/assets/js/100.68c72120.js"><link rel="prefetch" href="/assets/js/101.b6fa0a59.js"><link rel="prefetch" href="/assets/js/102.a64e2bb2.js"><link rel="prefetch" href="/assets/js/103.3e232964.js"><link rel="prefetch" href="/assets/js/104.12a0c146.js"><link rel="prefetch" href="/assets/js/105.c82addea.js"><link rel="prefetch" href="/assets/js/106.d95539e1.js"><link rel="prefetch" href="/assets/js/107.3a8e4204.js"><link rel="prefetch" href="/assets/js/108.445910dc.js"><link rel="prefetch" href="/assets/js/109.e592a10a.js"><link rel="prefetch" href="/assets/js/11.1a825151.js"><link rel="prefetch" href="/assets/js/110.f2ff7f26.js"><link rel="prefetch" href="/assets/js/111.ce7b4bb8.js"><link rel="prefetch" href="/assets/js/112.c0fb665c.js"><link rel="prefetch" href="/assets/js/113.27feecaf.js"><link rel="prefetch" href="/assets/js/114.4610bfa2.js"><link rel="prefetch" href="/assets/js/115.0857c1d6.js"><link rel="prefetch" href="/assets/js/116.530d568b.js"><link rel="prefetch" href="/assets/js/117.9deade83.js"><link rel="prefetch" href="/assets/js/118.cbb62265.js"><link rel="prefetch" href="/assets/js/119.8822d43b.js"><link rel="prefetch" href="/assets/js/12.4679de68.js"><link rel="prefetch" href="/assets/js/120.355ddd53.js"><link rel="prefetch" href="/assets/js/121.94505f4a.js"><link rel="prefetch" href="/assets/js/122.6c825584.js"><link rel="prefetch" href="/assets/js/123.d2965d60.js"><link rel="prefetch" href="/assets/js/124.bb17af3e.js"><link rel="prefetch" href="/assets/js/125.a523475b.js"><link rel="prefetch" href="/assets/js/126.309eb2a0.js"><link rel="prefetch" href="/assets/js/127.31f131d5.js"><link rel="prefetch" href="/assets/js/128.d6961094.js"><link rel="prefetch" href="/assets/js/129.9f80c586.js"><link rel="prefetch" href="/assets/js/13.821d2576.js"><link rel="prefetch" href="/assets/js/130.8b3034e2.js"><link rel="prefetch" href="/assets/js/131.5c952a0b.js"><link rel="prefetch" href="/assets/js/132.9b312915.js"><link rel="prefetch" href="/assets/js/133.229545d4.js"><link rel="prefetch" href="/assets/js/134.6ef84d4d.js"><link rel="prefetch" href="/assets/js/135.63dcccc3.js"><link rel="prefetch" href="/assets/js/136.693bbb9e.js"><link rel="prefetch" href="/assets/js/137.065787a2.js"><link rel="prefetch" href="/assets/js/138.199d56aa.js"><link rel="prefetch" href="/assets/js/139.93368911.js"><link rel="prefetch" href="/assets/js/14.f2409887.js"><link rel="prefetch" href="/assets/js/140.cb3339d6.js"><link rel="prefetch" href="/assets/js/141.0ffa040d.js"><link rel="prefetch" href="/assets/js/142.c3e197d4.js"><link rel="prefetch" href="/assets/js/143.9e4dc6ae.js"><link rel="prefetch" href="/assets/js/144.27249482.js"><link rel="prefetch" href="/assets/js/145.f9305e04.js"><link rel="prefetch" href="/assets/js/146.a953796c.js"><link rel="prefetch" href="/assets/js/147.5ffa8a4e.js"><link rel="prefetch" href="/assets/js/148.5f5c0ad8.js"><link rel="prefetch" href="/assets/js/149.6690aae1.js"><link rel="prefetch" href="/assets/js/15.9354febe.js"><link rel="prefetch" href="/assets/js/150.36dae2d3.js"><link rel="prefetch" href="/assets/js/151.2ca29374.js"><link rel="prefetch" href="/assets/js/152.fceb9b61.js"><link rel="prefetch" href="/assets/js/153.93489dbc.js"><link rel="prefetch" href="/assets/js/154.d9c14ff8.js"><link rel="prefetch" href="/assets/js/155.b6eec7f7.js"><link rel="prefetch" href="/assets/js/156.8718f8bc.js"><link rel="prefetch" href="/assets/js/157.8484231e.js"><link rel="prefetch" href="/assets/js/158.d1755131.js"><link rel="prefetch" href="/assets/js/159.8a8be7d5.js"><link rel="prefetch" href="/assets/js/16.590590ab.js"><link rel="prefetch" href="/assets/js/160.67e2efd2.js"><link rel="prefetch" href="/assets/js/161.0e22ffff.js"><link rel="prefetch" href="/assets/js/162.f47c5fdc.js"><link rel="prefetch" href="/assets/js/163.da74b426.js"><link rel="prefetch" href="/assets/js/164.f88f06d5.js"><link rel="prefetch" href="/assets/js/165.9a1b5b41.js"><link rel="prefetch" href="/assets/js/166.8832a7a4.js"><link rel="prefetch" href="/assets/js/167.ff58fb1f.js"><link rel="prefetch" href="/assets/js/168.9a351c30.js"><link rel="prefetch" href="/assets/js/169.23c06c42.js"><link rel="prefetch" href="/assets/js/17.4cb5664d.js"><link rel="prefetch" href="/assets/js/170.ea0af6cf.js"><link rel="prefetch" href="/assets/js/171.e11e1bb7.js"><link rel="prefetch" href="/assets/js/172.273f4d56.js"><link rel="prefetch" href="/assets/js/173.fca03089.js"><link rel="prefetch" href="/assets/js/174.434334ff.js"><link rel="prefetch" href="/assets/js/175.a8acb6b2.js"><link rel="prefetch" href="/assets/js/176.a1c55473.js"><link rel="prefetch" href="/assets/js/177.ebb38cec.js"><link rel="prefetch" href="/assets/js/178.79b8a327.js"><link rel="prefetch" href="/assets/js/179.6319af14.js"><link rel="prefetch" href="/assets/js/18.f5fe433e.js"><link rel="prefetch" href="/assets/js/180.28a1d783.js"><link rel="prefetch" href="/assets/js/181.a29f39c5.js"><link rel="prefetch" href="/assets/js/182.9f3d9c76.js"><link rel="prefetch" href="/assets/js/183.338ae9a8.js"><link rel="prefetch" href="/assets/js/184.18c28159.js"><link rel="prefetch" href="/assets/js/185.05381100.js"><link rel="prefetch" href="/assets/js/186.ce9412eb.js"><link rel="prefetch" href="/assets/js/187.30a80942.js"><link rel="prefetch" href="/assets/js/188.5a77f986.js"><link rel="prefetch" href="/assets/js/189.f34dc967.js"><link rel="prefetch" href="/assets/js/19.d02f7224.js"><link rel="prefetch" href="/assets/js/190.d9762047.js"><link rel="prefetch" href="/assets/js/191.8c52689f.js"><link rel="prefetch" href="/assets/js/192.10ae9786.js"><link rel="prefetch" href="/assets/js/193.4a83ff5f.js"><link rel="prefetch" href="/assets/js/194.1d9f888b.js"><link rel="prefetch" href="/assets/js/195.ac95d80c.js"><link rel="prefetch" href="/assets/js/196.305a7cc8.js"><link rel="prefetch" href="/assets/js/197.3950b155.js"><link rel="prefetch" href="/assets/js/198.60367e76.js"><link rel="prefetch" href="/assets/js/199.a5eec1cf.js"><link rel="prefetch" href="/assets/js/20.02900ba2.js"><link rel="prefetch" href="/assets/js/200.7b42f970.js"><link rel="prefetch" href="/assets/js/201.c176b7b8.js"><link rel="prefetch" href="/assets/js/202.eb6989b5.js"><link rel="prefetch" href="/assets/js/203.77522ed7.js"><link rel="prefetch" href="/assets/js/204.d5e4c11b.js"><link rel="prefetch" href="/assets/js/205.b174d51b.js"><link rel="prefetch" href="/assets/js/206.4c489028.js"><link rel="prefetch" href="/assets/js/207.afdf032a.js"><link rel="prefetch" href="/assets/js/208.e5a0bdd5.js"><link rel="prefetch" href="/assets/js/209.67c9cab8.js"><link rel="prefetch" href="/assets/js/21.3b6ef7f6.js"><link rel="prefetch" href="/assets/js/210.99085605.js"><link rel="prefetch" href="/assets/js/211.62045ced.js"><link rel="prefetch" href="/assets/js/212.5d4b9b33.js"><link rel="prefetch" href="/assets/js/213.8d2fc243.js"><link rel="prefetch" href="/assets/js/214.081b8259.js"><link rel="prefetch" href="/assets/js/215.a9c42b7b.js"><link rel="prefetch" href="/assets/js/216.e4177064.js"><link rel="prefetch" href="/assets/js/217.00d389be.js"><link rel="prefetch" href="/assets/js/218.53691557.js"><link rel="prefetch" href="/assets/js/219.fce8476d.js"><link rel="prefetch" href="/assets/js/22.ab7a2af8.js"><link rel="prefetch" href="/assets/js/220.8ca717ad.js"><link rel="prefetch" href="/assets/js/221.b774095e.js"><link rel="prefetch" href="/assets/js/222.abb49f0a.js"><link rel="prefetch" href="/assets/js/223.506eb112.js"><link rel="prefetch" href="/assets/js/224.7e33133f.js"><link rel="prefetch" href="/assets/js/225.4443cf9b.js"><link rel="prefetch" href="/assets/js/226.5d64564f.js"><link rel="prefetch" href="/assets/js/227.e647cf42.js"><link rel="prefetch" href="/assets/js/228.7b8e1561.js"><link rel="prefetch" href="/assets/js/229.c6b936b3.js"><link rel="prefetch" href="/assets/js/23.b428286f.js"><link rel="prefetch" href="/assets/js/230.484dfbbc.js"><link rel="prefetch" href="/assets/js/231.04cb07f3.js"><link rel="prefetch" href="/assets/js/232.cb5f7cf4.js"><link rel="prefetch" href="/assets/js/233.fd5563aa.js"><link rel="prefetch" href="/assets/js/234.bf0c8bd7.js"><link rel="prefetch" href="/assets/js/235.c910d0ff.js"><link rel="prefetch" href="/assets/js/236.2fa96a32.js"><link rel="prefetch" href="/assets/js/237.4d40bac8.js"><link rel="prefetch" href="/assets/js/238.8f8a5f39.js"><link rel="prefetch" href="/assets/js/239.8c8e2f64.js"><link rel="prefetch" href="/assets/js/24.a3749d36.js"><link rel="prefetch" href="/assets/js/240.b662bcd8.js"><link rel="prefetch" href="/assets/js/241.04b9e3ed.js"><link rel="prefetch" href="/assets/js/242.bae1b833.js"><link rel="prefetch" href="/assets/js/243.174da90a.js"><link rel="prefetch" href="/assets/js/244.1ad856fc.js"><link rel="prefetch" href="/assets/js/245.a622849c.js"><link rel="prefetch" href="/assets/js/246.dc04cc61.js"><link rel="prefetch" href="/assets/js/247.d9f48a2f.js"><link rel="prefetch" href="/assets/js/248.85018b5a.js"><link rel="prefetch" href="/assets/js/249.6ba9e6c7.js"><link rel="prefetch" href="/assets/js/25.bc6a97e8.js"><link rel="prefetch" href="/assets/js/250.9ca65c13.js"><link rel="prefetch" href="/assets/js/251.8f4abe5e.js"><link rel="prefetch" href="/assets/js/252.cb8b4901.js"><link rel="prefetch" href="/assets/js/253.e43c464a.js"><link rel="prefetch" href="/assets/js/254.bc5748be.js"><link rel="prefetch" href="/assets/js/255.ad9c3e74.js"><link rel="prefetch" href="/assets/js/256.48bf6b1c.js"><link rel="prefetch" href="/assets/js/257.aae9e4a7.js"><link rel="prefetch" href="/assets/js/258.d27a0224.js"><link rel="prefetch" href="/assets/js/259.8b338cff.js"><link rel="prefetch" href="/assets/js/26.81ae73cb.js"><link rel="prefetch" href="/assets/js/260.9302e533.js"><link rel="prefetch" href="/assets/js/261.ea1ed48a.js"><link rel="prefetch" href="/assets/js/262.08d81cca.js"><link rel="prefetch" href="/assets/js/263.c2598230.js"><link rel="prefetch" href="/assets/js/264.89fadf4b.js"><link rel="prefetch" href="/assets/js/265.9e7e3b87.js"><link rel="prefetch" href="/assets/js/266.63098760.js"><link rel="prefetch" href="/assets/js/267.df285aaf.js"><link rel="prefetch" href="/assets/js/268.56ef99a0.js"><link rel="prefetch" href="/assets/js/269.86c3bd00.js"><link rel="prefetch" href="/assets/js/27.5361988c.js"><link rel="prefetch" href="/assets/js/270.69d8c77d.js"><link rel="prefetch" href="/assets/js/271.49550e05.js"><link rel="prefetch" href="/assets/js/272.bf7fe25a.js"><link rel="prefetch" href="/assets/js/273.bac87430.js"><link rel="prefetch" href="/assets/js/274.1a5b6778.js"><link rel="prefetch" href="/assets/js/275.59d1fe0c.js"><link rel="prefetch" href="/assets/js/276.c21f1bb7.js"><link rel="prefetch" href="/assets/js/277.3416c059.js"><link rel="prefetch" href="/assets/js/278.1e47cbc9.js"><link rel="prefetch" href="/assets/js/279.a285ca6b.js"><link rel="prefetch" href="/assets/js/28.902cf242.js"><link rel="prefetch" href="/assets/js/280.b1cfd58b.js"><link rel="prefetch" href="/assets/js/281.5014dd8c.js"><link rel="prefetch" href="/assets/js/282.f46c3f5f.js"><link rel="prefetch" href="/assets/js/283.c8fa806b.js"><link rel="prefetch" href="/assets/js/284.1bca3237.js"><link rel="prefetch" href="/assets/js/285.ca102a1f.js"><link rel="prefetch" href="/assets/js/286.312b549d.js"><link rel="prefetch" href="/assets/js/287.56daf71d.js"><link rel="prefetch" href="/assets/js/288.4d6ee237.js"><link rel="prefetch" href="/assets/js/289.8990a52d.js"><link rel="prefetch" href="/assets/js/29.8878a84b.js"><link rel="prefetch" href="/assets/js/290.79c4d4bb.js"><link rel="prefetch" href="/assets/js/291.e39a8f59.js"><link rel="prefetch" href="/assets/js/292.09b1dbf3.js"><link rel="prefetch" href="/assets/js/293.c11758cc.js"><link rel="prefetch" href="/assets/js/294.efe1c620.js"><link rel="prefetch" href="/assets/js/295.9a4ce682.js"><link rel="prefetch" href="/assets/js/296.5d55e2b4.js"><link rel="prefetch" href="/assets/js/297.0c74b494.js"><link rel="prefetch" href="/assets/js/298.61015025.js"><link rel="prefetch" href="/assets/js/299.95b2a709.js"><link rel="prefetch" href="/assets/js/30.144a5c6c.js"><link rel="prefetch" href="/assets/js/300.1ded6f5a.js"><link rel="prefetch" href="/assets/js/301.0c60ca57.js"><link rel="prefetch" href="/assets/js/302.a4e4ce29.js"><link rel="prefetch" href="/assets/js/303.f51290d8.js"><link rel="prefetch" href="/assets/js/304.5b9d354a.js"><link rel="prefetch" href="/assets/js/305.4fc3fa36.js"><link rel="prefetch" href="/assets/js/306.d2ccf3d8.js"><link rel="prefetch" href="/assets/js/307.137ddc6c.js"><link rel="prefetch" href="/assets/js/308.d093842e.js"><link rel="prefetch" href="/assets/js/309.8d85e9c5.js"><link rel="prefetch" href="/assets/js/31.03034f21.js"><link rel="prefetch" href="/assets/js/310.610cadf2.js"><link rel="prefetch" href="/assets/js/311.3f9bc269.js"><link rel="prefetch" href="/assets/js/312.ac085561.js"><link rel="prefetch" href="/assets/js/313.39e131a4.js"><link rel="prefetch" href="/assets/js/314.62ae7afd.js"><link rel="prefetch" href="/assets/js/315.312dd0ad.js"><link rel="prefetch" href="/assets/js/316.3daa3b97.js"><link rel="prefetch" href="/assets/js/317.385cce00.js"><link rel="prefetch" href="/assets/js/318.6e75f908.js"><link rel="prefetch" href="/assets/js/319.4a8516ae.js"><link rel="prefetch" href="/assets/js/32.bad93e79.js"><link rel="prefetch" href="/assets/js/320.e6ea8799.js"><link rel="prefetch" href="/assets/js/321.c192a35e.js"><link rel="prefetch" href="/assets/js/322.c675d3fd.js"><link rel="prefetch" href="/assets/js/323.cf867cd9.js"><link rel="prefetch" href="/assets/js/324.38af9dd2.js"><link rel="prefetch" href="/assets/js/325.dd39b2de.js"><link rel="prefetch" href="/assets/js/326.b3197783.js"><link rel="prefetch" href="/assets/js/327.7ab3256f.js"><link rel="prefetch" href="/assets/js/328.a51703c6.js"><link rel="prefetch" href="/assets/js/329.d4f2f214.js"><link rel="prefetch" href="/assets/js/33.00e7d6b5.js"><link rel="prefetch" href="/assets/js/330.1fb7bbad.js"><link rel="prefetch" href="/assets/js/331.52605dbf.js"><link rel="prefetch" href="/assets/js/332.58cff2f4.js"><link rel="prefetch" href="/assets/js/333.fa7136ab.js"><link rel="prefetch" href="/assets/js/334.0de0062b.js"><link rel="prefetch" href="/assets/js/335.a5e18bb9.js"><link rel="prefetch" href="/assets/js/336.448ec9fa.js"><link rel="prefetch" href="/assets/js/337.c877f6df.js"><link rel="prefetch" href="/assets/js/338.e071e415.js"><link rel="prefetch" href="/assets/js/339.194f47f4.js"><link rel="prefetch" href="/assets/js/34.44ac5494.js"><link rel="prefetch" href="/assets/js/340.5755d00b.js"><link rel="prefetch" href="/assets/js/341.070a9aed.js"><link rel="prefetch" href="/assets/js/342.35edcb5e.js"><link rel="prefetch" href="/assets/js/343.a86abe3e.js"><link rel="prefetch" href="/assets/js/344.22456a86.js"><link rel="prefetch" href="/assets/js/345.054131fa.js"><link rel="prefetch" href="/assets/js/346.d850e5ce.js"><link rel="prefetch" href="/assets/js/347.7b8936a1.js"><link rel="prefetch" href="/assets/js/348.5ee2b670.js"><link rel="prefetch" href="/assets/js/349.f37573c7.js"><link rel="prefetch" href="/assets/js/35.7f32ce73.js"><link rel="prefetch" href="/assets/js/350.312ee288.js"><link rel="prefetch" href="/assets/js/351.aabc93dc.js"><link rel="prefetch" href="/assets/js/352.99aa4418.js"><link rel="prefetch" href="/assets/js/353.9c90d422.js"><link rel="prefetch" href="/assets/js/354.8a7c72b5.js"><link rel="prefetch" href="/assets/js/355.1008fd17.js"><link rel="prefetch" href="/assets/js/356.546f7242.js"><link rel="prefetch" href="/assets/js/357.3f84c383.js"><link rel="prefetch" href="/assets/js/358.57ab0f48.js"><link rel="prefetch" href="/assets/js/359.715ee9c0.js"><link rel="prefetch" href="/assets/js/36.d1e9d19f.js"><link rel="prefetch" href="/assets/js/360.92093399.js"><link rel="prefetch" href="/assets/js/361.8e8a2657.js"><link rel="prefetch" href="/assets/js/362.c6796915.js"><link rel="prefetch" href="/assets/js/363.e17af86a.js"><link rel="prefetch" href="/assets/js/364.6274b87c.js"><link rel="prefetch" href="/assets/js/365.211ac0fc.js"><link rel="prefetch" href="/assets/js/366.e5297f1f.js"><link rel="prefetch" href="/assets/js/367.d778a1f0.js"><link rel="prefetch" href="/assets/js/368.d55765fc.js"><link rel="prefetch" href="/assets/js/369.d357817a.js"><link rel="prefetch" href="/assets/js/37.3351af87.js"><link rel="prefetch" href="/assets/js/370.14439cd0.js"><link rel="prefetch" href="/assets/js/371.8f1680c9.js"><link rel="prefetch" href="/assets/js/372.61718293.js"><link rel="prefetch" href="/assets/js/373.4b4647e8.js"><link rel="prefetch" href="/assets/js/374.71d42042.js"><link rel="prefetch" href="/assets/js/375.e4d369f2.js"><link rel="prefetch" href="/assets/js/376.51cd667f.js"><link rel="prefetch" href="/assets/js/377.023da5c6.js"><link rel="prefetch" href="/assets/js/378.726a5f82.js"><link rel="prefetch" href="/assets/js/379.720646dc.js"><link rel="prefetch" href="/assets/js/38.2334aea2.js"><link rel="prefetch" href="/assets/js/380.4d823b98.js"><link rel="prefetch" href="/assets/js/381.bdcccbea.js"><link rel="prefetch" href="/assets/js/382.8cce8942.js"><link rel="prefetch" href="/assets/js/383.cb7d71d3.js"><link rel="prefetch" href="/assets/js/384.bf2af7c5.js"><link rel="prefetch" href="/assets/js/385.1cc639e2.js"><link rel="prefetch" href="/assets/js/386.684b64ab.js"><link rel="prefetch" href="/assets/js/387.e16f4a68.js"><link rel="prefetch" href="/assets/js/388.c9b30f3b.js"><link rel="prefetch" href="/assets/js/389.a8b0f99a.js"><link rel="prefetch" href="/assets/js/39.683bc07a.js"><link rel="prefetch" href="/assets/js/390.b43004ff.js"><link rel="prefetch" href="/assets/js/391.c316049a.js"><link rel="prefetch" href="/assets/js/392.2c559de6.js"><link rel="prefetch" href="/assets/js/393.3055fc0a.js"><link rel="prefetch" href="/assets/js/394.7585ce4c.js"><link rel="prefetch" href="/assets/js/395.6f04bac1.js"><link rel="prefetch" href="/assets/js/396.a6536f32.js"><link rel="prefetch" href="/assets/js/397.e9807e10.js"><link rel="prefetch" href="/assets/js/398.b89dcc8a.js"><link rel="prefetch" href="/assets/js/399.da459f94.js"><link rel="prefetch" href="/assets/js/4.47196852.js"><link rel="prefetch" href="/assets/js/40.f2d861cf.js"><link rel="prefetch" href="/assets/js/400.d8b3b5fd.js"><link rel="prefetch" href="/assets/js/401.4a5b409e.js"><link rel="prefetch" href="/assets/js/402.f2c8802d.js"><link rel="prefetch" href="/assets/js/403.bd98e777.js"><link rel="prefetch" href="/assets/js/404.d2dab4f7.js"><link rel="prefetch" href="/assets/js/405.f83ce379.js"><link rel="prefetch" href="/assets/js/406.69a91345.js"><link rel="prefetch" href="/assets/js/407.3bc1a860.js"><link rel="prefetch" href="/assets/js/408.8b88a93c.js"><link rel="prefetch" href="/assets/js/409.269ef2c9.js"><link rel="prefetch" href="/assets/js/41.79fbb067.js"><link rel="prefetch" href="/assets/js/410.40dc1b76.js"><link rel="prefetch" href="/assets/js/411.6679eea2.js"><link rel="prefetch" href="/assets/js/412.2cdd21ea.js"><link rel="prefetch" href="/assets/js/413.f5418356.js"><link rel="prefetch" href="/assets/js/414.ed9da9ad.js"><link rel="prefetch" href="/assets/js/415.4cd14246.js"><link rel="prefetch" href="/assets/js/416.cd80178b.js"><link rel="prefetch" href="/assets/js/417.d650a560.js"><link rel="prefetch" href="/assets/js/418.ad71cbc7.js"><link rel="prefetch" href="/assets/js/419.8e6c87c0.js"><link rel="prefetch" href="/assets/js/42.101ecd13.js"><link rel="prefetch" href="/assets/js/420.71ec69ad.js"><link rel="prefetch" href="/assets/js/421.91d6b7be.js"><link rel="prefetch" href="/assets/js/422.353f77c5.js"><link rel="prefetch" href="/assets/js/423.60ef06c0.js"><link rel="prefetch" href="/assets/js/424.2e57687c.js"><link rel="prefetch" href="/assets/js/425.9413632b.js"><link rel="prefetch" href="/assets/js/426.e1b29e8b.js"><link rel="prefetch" href="/assets/js/427.ed640a0c.js"><link rel="prefetch" href="/assets/js/428.90a9eecd.js"><link rel="prefetch" href="/assets/js/429.bcc51151.js"><link rel="prefetch" href="/assets/js/43.cf663bf1.js"><link rel="prefetch" href="/assets/js/430.d7a129bf.js"><link rel="prefetch" href="/assets/js/431.6f0b95f4.js"><link rel="prefetch" href="/assets/js/432.c9964a14.js"><link rel="prefetch" href="/assets/js/433.fb0bc3bb.js"><link rel="prefetch" href="/assets/js/434.cbb78303.js"><link rel="prefetch" href="/assets/js/435.7633d592.js"><link rel="prefetch" href="/assets/js/436.dd3d00e6.js"><link rel="prefetch" href="/assets/js/437.40a87461.js"><link rel="prefetch" href="/assets/js/438.640ceed6.js"><link rel="prefetch" href="/assets/js/439.4bc626d3.js"><link rel="prefetch" href="/assets/js/44.0e34047e.js"><link rel="prefetch" href="/assets/js/440.840fff96.js"><link rel="prefetch" href="/assets/js/441.e8e14977.js"><link rel="prefetch" href="/assets/js/442.0f0a17b6.js"><link rel="prefetch" href="/assets/js/443.44c2279e.js"><link rel="prefetch" href="/assets/js/444.6d775f58.js"><link rel="prefetch" href="/assets/js/445.dfec1767.js"><link rel="prefetch" href="/assets/js/446.8282b220.js"><link rel="prefetch" href="/assets/js/447.4b8f1a4c.js"><link rel="prefetch" href="/assets/js/448.03b53f95.js"><link rel="prefetch" href="/assets/js/449.39dea464.js"><link rel="prefetch" href="/assets/js/45.fa02a8c0.js"><link rel="prefetch" href="/assets/js/450.948c5957.js"><link rel="prefetch" href="/assets/js/451.b4e00223.js"><link rel="prefetch" href="/assets/js/452.634de921.js"><link rel="prefetch" href="/assets/js/453.957a3638.js"><link rel="prefetch" href="/assets/js/454.d410cf71.js"><link rel="prefetch" href="/assets/js/455.8c5a2163.js"><link rel="prefetch" href="/assets/js/456.877d611f.js"><link rel="prefetch" href="/assets/js/457.8b24b950.js"><link rel="prefetch" href="/assets/js/458.591d759d.js"><link rel="prefetch" href="/assets/js/459.e114c85b.js"><link rel="prefetch" href="/assets/js/46.3a265755.js"><link rel="prefetch" href="/assets/js/460.1a928144.js"><link rel="prefetch" href="/assets/js/461.2a0384d2.js"><link rel="prefetch" href="/assets/js/462.5c3649e2.js"><link rel="prefetch" href="/assets/js/463.4221227c.js"><link rel="prefetch" href="/assets/js/464.866ac902.js"><link rel="prefetch" href="/assets/js/465.05a96c32.js"><link rel="prefetch" href="/assets/js/466.3efed881.js"><link rel="prefetch" href="/assets/js/467.ddd524e5.js"><link rel="prefetch" href="/assets/js/468.9eebe3d9.js"><link rel="prefetch" href="/assets/js/469.281b53ec.js"><link rel="prefetch" href="/assets/js/47.2d120101.js"><link rel="prefetch" href="/assets/js/470.decda882.js"><link rel="prefetch" href="/assets/js/471.242be672.js"><link rel="prefetch" href="/assets/js/472.da4abae1.js"><link rel="prefetch" href="/assets/js/473.9d64ea3e.js"><link rel="prefetch" href="/assets/js/474.5362ec5b.js"><link rel="prefetch" href="/assets/js/475.6904e585.js"><link rel="prefetch" href="/assets/js/476.c460d90a.js"><link rel="prefetch" href="/assets/js/477.474813fa.js"><link rel="prefetch" href="/assets/js/478.d51e07b1.js"><link rel="prefetch" href="/assets/js/479.f0fa0689.js"><link rel="prefetch" href="/assets/js/48.57af7d42.js"><link rel="prefetch" href="/assets/js/480.8b194bbe.js"><link rel="prefetch" href="/assets/js/481.f2f1aeeb.js"><link rel="prefetch" href="/assets/js/482.6903e11b.js"><link rel="prefetch" href="/assets/js/483.65d04ad9.js"><link rel="prefetch" href="/assets/js/484.51e94629.js"><link rel="prefetch" href="/assets/js/485.415550f4.js"><link rel="prefetch" href="/assets/js/486.d24d0355.js"><link rel="prefetch" href="/assets/js/487.9eea1be6.js"><link rel="prefetch" href="/assets/js/488.eb3d4584.js"><link rel="prefetch" href="/assets/js/489.6f97c453.js"><link rel="prefetch" href="/assets/js/49.3de3d3a7.js"><link rel="prefetch" href="/assets/js/490.e83cd7f7.js"><link rel="prefetch" href="/assets/js/491.4a6acdf2.js"><link rel="prefetch" href="/assets/js/492.e0548c45.js"><link rel="prefetch" href="/assets/js/493.29b0d0b2.js"><link rel="prefetch" href="/assets/js/494.9f66922c.js"><link rel="prefetch" href="/assets/js/495.31a136ac.js"><link rel="prefetch" href="/assets/js/496.4c1f303f.js"><link rel="prefetch" href="/assets/js/497.b03e6c3f.js"><link rel="prefetch" href="/assets/js/498.a8178b3e.js"><link rel="prefetch" href="/assets/js/499.9f38526a.js"><link rel="prefetch" href="/assets/js/5.33db7f08.js"><link rel="prefetch" href="/assets/js/50.27055b53.js"><link rel="prefetch" href="/assets/js/500.262b9103.js"><link rel="prefetch" href="/assets/js/501.c97f4e75.js"><link rel="prefetch" href="/assets/js/502.5d5c5edd.js"><link rel="prefetch" href="/assets/js/503.62a2a01d.js"><link rel="prefetch" href="/assets/js/504.855415b5.js"><link rel="prefetch" href="/assets/js/505.79d4fddb.js"><link rel="prefetch" href="/assets/js/506.f2675378.js"><link rel="prefetch" href="/assets/js/507.7d811dcb.js"><link rel="prefetch" href="/assets/js/508.6c63d710.js"><link rel="prefetch" href="/assets/js/509.a6dbe871.js"><link rel="prefetch" href="/assets/js/51.82e12c0c.js"><link rel="prefetch" href="/assets/js/510.6ba536a4.js"><link rel="prefetch" href="/assets/js/511.47fcc7dd.js"><link rel="prefetch" href="/assets/js/512.f5b2b05c.js"><link rel="prefetch" href="/assets/js/513.d1a9a405.js"><link rel="prefetch" href="/assets/js/514.4768319a.js"><link rel="prefetch" href="/assets/js/515.4a7312b1.js"><link rel="prefetch" href="/assets/js/516.2a75898b.js"><link rel="prefetch" href="/assets/js/517.0734d077.js"><link rel="prefetch" href="/assets/js/518.a0affa56.js"><link rel="prefetch" href="/assets/js/519.3b143230.js"><link rel="prefetch" href="/assets/js/52.08471186.js"><link rel="prefetch" href="/assets/js/520.98088423.js"><link rel="prefetch" href="/assets/js/521.09d6f9e3.js"><link rel="prefetch" href="/assets/js/522.0a7f1cfd.js"><link rel="prefetch" href="/assets/js/523.460a682d.js"><link rel="prefetch" href="/assets/js/53.81c949e4.js"><link rel="prefetch" href="/assets/js/54.23834020.js"><link rel="prefetch" href="/assets/js/55.98bddbab.js"><link rel="prefetch" href="/assets/js/56.f33c89be.js"><link rel="prefetch" href="/assets/js/57.974b4102.js"><link rel="prefetch" href="/assets/js/58.e357e1b7.js"><link rel="prefetch" href="/assets/js/59.1cf2f460.js"><link rel="prefetch" href="/assets/js/6.d37d398a.js"><link rel="prefetch" href="/assets/js/60.bccde908.js"><link rel="prefetch" href="/assets/js/61.33679650.js"><link rel="prefetch" href="/assets/js/62.fe42a718.js"><link rel="prefetch" href="/assets/js/63.910cc28d.js"><link rel="prefetch" href="/assets/js/64.3a046b10.js"><link rel="prefetch" href="/assets/js/65.6bc58366.js"><link rel="prefetch" href="/assets/js/66.29ed3089.js"><link rel="prefetch" href="/assets/js/67.3a4a22d1.js"><link rel="prefetch" href="/assets/js/68.05fa411c.js"><link rel="prefetch" href="/assets/js/69.44dfc2db.js"><link rel="prefetch" href="/assets/js/7.8c733af6.js"><link rel="prefetch" href="/assets/js/70.059cdd51.js"><link rel="prefetch" href="/assets/js/71.d58561d2.js"><link rel="prefetch" href="/assets/js/72.056ba678.js"><link rel="prefetch" href="/assets/js/73.25916778.js"><link rel="prefetch" href="/assets/js/74.1f1823dc.js"><link rel="prefetch" href="/assets/js/75.2f5b0b73.js"><link rel="prefetch" href="/assets/js/76.06e76fe6.js"><link rel="prefetch" href="/assets/js/77.206d48bf.js"><link rel="prefetch" href="/assets/js/78.2f07e42d.js"><link rel="prefetch" href="/assets/js/79.994c527d.js"><link rel="prefetch" href="/assets/js/80.82c6c4f9.js"><link rel="prefetch" href="/assets/js/81.83bd28d9.js"><link rel="prefetch" href="/assets/js/82.7fbb77e1.js"><link rel="prefetch" href="/assets/js/83.e5773686.js"><link rel="prefetch" href="/assets/js/84.13db35cf.js"><link rel="prefetch" href="/assets/js/85.e6a2aa9d.js"><link rel="prefetch" href="/assets/js/86.715ac425.js"><link rel="prefetch" href="/assets/js/87.10b54644.js"><link rel="prefetch" href="/assets/js/88.477faa20.js"><link rel="prefetch" href="/assets/js/89.a562feda.js"><link rel="prefetch" href="/assets/js/9.635384b9.js"><link rel="prefetch" href="/assets/js/90.c7874d64.js"><link rel="prefetch" href="/assets/js/91.e61cbe07.js"><link rel="prefetch" href="/assets/js/92.45b11d5e.js"><link rel="prefetch" href="/assets/js/93.f587deb4.js"><link rel="prefetch" href="/assets/js/94.19940b43.js"><link rel="prefetch" href="/assets/js/95.d9763768.js"><link rel="prefetch" href="/assets/js/96.3ed0322b.js"><link rel="prefetch" href="/assets/js/97.d368e630.js"><link rel="prefetch" href="/assets/js/98.8b86b8af.js"><link rel="prefetch" href="/assets/js/99.53eb946a.js"><link rel="prefetch" href="/assets/js/vendors~docsearch.262891fb.js">
<link rel="stylesheet" href="/assets/css/0.styles.679f71b6.css">
</head>
<body>
<div id="app" data-server-rendered="true"><div class="theme-container"><header class="navbar"><div class="sidebar-button"><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" role="img" viewBox="0 0 448 512" class="icon"><path fill="currentColor" d="M436 124H12c-6.627 0-12-5.373-12-12V80c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12z"></path></svg></div> <a href="/" class="home-link router-link-active"><img src="/img/logo.png" alt=" " class="logo"></a> <div class="links"><div class="search-box"><input aria-label="Search" autocomplete="off" spellcheck="false" value=""> <!----></div> <nav class="nav-links can-hide"><div class="nav-item"><div class="dropdown-wrapper"><a class="dropdown-title"><span class="title">Document</span> <span class="arrow right"></span></a> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="/UserGuide/Master/Get Started/QuickStart.html" class="nav-link">In progress</a></li><li class="dropdown-item"><!----> <a href="/UserGuide/V0.11.x/Get Started/QuickStart.html" class="nav-link">V0.11.x</a></li><li class="dropdown-item"><!----> <a href="/UserGuide/V0.10.x/Get Started/QuickStart.html" class="nav-link">V0.10.x</a></li><li class="dropdown-item"><!----> <a href="/UserGuide/V0.9.x/0-Get Started/1-QuickStart.html" class="nav-link">V0.9.x</a></li><li class="dropdown-item"><!----> <a href="/UserGuide/V0.8.x/0-Get Started/1-QuickStart.html" class="nav-link">V0.8.x</a></li></ul></div></div><div class="nav-item"><a href="/SystemDesign/Architecture/Architecture.html" class="nav-link">System design</a></div><div class="nav-item"><a href="/Download/" class="nav-link">Download</a></div><div class="nav-item"><div class="dropdown-wrapper"><a class="dropdown-title"><span class="title">Community</span> <span class="arrow right"></span></a> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="https://cwiki.apache.org/confluence/display/iotdb" class="nav-link external">
Wiki
<!----></a></li><li class="dropdown-item"><!----> <a href="/Community/Community-Project Committers.html" class="nav-link">People</a></li><li class="dropdown-item"><!----> <a href="/Community/Community-Powered By.html" class="nav-link">Powered By</a></li><li class="dropdown-item"><!----> <a href="/Community/Materials.html" class="nav-link">Resources</a></li><li class="dropdown-item"><!----> <a href="/Community/Feedback.html" class="nav-link">Feedback</a></li></ul></div></div><div class="nav-item"><div class="dropdown-wrapper"><a class="dropdown-title"><span class="title">Development</span> <span class="arrow right"></span></a> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="/Development/VoteRelease.html" class="nav-link">How to vote</a></li><li class="dropdown-item"><!----> <a href="/Development/HowToCommit.html" class="nav-link">How to Commit</a></li><li class="dropdown-item"><!----> <a href="/Development/Committer.html" class="nav-link">Become a Committer</a></li><li class="dropdown-item"><!----> <a href="/Development/ContributeGuide.html" class="nav-link">ContributeGuide</a></li><li class="dropdown-item"><!----> <a href="/Development/format-changelist.html" class="nav-link">Changelist of TsFile</a></li><li class="dropdown-item"><!----> <a href="/Development/rpc-changelist.html" class="nav-link">Changelist of RPC</a></li></ul></div></div><div class="nav-item"><div class="dropdown-wrapper"><a class="dropdown-title"><span class="title">Blog</span> <span class="arrow right"></span></a> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="/Blog/Index.html" class="nav-link">Overview</a></li><li class="dropdown-item"><!----> <a href="/Blog/Release0_93.html" class="nav-link">Some Notes on Release 0.9.3 and upcoming 0.10.0</a></li></ul></div></div><div class="nav-item"><div class="dropdown-wrapper"><a class="dropdown-title"><span class="title">ASF</span> <span class="arrow right"></span></a> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="http://www.apache.org/" class="nav-link external">
Foundation
<!----></a></li><li class="dropdown-item"><!----> <a href="http://www.apache.org/licenses/" class="nav-link external">
License
<!----></a></li><li class="dropdown-item"><!----> <a href="http://www.apache.org/security/" class="nav-link external">
Security
<!----></a></li><li class="dropdown-item"><!----> <a href="http://www.apache.org/foundation/sponsorship.html" class="nav-link external">
Sponsorship
<!----></a></li><li class="dropdown-item"><!----> <a href="http://www.apache.org/foundation/thanks.html" class="nav-link external">
Thanks
<!----></a></li><li class="dropdown-item"><!----> <a href="http://www.apache.org/events/current-event" class="nav-link external">
Current Events
<!----></a></li></ul></div></div><div class="nav-item"><div class="dropdown-wrapper"><a class="dropdown-title"><span class="title">Languages</span> <span class="arrow right"></span></a> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="/SystemDesign/TsFile/Read.html" aria-current="page" class="nav-link router-link-exact-active router-link-active">English</a></li><li class="dropdown-item"><!----> <a href="/zh/SystemDesign/TsFile/Read.html" class="nav-link">简体中文</a></li></ul></div></div> <a href="https://github.com/apache/iotdb.git" target="_blank" rel="noopener noreferrer" class="repo-link">
gitHub
<span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a></nav></div></header> <div class="sidebar-mask"></div> <aside class="sidebar"><nav class="nav-links"><div class="nav-item"><div class="dropdown-wrapper"><a class="dropdown-title"><span class="title">Document</span> <span class="arrow right"></span></a> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="/UserGuide/Master/Get Started/QuickStart.html" class="nav-link">In progress</a></li><li class="dropdown-item"><!----> <a href="/UserGuide/V0.11.x/Get Started/QuickStart.html" class="nav-link">V0.11.x</a></li><li class="dropdown-item"><!----> <a href="/UserGuide/V0.10.x/Get Started/QuickStart.html" class="nav-link">V0.10.x</a></li><li class="dropdown-item"><!----> <a href="/UserGuide/V0.9.x/0-Get Started/1-QuickStart.html" class="nav-link">V0.9.x</a></li><li class="dropdown-item"><!----> <a href="/UserGuide/V0.8.x/0-Get Started/1-QuickStart.html" class="nav-link">V0.8.x</a></li></ul></div></div><div class="nav-item"><a href="/SystemDesign/Architecture/Architecture.html" class="nav-link">System design</a></div><div class="nav-item"><a href="/Download/" class="nav-link">Download</a></div><div class="nav-item"><div class="dropdown-wrapper"><a class="dropdown-title"><span class="title">Community</span> <span class="arrow right"></span></a> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="https://cwiki.apache.org/confluence/display/iotdb" class="nav-link external">
Wiki
<!----></a></li><li class="dropdown-item"><!----> <a href="/Community/Community-Project Committers.html" class="nav-link">People</a></li><li class="dropdown-item"><!----> <a href="/Community/Community-Powered By.html" class="nav-link">Powered By</a></li><li class="dropdown-item"><!----> <a href="/Community/Materials.html" class="nav-link">Resources</a></li><li class="dropdown-item"><!----> <a href="/Community/Feedback.html" class="nav-link">Feedback</a></li></ul></div></div><div class="nav-item"><div class="dropdown-wrapper"><a class="dropdown-title"><span class="title">Development</span> <span class="arrow right"></span></a> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="/Development/VoteRelease.html" class="nav-link">How to vote</a></li><li class="dropdown-item"><!----> <a href="/Development/HowToCommit.html" class="nav-link">How to Commit</a></li><li class="dropdown-item"><!----> <a href="/Development/Committer.html" class="nav-link">Become a Committer</a></li><li class="dropdown-item"><!----> <a href="/Development/ContributeGuide.html" class="nav-link">ContributeGuide</a></li><li class="dropdown-item"><!----> <a href="/Development/format-changelist.html" class="nav-link">Changelist of TsFile</a></li><li class="dropdown-item"><!----> <a href="/Development/rpc-changelist.html" class="nav-link">Changelist of RPC</a></li></ul></div></div><div class="nav-item"><div class="dropdown-wrapper"><a class="dropdown-title"><span class="title">Blog</span> <span class="arrow right"></span></a> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="/Blog/Index.html" class="nav-link">Overview</a></li><li class="dropdown-item"><!----> <a href="/Blog/Release0_93.html" class="nav-link">Some Notes on Release 0.9.3 and upcoming 0.10.0</a></li></ul></div></div><div class="nav-item"><div class="dropdown-wrapper"><a class="dropdown-title"><span class="title">ASF</span> <span class="arrow right"></span></a> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="http://www.apache.org/" class="nav-link external">
Foundation
<!----></a></li><li class="dropdown-item"><!----> <a href="http://www.apache.org/licenses/" class="nav-link external">
License
<!----></a></li><li class="dropdown-item"><!----> <a href="http://www.apache.org/security/" class="nav-link external">
Security
<!----></a></li><li class="dropdown-item"><!----> <a href="http://www.apache.org/foundation/sponsorship.html" class="nav-link external">
Sponsorship
<!----></a></li><li class="dropdown-item"><!----> <a href="http://www.apache.org/foundation/thanks.html" class="nav-link external">
Thanks
<!----></a></li><li class="dropdown-item"><!----> <a href="http://www.apache.org/events/current-event" class="nav-link external">
Current Events
<!----></a></li></ul></div></div><div class="nav-item"><div class="dropdown-wrapper"><a class="dropdown-title"><span class="title">Languages</span> <span class="arrow right"></span></a> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="/SystemDesign/TsFile/Read.html" aria-current="page" class="nav-link router-link-exact-active router-link-active">English</a></li><li class="dropdown-item"><!----> <a href="/zh/SystemDesign/TsFile/Read.html" class="nav-link">简体中文</a></li></ul></div></div> <a href="https://github.com/apache/iotdb.git" target="_blank" rel="noopener noreferrer" class="repo-link">
gitHub
<span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a></nav> <ul class="sidebar-links"><li><section class="sidebar-group depth-0"><p class="sidebar-heading"><span>System design</span> <!----></p> <!----></section></li><li><section class="sidebar-group collapsable depth-0"><p class="sidebar-heading"><span>Architecture</span> <span class="arrow right"></span></p> <!----></section></li><li><section class="sidebar-group collapsable depth-0"><p class="sidebar-heading open"><span>TsFile</span> <span class="arrow down"></span></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/SystemDesign/TsFile/TsFile.html" class="sidebar-link">TsFile</a></li><li><a href="/SystemDesign/TsFile/Format.html" class="sidebar-link">Format</a></li><li><a href="/SystemDesign/TsFile/Write.html" class="sidebar-link">Write</a></li><li><a href="/SystemDesign/TsFile/Read.html" aria-current="page" class="active sidebar-link">Read</a></li></ul></section></li><li><section class="sidebar-group collapsable depth-0"><p class="sidebar-heading"><span>QueryEngine</span> <span class="arrow right"></span></p> <!----></section></li><li><section class="sidebar-group collapsable depth-0"><p class="sidebar-heading"><span>SchemaManager</span> <span class="arrow right"></span></p> <!----></section></li><li><section class="sidebar-group collapsable depth-0"><p class="sidebar-heading"><span>StorageEngine</span> <span class="arrow right"></span></p> <!----></section></li><li><section class="sidebar-group collapsable depth-0"><p class="sidebar-heading"><span>DataQuery</span> <span class="arrow right"></span></p> <!----></section></li><li><section class="sidebar-group collapsable depth-0"><p class="sidebar-heading"><span>Tools</span> <span class="arrow right"></span></p> <!----></section></li><li><section class="sidebar-group collapsable depth-0"><p class="sidebar-heading"><span>Connector</span> <span class="arrow right"></span></p> <!----></section></li><li><section class="sidebar-group collapsable depth-0"><p class="sidebar-heading"><span>Client</span> <span class="arrow right"></span></p> <!----></section></li></ul> </aside> <main class="page"> <div class="content content__default"><h1 id="tsfile-read-process"><a href="#tsfile-read-process" class="header-anchor">#</a> TsFile Read Process</h1> <p>This chapter introduces how to read TsFile. The content is mainly divided into two parts, the introduction of Filters and Expressions , and the detailed illustration of query process in TsFile.</p> <ul><li><a href="#TsFile-Read-Process">TsFile Read Process</a> <ul><li><a href="#1-Filters-and-Expressions">1 Filters and Expressions</a> <ul><li><a href="#11-Filter">1.1 Filter</a></li> <li><a href="#12-Expression">1.2 Expression</a> <ul><li><a href="#121-SingleSeriesExpression">1.2.1 SingleSeriesExpression</a></li> <li><a href="#122-GlobalTimeExpression">1.2.2 GlobalTimeExpression</a></li> <li><a href="#123-IExpression">1.2.3 IExpression</a></li> <li><a href="#124-Executable-Expression">1.2.4 Executable Expression</a></li> <li><a href="#125-The-Algorithm-Transforming-IExpression-to-an-Executable-Expression">1.2.5 The Algorithm Transforming IExpression to an Executable Expression</a></li></ul></li></ul></li> <li><a href="#2-Query-Execution-of-TsFile">2 Query Execution of TsFile</a> <ul><li><a href="#21-Design">2.1 Design</a></li> <li><a href="#22-Three-Components">2.2 Three Components</a> <ul><li><a href="#221-FileSeriesReader">2.2.1 FileSeriesReader</a></li> <li><a href="#222-FileSeriesReaderByTimestamp">2.2.2 FileSeriesReaderByTimestamp</a></li> <li><a href="#223-TimeGeneratorImpl">2.2.3 TimeGeneratorImpl</a></li></ul></li> <li><a href="#23-Merge-Query">2.3 Merge Query</a></li> <li><a href="#24-Join-Query">2.4 Join Query</a></li> <li><a href="#25-Query-of-TsFile">2.5 Query of TsFile</a></li> <li><a href="#26-Related-Concepts">2.6 Related Concepts</a></li></ul></li></ul></li></ul> <h2 id="_1-filters-and-expressions"><a href="#_1-filters-and-expressions" class="header-anchor">#</a> 1 Filters and Expressions</h2> <h3 id="_1-1-filter"><a href="#_1-1-filter" class="header-anchor">#</a> 1.1 Filter</h3> <p>In this document, the term Filter means filter conditions. Users can customize filter conditions on timestamp, or the value of time series. We distinguish the filters which are on timestamp from those on column values. Assume t to be a timestamp constant, there are 12 basic types of Filters. In implementation, they all inherit from the super class Filter.</p> <table><thead><tr><th>Filter</th> <th>Filter Type</th> <th>Explanation</th> <th>Examples</th></tr></thead> <tbody><tr><td>TimeEq</td> <td>time filter</td> <td>timestamp = some value</td> <td>TimeEq(t) means timestamp should be equal to t</td></tr> <tr><td>TimeGt</td> <td>time filter</td> <td>timestamp &gt; some value</td> <td>TimeGt(t) means timestamp should be greater than t</td></tr> <tr><td>TimeGtEq</td> <td>time filter</td> <td>timestamp &gt;= some value</td> <td>TimeGtEq(t) means timestamp greater than or equal to t</td></tr> <tr><td>TimeLt</td> <td>time filter</td> <td>timestamp &lt; some value</td> <td>TimeLt(t) means timestamp should be less than t</td></tr> <tr><td>TimeLtEq</td> <td>time filter</td> <td>timestamp &lt;= some value</td> <td>TimeLtEq(t) means timestamp should be less than or equal to t</td></tr> <tr><td>TimeNotEq</td> <td>time filter</td> <td>timestamp != some value</td> <td>TimeNotEq(t) means timestamp should not be equal to t</td></tr> <tr><td>ValueEq</td> <td>value filter</td> <td>value on this column = some value</td> <td>ValueEq(2147483649) means value on this column should be equal to 2147483649</td></tr> <tr><td>ValueGt</td> <td>value filter</td> <td>value on this column &gt; some value</td> <td>ValueGt(100.5) means value on this column should be greater than 100.5</td></tr> <tr><td>ValueGtEq</td> <td>value filter</td> <td>value on this column &gt;= some value</td> <td>ValueGtEq(2) means value on this column should be greanter than 2</td></tr> <tr><td>ValueLt</td> <td>value filter</td> <td>value on this column &lt; some value</td> <td>ValueLt(&quot;string&quot;) means value on this column should be less than &quot;string&quot; in alphabet order</td></tr> <tr><td>ValueLtEq</td> <td>value filter</td> <td>value on this column &lt;= some value</td> <td>ValueLtEq(-100) means value on this column shold be less than or equal to -100</td></tr> <tr><td>ValueNotEq</td> <td>value filter</td> <td>value on this column != some value</td> <td>ValueNotEq(true) means value on this column should not be true</td></tr></tbody></table> <p>Filter can be composed of one or two Filter children。If a Filter is composed of a single Filter, it is also termed as UnaryFilter.If it contains two filters, it is termed as BinaryFilter. In this case, the two filters are connected with a logical relation, AND or OR, where the formar is termed as AndFilter, and the latter is OrFilter. Obviously, both AndFilter and OrFilter are BinaryFilter.</p> <p>We give some examples of AndFilter and OrFilter, where &quot;&amp;&amp;&quot; indicates relation AND and &quot;||&quot; indicates relation OR.</p> <ol><li>AndFilter(TimeGt(100), TimeLt(200)) means &quot;timestamp &gt; 100 &amp;&amp; timestamp &lt; 200&quot;</li> <li>AndFilter (TimeGt(100), ValueGt(0.5)) means &quot;timestamp &gt; 100 &amp;&amp; value &gt; 0.5&quot;</li> <li>AndFilter (AndFilter (TimeGt(100), TimeLt(200)), ValueGt(0.5)) means &quot;(timestamp &gt; 100 &amp;&amp; timestamp &lt; 200) &amp;&amp; value &gt; 0.5&quot;</li> <li>OrFilter(TimeGt(100), ValueGt(0.5)) means &quot;timestamp &gt; 100 || value &gt; 0.5&quot;</li> <li>OrFilter (AndFilter(TimeGt(100), TimeLt(200)), ValueGt(0.5)) means &quot;(timestamp &gt; 100 &amp;&amp; timestamp &lt; 200) || value &gt; 0.5&quot;</li></ol> <p>The formal definition of &quot;Filter&quot;, &quot;AndFilter&quot; and &quot;OrFilter&quot; are shown below:</p> <div class="language- extra-class"><pre><code>Filter := Basic Filter | AndFilter | OrFilter
AndFilter := Filter &amp;&amp; Filter
OrFilter := Filter &amp;&amp; Filter
</code></pre></div><p>For simplicity, we symbolize Basic Filter, AndFilter and OrFilter. Note that t is a variable of type INT64, v is a variable whose type can be BOOLEAN, INT32, INT64, FLOAT, DOUBLE or BINARY。</p> <table><thead><tr><th>Name</th> <th>symbol</th> <th>Examples</th></tr></thead> <tbody><tr><td>TimeEq</td> <td>time == t</td> <td>time == 14152176545 means timestamp should be equal to 14152176545</td></tr> <tr><td>TimeGt</td> <td>time &gt; t</td> <td>time &gt; 14152176545 means timestamp should be greater than 14152176545</td></tr> <tr><td>TimeGtEq</td> <td>time &gt;= t</td> <td>time &gt;= 14152176545 means timestamp should be greater than or equal to 14152176545</td></tr> <tr><td>TimeLt</td> <td>time &lt; t</td> <td>time &lt; 14152176545 means timestamp should be less than 14152176545</td></tr> <tr><td>TimeLtEq</td> <td>time &lt;= t</td> <td>time &lt;= 14152176545 means timestamp should be less than or equal to 14152176545</td></tr> <tr><td>TimeNotEq</td> <td>time != t</td> <td>time != 14152176545 means timestamp</td></tr></tbody></table> <p>should be equal to 14152176545
ValueEq| value == v| value == 10 means value should be equal to 10
ValueGt| value &gt; v| value &gt; 100.5 means value should be greater than 100.5
ValueGtEq| value &gt;= v| value &gt;= 2 means value should be greater than or equal to 2
ValueLt| value &lt; v| value &lt; &quot;string&quot; means value should be less than &quot;string&quot; in alphabet order
ValueLtEq| value &lt;= v| value &lt;= -100 means value should be less than or equal to -100
ValueNotEq| value != v| value != true means value should not be true
AndFilter| &lt;Filter&gt; &amp;&amp; &lt;Filter&gt;| 1. value &gt; 100 &amp;&amp; value &lt; 200 means value should be greanter than 100 and less than 200; <br>2. (value &gt;= 100 &amp;&amp; value &lt;= 200) &amp;&amp; time &gt; 14152176545 means &quot;value should be greater than or equal to 100 and value should be less than or equal to&quot; and &quot;timestamp should be greater than 14152176545&quot;
OrFilter| &lt;Filter&gt; || &lt;Filter&gt;| 1. value &gt; 100 || time &gt; 14152176545, means value should be greater than 100 or timestamp should be greater than 14152176545;<br>2. (value &gt; 100 &amp;&amp; value &lt; 200)|| time &gt; 14152176545, means &quot;value should be greater than 100 and value should be less than 200&quot; or &quot;timestamp should be greater than 14152176545&quot;</p> <h3 id="_1-2-expression"><a href="#_1-2-expression" class="header-anchor">#</a> 1.2 Expression</h3> <p>When we assign a particular time series (including the timestamp) to a Filter, it becomes an expression. For example, &quot;value &gt; 10&quot; can only describe a Filter, without the taste of a query. However, &quot;the value of time series 'd1.s1' should be greater than 10&quot; is an expression. Specifically, if the Filter only works on timestamp, it can be seen as an expression, which is called GlobalTimeExpression. The following sections introduces Expression in detail,</p> <h4 id="_1-2-1-singleseriesexpression"><a href="#_1-2-1-singleseriesexpression" class="header-anchor">#</a> 1.2.1 SingleSeriesExpression</h4> <p>SingleSeriesExpression is an expression on a time series (excluding the timestamp column) with a Filter. A SingleSeriesExpression contains a Path and a Filter. The Path is the path of the time series, and the Filter indicate the filter condition, as is introduced in section 1.1.</p> <p>The structure of SingleSeriesExpression is shown below:</p> <div class="language- extra-class"><pre><code>SingleSeriesExpression
Path: the path of the time series in the given SingleSeriesExpression
Filter: filter condition
</code></pre></div><p>When querying, a SingleSeriesExpression claims that the data point in the time series should satisfy the constraints in the Filter.</p> <p>Examples of SingleSeriesExpression are shown below.</p> <p>Example 1.</p> <div class="language- extra-class"><pre><code>SingleSeriesExpression
Path: &quot;d1.s1&quot;
Filter: AndFilter(ValueGt(100), ValueLt(200))
</code></pre></div><p>The SingleSeriesExpression claims that time series &quot;d1.s1&quot; should satisfy that &quot;value should be greater than 100 and less than 200&quot;。</p> <p>We formalize the rule as SingleSeriesExpression(&quot;d1.s1&quot;, value &gt; 100 &amp;&amp; value &lt; 200)</p> <hr> <p>Example 2.</p> <div class="language- extra-class"><pre><code>SingleSeriesExpression
Path: &quot;d1.s1&quot;
Filter: AndFilter(AndFilter(ValueGt(100), ValueLt(200)), TimeGt(14152176545))
</code></pre></div><p>The SingleSeriesExpression claims that time series &quot;d1.s1&quot; should satisfy that &quot;value should be greater than 100 and less than 200 and timestamp should be greater than 14152176545&quot;。</p> <p>We formalize the rule as SingleSeriesExpression(&quot;d1.s1&quot;, (value &gt; 100 &amp;&amp; value &lt; 200) &amp;&amp; time &gt; 14152176545)</p> <h4 id="_1-2-2-globaltimeexpression"><a href="#_1-2-2-globaltimeexpression" class="header-anchor">#</a> 1.2.2 GlobalTimeExpression</h4> <p>GlobalTimeExpression means a global time filter. A GlobalTimeExpression contains a Filter, which is only composed of time filters (value filters not allowed). When querying, a GlobalTimeExpression claims that data points of all selected time series should satisfy the constraints in the Filter. The structure of GlobalTimeExpression is shown below:</p> <div class="language- extra-class"><pre><code>GlobalTimeExpression
Filter: a filter which only contains time filters。
The formalized definition of Filter here is:
Filter := TimeFilter | AndExpression | OrExpression
AndExpression := Filter &amp;&amp; Filter
OrExpression := Filter &amp;&amp; Filter
</code></pre></div><p>Some formalized examples of GlobalTimeExpression are shown below:</p> <ol><li>GlobalTimeExpression(time &gt; 14152176545 &amp;&amp; time &lt; 14152176645) claims that the all selected time series should satisfy that the timestamp should be &quot;greater than 14152176545 and less than 14152176645&quot;</li> <li>GlobalTimeExpression((time &gt; 100 &amp;&amp; time &lt; 200) || (time &gt; 400 &amp;&amp; time &lt; 500)) claims that all selected time series should satisfy that the timestamp should be &quot;greater than 100 and less than 200&quot; or &quot;greater than 400 and less than 500&quot;</li></ol> <h4 id="_1-2-3-iexpression"><a href="#_1-2-3-iexpression" class="header-anchor">#</a> 1.2.3 IExpression</h4> <p>IExpression indicates the all filters with the corresponding columns in a query.
An IExpression can be a SingleSeriesExpression or a GlobalTimeExpression. In this case, the IExpression is a UnaryExpression. An IExpression can also contains two IExpressions, connected with relation AND or OR. Two IExpressions joined with AND relation is termed as AndExpression. Likewise, two IExpressions joined with OR relation is termed as OrExpression. An IExpression containing two children is termed BinaryExpression. UnaryExpression and BinaryExpression are both IExpression.</p> <p>The formalized definition of IExpression is shown below:</p> <div class="language- extra-class"><pre><code>IExpression := SingleSeriesExpression | GlobalTimeExpression | AndExpression | OrExpression
AndExpression := IExpression &amp;&amp; IExpression
OrExpression := IExpression || IExpression
</code></pre></div><p>We use a tree-like structure to formalize an IExpression. Here are some examples.</p> <ol><li><p>An IExpression only contains a SingleSeriesExpression:</p> <div class="language- extra-class"><pre><code> IExpression(SingleSeriesExpression(&quot;d1.s1&quot;, value &gt; 100 &amp;&amp; value &lt; 200))
</code></pre></div></li> <li><p>An IExpression only contains a GlobalTimeExpression:</p> <div class="language- extra-class"><pre><code> IExpression(GlobalTimeExpression (time &gt; 14152176545 &amp;&amp; time &lt; 14152176645))
</code></pre></div></li> <li><p>An IExpression contains multiple SingleSeriesExpressions:</p> <div class="language- extra-class"><pre><code> IExpression(
AndExpression
SingleSeriesExpression(&quot;d1.s1&quot;, (value &gt; 100 &amp;&amp; value &lt; 200) || time &gt; 14152176645)
SingleSeriesExpression(&quot;d1.s2&quot;, value &gt; 0.5 &amp;&amp; value &lt; 1.5)
)
</code></pre></div><p><strong>Note</strong>: The IExpression is an AndExpression, where the time series &quot;d1.s1&quot; and &quot;d1.s2&quot; should satisfy the constraints in the Filter.</p></li> <li><p>An IExpression contains both SingleSeriesExpressions and GlobalTimeExpressions</p> <div class="language- extra-class"><pre><code> IExpression(
AndExpression
AndExpression
SingleSeriesExpression(&quot;d1.s1&quot;, (value &gt; 100 &amp;&amp; value &lt; 200) || time &gt; 14152176645)
SingleSeriesExpression(&quot;d1.s2&quot;, value &gt; 0.5 &amp;&amp; value &lt; 1.5)
GlobalTimeExpression(time &gt; 14152176545 &amp;&amp; time &lt; 14152176645)
)
</code></pre></div><p><strong>Note</strong>: The IExpression is an AndExpression, where the time series &quot;d1.s1&quot; and &quot;d1.s2&quot; should not only satisfy the constraints in corresponding Filters in SingleSeriesExpression, but also the constraints of the GlobalTimeExpression.</p></li></ol> <h4 id="_1-2-4-executable-expression"><a href="#_1-2-4-executable-expression" class="header-anchor">#</a> 1.2.4 Executable Expression</h4> <p>To make the query execution more comprehensible, we give the concept of executable expression. An executable expression is a particular kinds of IExpression. The IExpression customized by system user can be transformed to an executable expression by some algorithm, which will be introduced in the following sections. An executable expression is an IExpression satisfying one of the following constraints:</p> <ol><li>The IExpression is a single GlobalTimeExpression</li> <li>The IExpression is a single SingleSeriesExpression</li> <li>The IExpression is an AndExpression, whose leaf nodes are SingleSeriesExpressions</li> <li>The IExpression is an OrExpression, whose leaf nodes are SingleSeriesExpressions</li></ol> <p>The formalized definition of an executable expression is shown below:</p> <div class="language- extra-class"><pre><code>executable expression := SingleSeriesExpression| GlobalTimeExpression | AndExpression | OrExpression
AndExpression := &lt; ExpressionUNIT &gt; &amp;&amp; &lt; ExpressionUNIT &gt;
OrExpression := &lt; ExpressionUNIT &gt; || &lt; ExpressionUNIT &gt;
ExpressionUNIT := SingleSeriesExpression | AndExpression | OrExpression
</code></pre></div><p>Some examples of executable expression and non-executable expression are show below:</p> <p>Example 1:</p> <div class="language- extra-class"><pre><code>IExpression(SingleSeriesExpression(&quot;d1.s1&quot;, value &gt; 100 &amp;&amp; value &lt; 200))
</code></pre></div><p>Is an executable expression? Yes</p> <p><strong>Hint</strong>: The IExpression is a single SingleSeriesExpression, satisfying constraint 1</p> <hr> <p>Example 2:</p> <div class="language- extra-class"><pre><code>IExpression(GlobalTimeExpression (time &gt; 14152176545 &amp;&amp; time &lt; 14152176645))
</code></pre></div><p>Is an executable expression? Yes</p> <p><strong>Hint</strong>: The IExpression is a single GlobalTimeExpression, satisfying constraint 2</p> <hr> <p>Example 3:</p> <div class="language- extra-class"><pre><code>IExpression(
AndExpression
GlobalTimeExpression (time &gt; 14152176545)
GlobalTimeExpression (time &lt; 14152176645)
)
</code></pre></div><p>Is an executable expression? No</p> <p><strong>Hint</strong>: The IExpression is an AndExpression, but it contains GlobalTimeExpressions, which is against constraint 3</p> <hr> <p>Example 4:</p> <div class="language- extra-class"><pre><code>IExpression(
OrExpression
AndExpression
SingleSeriesExpression(&quot;d1.s1&quot;, (value &gt; 100 &amp;&amp; value &lt; 200) || time &gt; 14152176645)
SingleSeriesExpression(&quot;d1.s2&quot;, value &gt; 0.5 &amp;&amp; value &lt; 1.5)
SingleSeriesExpression(&quot;d1.s3&quot;, value &gt; &quot;test&quot; &amp;&amp; value &lt; &quot;test100&quot;)
)
</code></pre></div><p>Is an executable expression? Yes</p> <p><strong>Hint</strong>: The IExpression is an OrExpression, whose leaf nodes are all SingleSeriesExpressions, which satisfies constraints 4.</p> <hr> <p>Example 5:</p> <div class="language- extra-class"><pre><code>IExpression(
AndExpression
AndExpression
SingleSeriesExpression(&quot;d1.s1&quot;, (value &gt; 100 &amp;&amp; value &lt; 200) || time &gt; 14152176645)
SingleSeriesExpression(&quot;d1.s2&quot;, value &gt; 0.5 &amp;&amp; value &lt; 1.5)
GlobalTimeExpression(time &gt; 14152176545 &amp;&amp; time &lt; 14152176645)
)
</code></pre></div><p>Is an executable expression? No</p> <p><strong>Hint</strong>: The IExpression is an AndExpression, but one of the leaf nodes is a GlobalTimeExpression, which is against constraint 3.</p> <h4 id="_1-2-5-the-algorithm-transforming-iexpression-to-an-executable-expression"><a href="#_1-2-5-the-algorithm-transforming-iexpression-to-an-executable-expression" class="header-anchor">#</a> 1.2.5 The Algorithm Transforming IExpression to an Executable Expression</h4> <p>In this section, we introduce how to transform an IExpression to be executable.</p> <p>If an IExpression is not executable, it is either an AndExpression, or an OrExpression. Moreover, it contains both GlobalTimeExpressions and SingleSeriesExpressions. According to the definition in the preceding sections, an AndExpression or OrExpression is composed of two IExpressions, that</p> <div class="language- extra-class"><pre><code>AndExpression := &lt;IExpression&gt; AND &lt;IExpression&gt;
OrExpression := &lt;IExpression&gt; OR &lt;IExpression&gt;
</code></pre></div><p>We denote the left child and right child as LeftIExpression and RightIExpression, so that</p> <div class="language- extra-class"><pre><code>AndExpression := &lt;LeftIExpression&gt; AND &lt;RightIExpression&gt;
OrExpression := &lt;LeftIExpression&gt; OR &lt;RightIExpression&gt;
</code></pre></div><p>The declaration of the method is shown below.</p> <div class="language- extra-class"><pre><code>IExpression optimize (IExpression expression, List&lt;Path&gt; selectedSeries)
Input: The IExpression to be transformed, and the projected time series
Output: The transformed IExpression, which is executable
</code></pre></div><p>Before the introducing the optimize() method in detail, we first show how to combine two expressions or filters, which is very useful in the optimize() method.</p> <ul><li><p>combineTwoGlobalTimeExpression combines two GlobalTimeExpressions to be a single GlobalTimeExpression。</p> <p>This method receives three inputs. The declaration of the method is:</p> <div class="language- extra-class"><pre><code> GlobalTimeExpression combineTwoGlobalTimeExpression(
GlobalTimeExpression leftGlobalTimeExpression,
GlobalTimeExpression rightGlobalTimeExpression,
ExpressionType type)
Input 1: leftGlobalTimeExpression
Input 2: rightGlobalTimeExpression
Input 3: type, the relation of the two expressions, which is either &quot;AND&quot; or &quot;OR&quot;
Output: GlobalTimeExpression, which is the merged expression
</code></pre></div><p>The method contains two steps:</p> <ol><li>Denote the Filter in leftGlobalTimeExpression as filter1, in rightGlobalTimeExpression as filter2. It first merges filter1 and filter2 to be a new Filter, denoted as filter3. The method of merging two filters is shown in MergeFilter in the following section.</li> <li>Generate a new GlobalTimeExpression, and assign filter3 to be its Filter. This new GlobalTimeExpression is the result.</li></ol> <p>An example of combining two GlobalTimeExpressions is shown below.</p> <p>The three inputs are:</p> <div class="language- extra-class"><pre><code> leftGlobalTimeExpression: GlobalTimeExpression(Filter: time &gt; 100 &amp;&amp; time &lt; 200)
rightGlobalTimeExpression: GlobalTimeExpression(Filter: time &gt; 300 &amp;&amp; time &lt; 400)
type: OR
</code></pre></div><p>than, the merged expression is</p> <div class="language- extra-class"><pre><code> GlobalTimeExpression(Filter: (time &gt; 100 &amp;&amp; time &lt; 200) || (time &gt; 300 &amp;&amp; time &lt; 400))
</code></pre></div></li> <li><p>MergeFilter merges two Filters. This method receives three inputs:</p> <div class="language- extra-class"><pre><code> Filter1: The first Filter to merge
Filter2: The second Filter to merge
Relation: The relation between the two Filters (either AND or OR)
</code></pre></div><p>than, the execution strategy of this method is</p> <div class="language- extra-class"><pre><code> if relation == AND:
return AndFilter(Filter1, Filter2)
else if relation == OR:
return OrFilter(Filter1, Filter2)
</code></pre></div><p>This method is implemented in <code>AndFilter and(Filter left, Filter right)</code> and <code>OrFilter or(Filter left, Filter right)</code> in class FilterFactory.</p></li> <li><p>handleOneGlobalExpression merges a GlobalTimeExpression and an IExpression to be one executable expression. The result of the method only contains SingleSeriesExpressions. The declaration of the function is shown below:</p> <div class="language- extra-class"><pre><code> IExpression handleOneGlobalTimeExpression(
GlobalTimeExpression globalTimeExpression,
IExpression expression,
List&lt;Path&gt; selectedSeries,
ExpressionType relation)
Input 1: GlobalTimeExpression
Input 2: IExpression
Input 3: time series to project
Input 4: the relation between the two expressions (either AND or OR)
Output: an IExpression which is executable
</code></pre></div><p>This method first calls optimize() to transform the second input IExpression to be executable, which is recursive in view of optimize(), and then combine them in two ways.</p> <p><em>Case 1</em>: The relation between GlobalTimeExpression and the optimized IExpression is AND. In this case, denote the Filter in GlobalTimeExpression as Filter. We just need to merge the tFilter to the Filters of each SingleSeriesExpression in the IExpression。This method is implemented in <code>void addTimeFilterToQueryFilter(Filter timeFilter, IExpression expression)</code>. Here is an example:</p> <p>To combine the following GlobaLTimeFilter and IExpression where</p> <div class="language- extra-class"><pre><code> 1. GlobaLTimeFilter(tFilter)
2. IExpression
AndExpression
OrExpression
SingleSeriesExpression(&quot;path1&quot;, filter1)
SingleSeriesExpression(&quot;path2&quot;, filter2)
SingleSeriesExpression(&quot;path3&quot;, filter3)
</code></pre></div><p>The result is</p> <div class="language- extra-class"><pre><code> IExpression
AndExpression
OrExpression
SingleSeriesExpression(&quot;path1&quot;, AndFilter(filter1, tFilter))
SingleSeriesExpression(&quot;path2&quot;, AndFilter(filter2, tFilter))
SingleSeriesExpression(&quot;path3&quot;, AndFilter(filter3, tFilter))
</code></pre></div><p><em>Case 2</em>: The relation between GlobalTimeExpression and IExpression is OR. In this case, the merge steps include:</p> <ol><li>Analyse the projected time series, which is a set of Path. To take a query with 3 projected time series as an example, denote that projected time series as a set, PathList{path1, path2, path3}。</li> <li>Denote the Filter in GlobalTimeExpression to be tFilter. The method calls pushGlobalTimeFilterToAllSeries() to generate a corresponding SingleSeriesExpression for each Path. Set the Filters of SingleSeriesExpressions to be tFilter. Join the generated SingleSeriesExpression with OR operator to get an OrExpression, which is denoted as orExpression.</li> <li>Call mergeSecondTreeToFirstTree method to combine the nodes in IExpression with the nodes in the orExpression, which is generated from step 2. The combined structure is the result expression.</li></ol> <p>For example, to combine the following GlobalTimeFilter and IExpression using OR relation, denote the projected time series as PathList{path1, path2, path3}</p> <div class="language- extra-class"><pre><code> 1. GlobalTimeFilter(tFilter)
2. IExpression
AndExpression
SingleSeriesExpression(&quot;path1&quot;, filter1)
SingleSeriesExpression(&quot;path2&quot;, filter2)
</code></pre></div><p>the result is</p> <div class="language- extra-class"><pre><code> IExpression
OrExpression
AndExpression
SingleSeriesExpression(&quot;path1&quot;, filter1)
SingleSeriesExpression(&quot;path2&quot;, filter2)
OrExpression
OrExpression
SingleSeriesExpression(&quot;path1&quot;, tFilter)
SingleSeriesExpression(&quot;path2&quot;, tFilter)
SingleSeriesExpression(&quot;path3&quot;, tFilter)
</code></pre></div></li> <li><p>MergeIExpression combines two IExpressions to be one executable expression. This method receives three inputs, respectively</p> <div class="language- extra-class"><pre><code> IExpression1: the first IExpression to merge
IExpression2: the second IExpression to merge
relation: the relation between the two IExpressions (AND or OR)
</code></pre></div><p>The strategy of the method is:</p> <div class="language- extra-class"><pre><code> if relation == AND:
return AndExpression(IExpression1, IExpression2)
else if relation == OR:
return OrExpression(IExpression1, IExpression2)
</code></pre></div></li></ul> <p>Using the above four combination methods, the steps of optimize() include:</p> <ol><li><p>If the IExpression is a UnaryExpression, (a single SingleSeriesExpression or GlobalTimeExpression), return the IExpression without any operations. Otherwise, go to step 2.</p></li> <li><p>When it reaches this step, it means that the IExpression is an AndExpression or OrExpression.</p> <p>a. If the LeftIExpression and RightIExpression both are GlobalTimeExpression, use combineTwoGlobalTimeExpression method, and output the result.</p> <p>b. If LeftIExpression is a GlobalTimeExpression, and RightIExpression is not a GlobalTimeExpression, call handleOneGlobalExpression() to combine them。</p> <p>c. If LeftIExpression is not a GlobalTimeExpression, while RightIExpression is, call handleOneGlobalExpression() to combine them.</p> <p>d. If neither LeftIExpression nor RightIExpression is a GlobalTimeExpression, recursively call optimize() method on both LeftIExpression and RightIExpression to get the left executable expression and the right executable expression. Then use mergeIExpression method to generate a final IExpression which is executable.</p></li></ol> <h2 id="_2-query-execution-of-tsfile"><a href="#_2-query-execution-of-tsfile" class="header-anchor">#</a> 2 Query Execution of TsFile</h2> <h3 id="_2-1-design"><a href="#_2-1-design" class="header-anchor">#</a> 2.1 Design</h3> <p>The interface of TsFile on file level is intended only for queries on original data. According to the existence of value filter, the query can be divided into two groups: those without filters or only with a time filter, and those containing value filters.</p> <p>To execute the two kinds of queries, we design two query execution methods:</p> <ul><li><p>merge query</p> <p>It generates multiple readers, aligns the result in time, and returns the result set.</p></li> <li><p>join query</p> <p>According to the query conditions, it generates satisfying timestamp, which is used for generating result set.</p></li></ul> <h3 id="_2-2-three-components"><a href="#_2-2-three-components" class="header-anchor">#</a> 2.2 Three Components</h3> <h4 id="_2-2-1-fileseriesreader"><a href="#_2-2-1-fileseriesreader" class="header-anchor">#</a> 2.2.1 FileSeriesReader</h4> <p>org.apache.iotdb.tsfile.read.reader.series.FileSeriesReader</p> <p><strong>Functions</strong>: FileSeriesReader queries the data points of a time series in a file, which satisfies the filter conditions. It outputs the data points of the given time series in the given file in timestamp ascending order. There can be no filters at all.</p> <p><strong>Implementation</strong>: FileSeriesReader retrieves the Chunk information of the given time series according to the Path, it then traverses each Chunk in timestamp ascending order, and outputs the satisfying data points.</p> <h4 id="_2-2-2-fileseriesreaderbytimestamp"><a href="#_2-2-2-fileseriesreaderbytimestamp" class="header-anchor">#</a> 2.2.2 FileSeriesReaderByTimestamp</h4> <p>org.apache.iotdb.tsfile.read.reader.series.FileSeriesReaderByTimestamp</p> <p><strong>Functions</strong>: FileSeriesReaderByTimestamp queries the data points of a time series in a file, whose timestamp satisfies the timestamp constraints.</p> <p><strong>Implementation</strong>: This component provides an interface, getValueInTimestamp(long timestamp), which receives increasing timestamp value, and outputs the data points on the time series whose timestamp is identical. If there's no such data point, the result is null.</p> <h4 id="_2-2-3-tsfiletimegenerator"><a href="#_2-2-3-tsfiletimegenerator" class="header-anchor">#</a> 2.2.3 TsFileTimeGenerator</h4> <p>org.apache.iotdb.tsfile.read.query.timegenerator.TsFileTimeGenerator</p> <p><strong>Functions</strong>: According to the filter condition, TimeGeneratorImpl generates the satisfying timestamp. It first transforms the filter conditions to be a binary tree, and recursively generate the satisfying timestamp. This component is used in executing join query.</p> <p>An executable expression contains one or nultiple SingleSeriesExpressions. The relation between two SingleSeriesExpressions is either AND or OR. Therefore, the filter in an executable expression can be transformed to a binary tree, where the leaf nodes are FileSeriesReader, and the non-leaf nodes are AndNode or OrNode. Particularly, when the expression only contains a single SingleSeriesExpression, the binary tree only has one node. The satisfying timestamp can be generated using the binary tree.</p> <p>This component provides two basic functions:</p> <ol><li><p>check if there exists a next satisfying timestamp</p></li> <li><p>get the next satisfying timestamp</p></li></ol> <h3 id="_2-3-merge-query"><a href="#_2-3-merge-query" class="header-anchor">#</a> 2.3 Merge Query</h3> <p>org.apache.iotdb.tsfile.read.query.dataset.DataSetWithoutTimeGenerator</p> <p>Suppose there are n time series. For each one of them, a FileSeriesReader will be generated. If there's a GlobalTimeExpression, the filter in it will be input to the FileSeriesReaders.</p> <p>A DataSetWithoutTimeGenerator will be generated using these FileSeriesReaders. Since each FileSeriesReader outputs data points in time stamp ascending order, we can use the idea of k-way merge to align the result data points.</p> <p>The steps include:</p> <p>(1) Create a min-heap, which stores timestamps. The min-heap is organized according to the value of the timestamp.</p> <p>(2) Initialize the min-heap. Access each FileSeriesReader once. If there's a next data point in the FileSeriesReader, add its timestamp to the min-heap. Till now, the heap contains at most one timestamp of each time series, which is the minimum in its corresponding time series.</p> <p>(3) If the size of the heap is greater than 0, take the timestamp on the top of the heap, denote it as t, and remove it from the heap, then go to step (4). If the number of the heap is 0, go to step (5).</p> <p>(4) Create a new RowRecord. In turns access each time series. When dealing with a time series, first check if there's a next data point, if it fails, set the result data point to be null. Otherwise, check if minimum timestamp in the time series is identical to t. If it is not, set the result data point to be null. Otherwise, get the data point and set it to be the result data point. If there exists a next data point after that. If it has, then set timestamp of the next data point in the time series to be its minimum timestamp. After accessing all time series, combine the result data points to form a RowRecord. Finally, go to step (3).</p> <p>(5) Terminate the process.</p> <h3 id="_2-4-join-query"><a href="#_2-4-join-query" class="header-anchor">#</a> 2.4 Join Query</h3> <p>org.apache.iotdb.tsfile.read.query.executor.ExecutorWithTimeGenerator</p> <p>Join query execution generates timestamp according to the filter conditions, and retrieves the data point on the projected time series to form a RowRecord. Main steps include;</p> <p>(1) According to QueryExpression, initialize the timestamp generation module, TimeGeneratorImpl</p> <p>(2) Generate FileSeriesReaderByTimestamp for each projected time series.</p> <p>(3) If there exists a next timestamp in the &quot;timestamp generation module&quot;, denote the timestamp t, go to step (4).Otherwise, terminate the query execution.</p> <p>(4) According to t, utilize FileSeriesReaderByTimestamp on each time series to retrieve the data point whose corresponding timestamp is t. If there's no such data point, use null to represent it.</p> <p>(5) Combine the data points in step (4) to form a RowRecord, then go to step (3) to generate another row of records.</p> <h3 id="_2-5-query-of-tsfile"><a href="#_2-5-query-of-tsfile" class="header-anchor">#</a> 2.5 Query of TsFile</h3> <p>org.apache.iotdb.tsfile.read.query.executor.TsFileExecutor</p> <p>TsFileExecutor receives a QueryExpression, execute the query and outputs the QueryDataSet。The work flow includes the following steps:</p> <p>(1) Receive a QueryExpression.</p> <p>(2) If the QueryExpression contains no filter conditions, execute merge query. If it contains any Filters, use ExpressionOptimizer to optimize the IExpression in QueryExpression. If the optimized IExpression is a GlobalTimeExpression, execute merge query. If it contains value filters, it sends a message to ExecutorWithTimeGenerator to execute join query.</p> <p>(3) Generate the QueryDataSet. It iteratively generates RowRecord and returns the results.</p> <h3 id="_2-6-related-concepts"><a href="#_2-6-related-concepts" class="header-anchor">#</a> 2.6 Related Concepts</h3> <ul><li><p>Chunk: Chunk is the storage structure of a chunk of time series. IChunkReader is for reading the content。</p></li> <li><p>ChunkMetaData: ChunkMetaData records the offset, data type and encoding info of the Chunk in the File.</p></li> <li><p>IMetadataQuerier: IMetadataQuerier is a querier for TsFile metadata. It queries the metadata of a file, and the ChunkMetaData of a time series.</p></li> <li><p>IChunkLoader: IChunkLoader is the loader for Chunk, whose main function is getting the corresponding Chunk of the given the ChunkMetaData.</p></li> <li><p>IChunkReader: IChunkReader reads the data in a Chunk. It receives a Chunk and parse it according to the info in the ChunkHeader. It provides two interface:</p> <ul><li>hasNextSatisfiedPage &amp; nextPageData: iteratively returns a Page</li> <li>getPageReaderList: return all PageReader</li></ul></li> <li><p>IPageReader: IPageReader reads the data in a Page. It provides two interface:</p> <ul><li>getAllSatisfiedPageData(): return all satisfying values</li> <li>getStatistics(): return the statistic information of the Page</li></ul></li> <li><p>QueryExpression</p> <p>QueryExpression is the query expression, which contains the time series to project, and filter constraints.</p></li> <li><p>QueryDataSet</p> <p>The result of a query. It contains one or multiple RowRecord, which combines data points having identical time stamp together. QueryDataSet provides two interface:</p> <ul><li>check if there's a next RowRecord.</li> <li>return the next RowRecord.</li></ul></li></ul></div> <div class="page-nav"><p class="inner"><span class="prev">
<a href="/SystemDesign/TsFile/Write.html" class="prev">
Write
</a></span> <span class="next"><a href="/SystemDesign/QueryEngine/QueryEngine.html">
QueryEngine
</a>
</span></p></div> <p style="text-align: center;">Copyright © 2020 The Apache Software Foundation.<br>
Apache and the Apache feather logo are trademarks of The Apache Software Foundation</p> <p style="text-align: center; margin-top: 10px; color: #444">
Contact us: Join QQ Group 659990460 | Add friend <i>tietouqiao</i> and be invited to Wechat Group<br>
see <a href="https://github.com/apache/iotdb/issues/1995">Join the community</a> for more</p></main></div><div class="global-ui"></div></div>
<script src="/assets/js/app.ee472f44.js" defer></script><script src="/assets/js/3.49f0f20a.js" defer></script><script src="/assets/js/8.e8c4adeb.js" defer></script>
</body>
</html>