{"id":348562,"date":"2023-06-09T09:02:33","date_gmt":"2023-06-09T09:02:33","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=348562"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=348562","title":{"rendered":"<span>\u0418\u0437 SQL \u0432 NoSQL: \u043c\u0435\u043d\u044f\u0435\u043c \u043f\u0430\u0440\u0430\u0434\u0438\u0433\u043c\u0443 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432<\/span>"},"content":{"rendered":"<div><img loading=\"lazy\" decoding=\"async\" height=\"1\" src=\"https:\/\/vk.com\/rtrg?p=VK-RTRG-1288550-e6f1C\" width=\"1\" style=\"display: none;\"><img loading=\"lazy\" decoding=\"async\" height=\"1\" src=\"https:\/\/top-fwz1.mail.ru\/counter?id=3200881;js=na\" width=\"1\" style=\"display: none;\"><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<p>\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0439 \u043e\u043f\u044b\u0442 \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u043a \u0434\u0430\u043d\u043d\u044b\u043c. \u041c\u044b \u043f\u0440\u0438\u0432\u044b\u043a\u043b\u0438, \u0447\u0442\u043e \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445 SQL \u0441\u0442\u0440\u043e\u044f\u0442 \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u043f\u043b\u0430\u043d \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0437\u0430 \u043d\u0430\u0441. \u0412\u043e \u043c\u043d\u043e\u0433\u0438\u0445 \u0431\u0430\u0437\u0430\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 NoSQL \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u043b\u043e\u0436\u0438\u0442\u0441\u044f \u043d\u0430 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430. \u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u0416\u043e\u0440\u0430, \u0438 \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 <a href=\"https:\/\/habr.com\/ru\/users\/yngvar_antonsson\/\">yngvar_antonsson<\/a> \u043c\u044b \u043f\u0440\u043e\u0432\u0435\u043b\u0438 \u043c\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0437\u0430 \u0430\u0443\u0434\u0438\u0442\u043e\u043c \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0443 \u043d\u0430\u0448\u0438\u0445 \u0437\u0430\u043a\u0430\u0437\u0447\u0438\u043a\u043e\u0432. \u0421\u0435\u0433\u043e\u0434\u043d\u044f \u043c\u044b \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0435\u043c \u043f\u0440\u043e \u043f\u0435\u0440\u0444\u043e\u043c\u0430\u043d\u0441, \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u0438 \u0442\u044f\u0436\u0435\u043b\u044b\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 Tarantool. \u0411\u0443\u0434\u0435\u0442 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e \u0432\u0441\u0435\u043c, \u043a\u0442\u043e \u0443\u0436\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0438\u043b\u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 Tarantool, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0442\u0435\u043c, \u043a\u0442\u043e \u0441\u0442\u0440\u043e\u0438\u0442 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u043d\u044b\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u043f\u043e\u0432\u0435\u0440\u0445 \u0441\u0432\u043e\u0438\u0445 \u0411\u0414.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/caa\/334\/859\/caa334859cd5b70b3c31ec88b8ca81ec.png\" alt=\"\u0418\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043e Midjourney\" title=\"\u0418\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043e Midjourney\" width=\"1024\" height=\"1024\"><\/p>\n<div><figcaption><em>\u0418\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043e Midjourney<\/em><\/figcaption><\/div>\n<\/figure>\n<h3>\u0414\u0438\u0441\u043a\u043b\u0435\u0439\u043c\u0435\u0440<\/h3>\n<p>\u041d\u0435 \u0432\u0441\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u0432 \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u0445 \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u043d\u0430 \u043f\u0440\u043e\u0434\u0430\u0445. \u041f\u043e\u043c\u043d\u0438\u0442\u0435, \u0447\u0442\u043e Tarantool \u0432\u0441\u0435 \u0435\u0449\u0435 \u043e\u0434\u043d\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u044b\u0439, \u0430 <code>select(nil)<\/code> \u0438\u043b\u0438 \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 \u0446\u0438\u043a\u043b \u0431\u0435\u0437 \u0432\u044b\u0437\u043e\u0432\u0430 <code>fiber.yield()<\/code> \u0441\u043b\u043e\u043c\u0430\u0435\u0442 \u0432\u0430\u043c \u0438\u043d\u0441\u0442\u0430\u043d\u0441.<\/p>\n<p>\u0412 \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u0445 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f Tarantool 2.11 \u0441 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0430\u043c\u0438:<\/p>\n<pre><code class=\"lua\">box.schema.space.create('test') box.space.test:format{     {name = 'a', type = 'integer'},     {name = 'b', type = 'integer'},     {name = 'c', type = 'integer'}, }  box.space.test:create_index('pk', {parts={'a', 'b'}}) box.space.test:create_index('a_index', {parts={'a'}}) box.space.test:create_index('b_index', {parts={'b'}})<\/code><\/pre>\n<p>\u0418\u043b\u0438 \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u044b\u0439 SQL-\u0437\u0430\u043f\u0440\u043e\u0441:<\/p>\n<pre><code class=\"sql\">CREATE TABLE test (     a INTEGER NOT NULL,     b INTEGER NOT NULL,     c INTEGER NOT NULL     PRIMARY KEY (a, b) );  CREATE INDEX a_index ON test(a); CREATE INDEX b_index ON test(b);<\/code><\/pre>\n<p>\u0412\u0435\u0437\u0434\u0435, \u0433\u0434\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0434\u0440\u0443\u0433\u0438\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0438 \u0438\u043d\u0434\u0435\u043a\u0441\u044b, \u0431\u0443\u0434\u0435\u0442 \u0443\u043a\u0430\u0437\u0430\u043d\u043e \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e. \u0412\u0441\u0435 \u043f\u0441\u0435\u0432\u0434\u043e-SQL-\u0437\u0430\u043f\u0440\u043e\u0441\u044b \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u044b \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u0430, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0436\u043d\u043e \u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0434\u043b\u044f \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u044f, \u0447\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432 Lua-\u043a\u043e\u0434\u0435.<\/p>\n<h3>\u0412\u044b\u0431\u043e\u0440\u043a\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0441 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f\u043c\u0438<\/h3>\n<p>\u041e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u043c \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u043c \u043e\u0442\u0431\u043e\u0440\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u043b\u044e\u0431\u043e\u0439 \u0411\u0414 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u044f \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443. Tarantool \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u044d\u0442\u043e \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>pairs<\/code>. \u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u043a\u043b\u044e\u0447, \u043f\u043e \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0442\u044c, \u0430 \u0432\u0442\u043e\u0440\u044b\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u043c \u043c\u043e\u0436\u043d\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0442\u0438\u043f \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0438 \u043f\u043e \u0441\u043f\u0435\u0439\u0441\u0443. \u0418\u043d\u0434\u0435\u043a\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0438, \u044f\u0432\u043d\u043e \u043d\u0435 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f, \u043d\u043e \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u044d\u0442\u043e \u043f\u0435\u0440\u0432\u0438\u0447\u043d\u044b\u0439 \u043a\u043b\u044e\u0447 \u0441\u043f\u0435\u0439\u0441\u0430 (\u0432 Tarantool \u044d\u0442\u043e <strong>\u043f\u0435\u0440\u0432\u044b\u0439 <\/strong>\u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0439 \u0438\u043d\u0434\u0435\u043a\u0441 \u0434\u043b\u044f \u0441\u043f\u0435\u0439\u0441\u0430).<\/p>\n<pre><code class=\"sql\">SELECT * FROM test WHERE a &gt; 10 AND b &gt; 5 LIMIT 10<\/code><\/pre>\n<pre><code class=\"lua\">box.space.test:pairs({10, 5}, {iterator = 'GT'}):take_n(10):totable() box.space.test:select({10, 5}, {iterator = 'GT', limit = 10})<\/code><\/pre>\n<p>\u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 <code>iterator<\/code> \u0432 \u0437\u0430\u043f\u0440\u043e\u0441\u0430\u0445 \u0432\u044b\u0448\u0435: \u043e\u043d \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043d\u0430 \u0442\u0438\u043f \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0432\u044b\u0431\u043e\u0440\u043a\u0438 \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443, \u0438 \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0438\u0437 \u043f\u0435\u0440\u0432\u044b\u0445 \u0431\u0443\u043a\u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0433\u043e \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u0430 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f: GT \u2014 greater than.<\/p>\n<p>\u0414\u043b\u044f \u0444\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u0438 \u043f\u043e \u043f\u043e\u043b\u044f\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435 \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u0432 \u0438\u043d\u0434\u0435\u043a\u0441\u0435, \u043c\u043e\u0436\u043d\u043e \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439 <code>filter<\/code>:<\/p>\n<pre><code class=\"sql\">SELECT * FROM test WHERE a &gt; 10 AND c &gt; 4<\/code><\/pre>\n<pre><code class=\"lua\"> box.space.test:pairs({10}, {iterator = 'GT'})   :filter(function(x) return x.c &gt; 4 end)   :take_n(10)   :totable()<\/code><\/pre>\n<h3>\u041f\u0430\u0433\u0438\u043d\u0430\u0446\u0438\u044f<\/h3>\n<p>\u0412 \u0441\u0442\u0430\u0442\u044c\u0435 \u043f\u0440\u043e <a href=\"https:\/\/habr.com\/ru\/companies\/vk\/articles\/672386\/\"><u>\u0430\u043d\u0442\u0438\u043f\u0430\u0442\u0442\u0435\u0440\u043d\u044b \u0432 Tarantool<\/u><\/a> \u043c\u044b \u043f\u0438\u0441\u0430\u043b\u0438, \u0447\u0442\u043e \u043f\u0430\u0433\u0438\u043d\u0430\u0446\u0438\u044f \u0438 SELECT \u0431\u0435\u0437 \u0443\u0441\u043b\u043e\u0432\u0438\u0439 \u2014 \u044d\u0442\u043e \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043e\u043f\u0430\u0441\u043d\u0430\u044f \u0432\u0435\u0449\u044c. \u0412 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 (2.11 \u043d\u0430 \u043c\u043e\u043c\u0435\u043d\u0442 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0441\u0442\u0430\u0442\u044c\u0438) \u0432\u0441\u0435 \u0441\u0442\u0430\u043b\u043e \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043b\u0443\u0447\u0448\u0435:<\/p>\n<p>1. Tarantool \u0442\u0435\u043f\u0435\u0440\u044c \u043f\u0438\u0448\u0435\u0442 \u0432 \u043b\u043e\u0433\u0438 \u043e \u043f\u043e\u0442\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u0434\u043e\u043b\u0433\u0438\u0445 \u0441\u0435\u043b\u0435\u043a\u0442\u0430\u0445:<\/p>\n<pre><code class=\"lua\">box.space.test:select(nil) 2023-03-15 20:40:55.717 [23511] main\/103\/interactive C&gt; Potentially long select from space 'test' (512)<\/code><\/pre>\n<p>2. \u0421 \u043d\u043e\u0432\u044b\u043c\u0438 \u043e\u043f\u0446\u0438\u044f\u043c\u0438 \u043c\u043e\u0436\u043d\u043e \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0430\u0442\u044c \u0432\u0440\u0435\u043c\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0444\u0430\u0439\u0431\u0435\u0440\u0430. \u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0442\u044c \u0432\u0440\u0435\u043c\u044f, \u043f\u043e\u0441\u043b\u0435 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0432 \u043b\u043e\u0433\u0430\u0445 \u043f\u043e\u044f\u0432\u0438\u0442\u0441\u044f \u043f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u0435, \u0447\u0442\u043e\u0431\u044b \u0434\u0435\u0442\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u043b\u0438\u043d\u043d\u044b\u0435 \u0446\u0438\u043a\u043b\u044b \u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438. \u0418\u043b\u0438 \u0432\u0440\u0435\u043c\u044f, \u043a\u043e\u0433\u0434\u0430 \u0446\u0438\u043a\u043b \u043f\u0440\u0435\u0440\u0432\u0435\u0442\u0441\u044f \u0441 \u043e\u0448\u0438\u0431\u043a\u043e\u0439:<\/p>\n<pre><code class=\"lua\">-- \u0433\u0434\u0435-\u0442\u043e \u0432 init.lua \u0444\u0430\u0439\u043b\u0435 compat.fiber_slice_default = 'new' fiber.set_max_slice{warn = 1, err = 3}  -- \u0432 \u043a\u043e\u0434\u0435 \u0432\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f: for k, v in box.space.test:pairs() do &nbsp; &nbsp;      -- smth end  2023-03-15 21:41:59.157 [28484] main\/103\/interactive fiber.h:1054 W&gt; fiber has not  yielded for more than 1.000 seconds ----  error: fiber slice is exceeded ...<\/code><\/pre>\n<p>3. \u041f\u0430\u0433\u0438\u043d\u0430\u0446\u0438\u044e \u043c\u043e\u0436\u043d\u043e \u0434\u0435\u043b\u0430\u0442\u044c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 \u0432 \u0432\u044b\u0437\u043e\u0432\u0435 select:<\/p>\n<pre><code class=\"lua\">local res, pos, cnt = {}, nil, 0  while cnt &lt; box.space.test:count() do&nbsp; &nbsp;      res, pos = box.space.test:select({},  &nbsp; &nbsp; &nbsp; &nbsp; {limit = 1000, after = pos, fetch_pos = true})&nbsp; &nbsp;      -- do smth with res&nbsp; &nbsp;      cnt = cnt + #res  end<\/code><\/pre>\n<p>4. \u0412\u0441\u0435 \u0435\u0449\u0435 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0434\u043b\u044f \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u044f \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0438:<\/p>\n<pre><code class=\"lua\">local last_key, cnt = nil, 0 while cnt &lt; box.space.test:count() do&nbsp; &nbsp;      res = box.space.test:pairs(last_key, {iterator = 'GE'}):take_n(1000):totable()&nbsp; &nbsp;     -- do smth with res&nbsp; &nbsp;      cnt = cnt + #res&nbsp; &nbsp;      local last_tuple = res[#res]&nbsp; &nbsp;      last_key = {last_tuple.a, last_tuple.b} end<\/code><\/pre>\n<p>5. \u0410 Enterprise-\u0432\u0435\u0440\u0441\u0438\u044f \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442 \u0432\u0430\u043c \u0441\u0434\u0435\u043b\u0430\u0442\u044c Readview \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c fiber.yield \u0432 \u0446\u0438\u043a\u043b\u0435, \u043d\u0435 \u0431\u0435\u0441\u043f\u043e\u043a\u043e\u044f\u0441\u044c \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u043e\u043c\u0435\u043d\u044f\u044e\u0442\u0441\u044f \u043c\u0435\u0436\u0434\u0443 \u0432\u044b\u0437\u043e\u0432\u0430\u043c\u0438:<\/p>\n<pre><code class=\"lua\">rw = box.read_view.open{name = 'test_rw'} while cnt &lt; box.space.test:count() do&nbsp; &nbsp;      res, pos = rw.space.test:select({}, {limit = 1000, after = pos, fetch_pos = true})&nbsp; &nbsp;      -- do smth with res&nbsp; &nbsp;      fiber.yield() &nbsp; &nbsp;      cnt = cnt + #res  end rw:close()<\/code><\/pre>\n<p>\u0410 \u0435\u0449\u0435 \u0443 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 <code>after<\/code> \u0435\u0441\u0442\u044c \u043e\u0433\u0440\u043e\u043c\u043d\u043e\u0435 \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u043e: \u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u043f\u043e \u0441\u0435\u0442\u0438 \u0438 \u0434\u0435\u043b\u0430\u0442\u044c \u0443\u0434\u043e\u0431\u043d\u0435\u0435 \u0447\u0442\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u0430\u0447\u043a\u0430\u043c\u0438.<\/p>\n<h3>\u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430<\/h3>\n<p>\u0412 Tarantool, \u043a\u0430\u043a \u0438 \u0432 \u043b\u044e\u0431\u043e\u0439 SQL-\u0411\u0414, \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u043f\u0435\u0440\u0435\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0432\u0441\u0435\u0433\u0434\u0430 \u043f\u043b\u043e\u0445\u043e \u0441\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438. \u0421\u0430\u043c\u044b\u0439 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u043b\u0438\u0448\u043d\u0435\u0439 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u2014 \u0434\u0435\u043b\u0430\u0442\u044c \u0437\u0430\u043f\u0440\u043e\u0441 \u0441 \u0443\u0447\u0435\u0442\u043e\u043c \u0442\u043e\u0439 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0440\u0430\u0441\u043f\u043e\u043b\u0430\u0433\u0430\u044e\u0442\u0441\u044f \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u0438\u043d\u0434\u0435\u043a\u0441\u0435.&nbsp;<\/p>\n<p>\u0418\u043d\u0434\u0435\u043a\u0441 <code>B+*-tree<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f \u0432 Tarantool \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0443\u0436\u0435 \u0432 \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u043c \u0432\u0438\u0434\u0435. \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043f\u0440\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u0432 \u0446\u0435\u043b\u043e\u043c \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0447\u0438\u0442\u0430\u0442\u044c <a href=\"https:\/\/habr.com\/ru\/companies\/postgrespro\/articles\/330544\/\"><u>\u0437\u0434\u0435\u0441\u044c<\/u><\/a>, \u0430 \u043f\u0440\u043e \u0438\u0445 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u0432 Tarantool <a href=\"https:\/\/habr.com\/ru\/companies\/vk\/articles\/505880\/\"><u>\u0437\u0434\u0435\u0441\u044c<\/u><\/a>.<\/p>\n<pre><code class=\"sql\">SELECT * FROM test ORDER BY b LIMIT 10<\/code><\/pre>\n<pre><code class=\"lua\">box.space.test.index.b_index:select({}, {limit = 10})  -- ordered<\/code><\/pre>\n<p>\u0411\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u043c\u0443 \u0442\u0438\u043f\u0443 \u0438\u0442\u0435\u0440\u0430\u0442\u043e\u0440\u0430 Tarantool \u0442\u0430\u043a\u0436\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435:<\/p>\n<pre><code class=\"sql\">SELECT * FROM test ORDER BY b DESC LIMIT 10<\/code><\/pre>\n<pre><code class=\"lua\">box.space.test.index.b_index:select({}, {limit = 10, iterator = 'REQ' }) -- reverse ordered<\/code><\/pre>\n<p>\u0412\u0430\u0436\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442: \u0432\u044b\u0431\u043e\u0440\u043a\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432\u0441\u0435\u0433\u0434\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442\u044c \u0432 \u043e\u0434\u043d\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435. \u0418\u0437-\u0437\u0430 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0441\u0430\u043c\u043e\u0433\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0430 \u0432\u044b \u043d\u0435 \u0441\u043c\u043e\u0436\u0435\u0442\u0435 \u043e\u0442\u043e\u0431\u0440\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u0434\u0440\u0443\u0433\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435, \u0447\u0435\u043c \u0442\u043e\u0442, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043e\u043d\u0438 \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u0432 \u0438\u043d\u0434\u0435\u043a\u0441\u0435. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043d\u0430 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0435 \u043d\u0438\u0436\u0435 \u0435\u0441\u043b\u0438 \u0435\u0441\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u043f\u043e \u043f\u043e\u043b\u044f\u043c <code>(a, b)<\/code>, \u0442\u043e \u0437\u0430\u043f\u0440\u043e\u0441 \u0432\u0438\u0434\u0430 <code>a &gt;= a2<\/code> \u043f\u0440\u043e\u0439\u0434\u0435\u0442 \u043f\u043e \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u043c \u0437\u0430\u043f\u0438\u0441\u044f\u043c \u0432 \u0438\u043d\u0434\u0435\u043a\u0441\u0435, \u0430 \u0437\u0430\u043f\u0440\u043e\u0441\u0443 b &gt;= b2 \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0431\u044b \u043f\u0435\u0440\u0435\u0441\u043a\u0430\u043a\u0438\u0432\u0430\u0442\u044c \u043c\u0435\u0436\u0434\u0443 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u043c\u0438 \u0442\u0430\u043f\u043b\u0430\u043c\u0438 \u0432 \u0438\u043d\u0434\u0435\u043a\u0441\u0435, \u0447\u0442\u043e \u0432 Tarantool \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/3aa\/7d4\/33d\/3aa7d433d2545a4a6705da5b4cbf4783.png\" alt=\"\" title=\"\" width=\"1280\" height=\"440\"><\/figure>\n<p>\u0412\u0441\u0435 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0441\u043b\u043e\u0436\u043d\u0435\u0435, \u043a\u043e\u0433\u0434\u0430 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0443\u0436\u043d\u043e \u0434\u0430\u043d\u043d\u044b\u0435, \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0435 \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u2014 \u0437\u0434\u0435\u0441\u044c \u043c\u044b \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u0438\u0437 memtx_memory \u0432 lua_memory:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/a0e\/31b\/ecb\/a0e31becbc1d9f3f972f704c38cca948.png\" alt=\" \" title=\" \" width=\"1920\" height=\"660\"><\/p>\n<div><figcaption> <\/figcaption><\/div>\n<\/figure>\n<pre><code class=\"sql\">data := SELECT * FROM test1 JOIN test_2 ON cond ORDER BY b DESC LIMIT 10<\/code><\/pre>\n<pre><code class=\"lua\">table.sort(data, comparator)<\/code><\/pre>\n<p>\u0422\u0430\u043a\u0430\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u044f\u0442\u044c \u043c\u043d\u043e\u0433\u043e \u043f\u0430\u043c\u044f\u0442\u0438 \u0438 \u043e\u0442\u0431\u0438\u0440\u0430\u0442\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u0443 \u0434\u0440\u0443\u0433\u0438\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u043e\u0434\u043d\u043e\u0433\u043e \u043f\u043e\u0442\u043e\u043a\u0430 \u0432\u0432\u0438\u0434\u0443 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b Tarantool. \u041a\u0430\u043a\u0438\u0435 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u044f?<\/p>\n<ol>\n<li>\n<p>\u041e\u0442\u0434\u0430\u0442\u044c \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0443 \u0432 \u0432\u044b\u0448\u0435\u043b\u0435\u0436\u0430\u0449\u0435\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435: \u043c\u043d\u043e\u0433\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u044b\u0439 Go, Python \u0438\u043b\u0438 Java \u0441\u043f\u0440\u0430\u0432\u044f\u0442\u0441\u044f \u0441 \u044d\u0442\u0438\u043c \u043b\u0443\u0447\u0448\u0435.<\/p>\n<\/li>\n<li>\n<p>\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c <code>yield<\/code> \u0432 \u043a\u043e\u043c\u043f\u0430\u0440\u0430\u0442\u043e\u0440. \u042d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442 \u043e\u0442\u0434\u0430\u0442\u044c \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0434\u0440\u0443\u0433\u0438\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e \u0441 \u043a\u043e\u0434\u043e\u043c \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438.<\/p>\n<\/li>\n<\/ol>\n<h3>\u0413\u0440\u0443\u043f\u043f\u0438\u0440\u043e\u0432\u043a\u0430<\/h3>\n<p>Tarantool \u043d\u0435 \u0443\u043c\u0435\u0435\u0442 \u0430\u0433\u0440\u0435\u0433\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435, \u0442\u0430\u043a \u0447\u0442\u043e \u044d\u0442\u043e \u0432\u0441\u0435\u0433\u0434\u0430 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0437\u0430\u0434\u0430\u0447\u0435\u0439 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 \u0438\u043b\u0438 \u0432\u044b\u0448\u0435\u043b\u0435\u0436\u0430\u0449\u0435\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u0412\u043e\u0442 \u0442\u0430\u043a, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u043c\u0430\u043a\u0441\u0438\u043c\u0443\u043c \u0432 \u0433\u0440\u0443\u043f\u043f\u0435 \u0438\u0437 \u0434\u0432\u0443\u0445 \u043f\u043e\u043b\u0435\u0439:<\/p>\n<pre><code class=\"sql\">SELECT MAX(c) FROM test GROUP BY a, b<\/code><\/pre>\n<pre><code class=\"lua\">-- loop way local aggregate = {} for _, v in box.space.test:pairs() do &nbsp; &nbsp; local key = v.a .. v.b&nbsp; &nbsp;      aggregate[key] = max(aggregate[key], v.c) end  -- luafun way local aggregate = box.space.test:pairs():reduce(&nbsp; &nbsp;      function(acc, x) &nbsp; &nbsp; &nbsp; &nbsp;          local key = x.a .. x.b&nbsp; &nbsp; &nbsp; &nbsp;          acc[key] = max(acc[key], x.c) &nbsp; &nbsp; &nbsp; &nbsp;          return acc &nbsp; &nbsp;  end, {})<\/code><\/pre>\n<h3>Nested Loop Join<\/h3>\n<p>\u0414\u0436\u043e\u0439\u043d\u044b \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u043c\u0438 \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0430\u043c\u0438 Tarantool \u0442\u043e\u0436\u0435 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f, \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0443\u0436\u043d\u043e \u043f\u0438\u0441\u0430\u0442\u044c \u043a\u043e\u0434. \u041c\u043e\u0436\u043d\u043e \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f Lua-\u0442\u0430\u0431\u043b\u0438\u0446\u0430\u043c\u0438, \u0435\u0441\u043b\u0438 \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u044b\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 JOIN \u0431\u0443\u0434\u0435\u0442 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u043c. \u0418\u043b\u0438 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u044b\u0439 \u0442\u0430\u0440\u0430\u043d\u0442\u0443\u043b\u044c\u043d\u044b\u0439 \u0441\u043f\u0435\u0439\u0441, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u043c \u0441\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 JOIN, \u043a\u0430\u043a \u0432 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043d\u0438\u0436\u0435:<\/p>\n<pre><code class=\"sql\">SELECT a1,a2,a3,fk,b2,b3 FROM a JOIN b ON a.fk = b.pk WHERE a2 &gt; 5 AND b3 &lt; 10&nbsp;<\/code><\/pre>\n<p>\u0412\u0430\u0440\u0438\u0430\u043d\u0442 \u0441 \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u044b\u043c \u0441\u043f\u0435\u0439\u0441\u043e\u043c:<\/p>\n<pre><code class=\"lua\">box.schema.space.create('tmp', {temporary = true})  box.space.tmp:create_index('tmp_pk', {parts={{field = 1, type = 'string'}, {field = 4, type = 'string'}}})  for _, v1 in box.space.a:pairs():filter(function(x) return x.a2 &gt; 5 end) do&nbsp; &nbsp;      local a1, a2, a3, a4 = v1:totable()&nbsp; &nbsp;      box.begin()&nbsp; &nbsp;      for _, v2 in box.space.b:pairs({a4}):filter(function(x) return x.b3 &lt; 10 end) do&nbsp;    &nbsp; &nbsp; &nbsp;local _, b2, b3 = v2:totable()&nbsp; &nbsp; &nbsp; &nbsp;         box.space.tmp:insert{a1,a2,a3,a4,b2,b3}&nbsp; &nbsp;      end&nbsp; &nbsp; box.commit() end  local res = box.space.tmp:select{} -- do smth with res  box.space.tmp:drop()<\/code><\/pre>\n<p>\u0412\u0430\u0440\u0438\u0430\u043d\u0442 \u0441 Lua-\u0442\u0430\u0431\u043b\u0438\u0446\u0435\u0439 \u0434\u043b\u044f \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043c\u0430 \u0434\u0430\u043d\u043d\u044b\u0445:<\/p>\n<pre><code class=\"lua\">local res = {}  for _, v1 in box.space.a:pairs():filter(function(x) return x.a2 &gt; 5 end) do&nbsp; &nbsp;      local a1, a2, a3, a4 = v1:totable()&nbsp; &nbsp;      for _, v2 in box.space.b:pairs({a4}):filter(function(x) return x.b3 &lt; 10 end) do &nbsp; &nbsp; &nbsp; &nbsp; local _, b2, b3 = v2:totable()&nbsp; &nbsp; &nbsp; &nbsp;          table.insert(res, {a1,a2,a3,a4,b2,b3})&nbsp; &nbsp;      end end<\/code><\/pre>\n<h3>\u041a\u043b\u0430\u0441\u0442\u0435\u0440\u043d\u044b\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b<\/h3>\n<p>\u0417\u0430\u043f\u0440\u043e\u0441\u044b \u0441\u0442\u0430\u043d\u043e\u0432\u044f\u0442\u0441\u044f \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0435\u0435, \u0435\u0441\u043b\u0438 \u043e\u043d\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0442\u0441\u044f \u043d\u0430 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0445 \u0443\u0437\u043b\u0430\u0445. \u041f\u0440\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0432 \u0442\u0430\u043a\u0438\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u0430\u0445 \u043c\u044b \u0443\u0436\u0435 \u0433\u043e\u0432\u043e\u0440\u0438\u043b\u0438 \u0432 \u043f\u0440\u043e\u0448\u043b\u044b\u0439 \u0440\u0430\u0437, \u0430 \u0441\u0435\u0433\u043e\u0434\u043d\u044f \u0431\u0443\u0434\u0443\u0442 \u043f\u0440\u0438\u043c\u0435\u0440\u044b.<\/p>\n<p>\u041f\u043e\u0447\u0442\u0438 \u0432\u0441\u0435 \u0448\u0430\u0440\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u044b Tarantool \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u044b \u043d\u0430 \u0431\u0430\u0437\u0435 \u043c\u043e\u0434\u0443\u043b\u044f vshard. \u0422\u0430\u043a\u0436\u0435 \u0441 \u043d\u0435\u0434\u0430\u0432\u043d\u0435\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0432 Tarantool \u043f\u043e\u044f\u0432\u0438\u043b\u0441\u044f \u043c\u043e\u0434\u0443\u043b\u044c crud, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c \u0441 vshard-\u0437\u0430\u043f\u0440\u043e\u0441\u0430\u043c\u0438. \u0414\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0438\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u044b \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u043e\u0431\u043e\u0438\u0445 \u043f\u043e\u0434\u0445\u043e\u0434\u043e\u0432 \u2014 pure vshard calls \u0438 crud. \u041d\u0430\u0447\u043d\u0435\u043c \u0441 \u043f\u0440\u043e\u0441\u0442\u043e\u0433\u043e.<\/p>\n<h4>One shard select<\/h4>\n<p>\u0415\u0441\u043b\u0438 \u043c\u044b \u0437\u043d\u0430\u0435\u043c \u043a\u043b\u044e\u0447 \u0448\u0430\u0440\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0437\u0430\u043f\u0438\u0441\u0435\u0439, \u043f\u043e \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u0445\u043e\u0442\u0438\u043c \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u044b\u0431\u043e\u0440\u043a\u0443, \u0442\u043e \u043c\u043e\u0436\u0435\u043c \u0434\u0435\u043b\u0430\u0442\u044c \u0431\u043e\u043b\u0435\u0435 \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b:<\/p>\n<pre><code class=\"sql\">SELECT * FROM test WHERE a = 10 LIMIT 10<\/code><\/pre>\n<p><strong>vshard way:<\/strong><\/p>\n<pre><code class=\"lua\">local bucket_id = bucket_id_calc(sharding_key)  local resultset = vshard.router.callrw(bucket_id, 'box.space.test:select', {{10},  {limit = 10}}, {timeout = 5})<\/code><\/pre>\n<p><strong>crud way:<\/strong><\/p>\n<pre><code class=\"lua\">local resultset = crud.select('test', {{'=', 'a', 10}}, {first = 10, bucket_id = bucket_id_calc(sharding_key)})<\/code><\/pre>\n<h4>Multishard select<\/h4>\n<pre><code class=\"sql\">(SELECT * FROM test[shard 1] WHERE a &gt; 10 AND c &gt; 4)  UNION ALL  (SELECT * FROM test[shard 2] WHERE a &gt; 10 AND c &gt; 4)  UNION ALL&nbsp;  ...  (SELECT * FROM test[shard N] WHERE a &gt; 10 AND c &gt; 4)<\/code><\/pre>\n<p><strong>vshard way:<\/strong><\/p>\n<p>1. \u041e\u0431\u044a\u044f\u0432\u0438\u0442\u044c \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c \u0448\u0430\u0440\u0434\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u044e, \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e\u0449\u0443\u044e \u0434\u0430\u043d\u043d\u044b\u0435:<\/p>\n<pre><code class=\"lua\">--[[global]] function filtered_select(a_val, c_val)   return box.space.test:pairs({a_val}, {iterator = 'GT'})     :filter(function(x) return x.c &gt; c_val end):totable() end<\/code><\/pre>\n<p>2. \u041d\u0430 \u0440\u043e\u0443\u0442\u0435\u0440\u0435 \u043c\u043e\u0436\u043d\u043e \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439 <code>vshard.router.routeall<\/code>:<\/p>\n<pre><code class=\"lua\">local resultset = {}  local shards = vshard.router.routeall()  for _, replica in pairs(shards) do &nbsp;&nbsp;&nbsp;&nbsp;local set = replica:callro('filtered_select', {10, 4}, {timeout=5}) &nbsp;&nbsp;&nbsp;&nbsp;for _, item in ipairs(set) do &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;table.insert(resultset, item) &nbsp;&nbsp;&nbsp;&nbsp;end end<\/code><\/pre>\n<p>\u0418\u043b\u0438 \u0432\u044b\u0437\u043e\u0432\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e <code>vshard.router.map_callrw<\/code>:<\/p>\n<pre><code class=\"lua\">local resultset = {}  local res = vshard.router.map_callrw('filtered_select', {10, 4}, {timeout=5})  for _, shard_res in pairs(res) do &nbsp;&nbsp;&nbsp;&nbsp;for _, item in ipairs(shard_res[1]) do &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;table.insert(resultset, item) &nbsp;&nbsp;&nbsp;&nbsp;end end<\/code><\/pre>\n<p><strong>crud way:<\/strong><\/p>\n<pre><code class=\"lua\">local resultset = crud.select('test', {{'&gt;', 'a', 10}, {'&gt;', 'c', 4}})<\/code><\/pre>\n<p>\u0415\u0441\u043b\u0438 \u0432\u044b\u0431\u043e\u0440\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 \u0440\u0430\u0437\u043d\u044b\u0445 \u0443\u0437\u043b\u043e\u0432 \u043d\u0435 \u0432\u044b\u0437\u044b\u0432\u0430\u044e\u0442 \u043e\u0441\u043e\u0431\u044b\u0445 \u0437\u0430\u0442\u0440\u0443\u0434\u043d\u0435\u043d\u0438\u0439, \u0442\u043e \u0434\u0436\u043e\u0439\u043d\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0441\u043b\u043e\u0436\u043d\u044b\u043c\u0438. \u042d\u0442\u043e \u043f\u043b\u043e\u0445\u043e\u0439 \u043a\u0435\u0439\u0441 \u0440\u0430\u0431\u043e\u0442\u044b Tarantool, \u043d\u043e \u0438\u043d\u043e\u0433\u0434\u0430 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438. JOIN \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u044b \u043f\u043e-\u0440\u0430\u0437\u043d\u043e\u043c\u0443, \u0438 \u0434\u0430\u043b\u044c\u0448\u0435 \u2014 \u043e\u0434\u0438\u043d \u0438\u0437 \u043c\u043d\u043e\u0433\u0438\u0445 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432, \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0438\u0445 \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u043e\u0432\u0430\u0442\u044c.<\/p>\n<h4>One-shard Join<\/h4>\n<pre><code class=\"sql\">SELECT * FROM a JOIN b ON a.fk = b.pk WHERE a1 = 10&nbsp;<\/code><\/pre>\n<p><strong>vshard way:<\/strong><\/p>\n<p>1. \u041e\u0431\u044a\u044f\u0432\u0438\u0442\u044c \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c \u0448\u0430\u0440\u0434\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u044e, \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e\u0449\u0443\u044e \u0434\u0430\u043d\u043d\u044b\u0435:<\/p>\n<pre><code class=\"lua\">--[[global]] function filtered_select(a1) &nbsp;&nbsp;&nbsp;&nbsp;local resultset = {} &nbsp;&nbsp;&nbsp;&nbsp;for _, v1 in box.space.a:pairs{a1} do&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for _, v2 in box.space.b:pairs{v1.fk} do &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;table.insert(resultset, {v1.a1, v1.a2, v1.a3, v1.a4, v2.b2, v2.b3}) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end &nbsp;&nbsp;&nbsp;&nbsp;end &nbsp;&nbsp;&nbsp;&nbsp;return resultset end<\/code><\/pre>\n<p>2. \u041d\u0430 \u0440\u043e\u0443\u0442\u0435\u0440\u0435:<\/p>\n<pre><code class=\"lua\">local bucket_id = bucket_id_calc(sharding_key)  local resultset = vshard.router.callrw(bucket_id, 'filtered_select', {10}, {timeout = 5})<\/code><\/pre>\n<p><strong>crud way:<\/strong><\/p>\n<p>Crud \u0442\u0430\u043a \u043d\u0435 \u0443\u043c\u0435\u0435\u0442, \u0442\u0430\u043a \u0447\u0442\u043e \u0432\u0441\u0435\u0433\u0434\u0430 \u043d\u0443\u0436\u043d\u043e \u043f\u0438\u0441\u0430\u0442\u044c \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u043d\u0430 vshard. \u041d\u043e \u043c\u043e\u0436\u043d\u043e <strong>\u044d\u043c\u0443\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c<\/strong> \u044d\u0442\u043e\u0442 \u0437\u0430\u043f\u0440\u043e\u0441 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u0440\u0443\u0434\u0430, \u0435\u0441\u043b\u0438 \u0432\u0430\u043c \u043d\u0435 \u0442\u0430\u043a \u0432\u0430\u0436\u043d\u0430 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0438\u043b\u0438 \u0432 \u0435\u0433\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u043e\u0431\u0440\u0430\u043d\u043e \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0434\u0430\u043d\u043d\u044b\u0445:<\/p>\n<pre><code class=\"lua\">local a_data = crud.select('a', {{'=', 'a1', 10}}, {first = 10, bucket_id = bucket_id_calc(sharding_key)})  local resultset = {}  for _, v1 in ipairs(a_data) do &nbsp;&nbsp;&nbsp;&nbsp;local b_data = crud.select('b', {{'=', 'pk', v1.fk}}, {first = 10, bucket_id = bucket_id_calc(sharding_key)}) &nbsp;&nbsp;&nbsp;&nbsp;for _, v2 in ipairs(b_data) do &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;table.insert(resultset, {v1.a1, v1.a2, v1.a3, v1.a4, v2.b2, v2.b3}) &nbsp;&nbsp;&nbsp;&nbsp;end end<\/code><\/pre>\n<p>\u041e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0439\u0442\u0435 \u043f\u0435\u0440\u0444 \u044d\u0442\u043e\u0433\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u2014 \u0441\u043a\u043e\u0440\u0435\u0435 \u0432\u0441\u0435\u0433\u043e, \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043d\u0430 \u043f\u0440\u043e\u0434\u0435 \u044d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u043e\u0447\u0435\u043d\u044c \u043f\u043b\u043e\u0445\u043e.<\/p>\n<h4>Multi-instance Join<\/h4>\n<p>\u041e\u0431\u044b\u0447\u043d\u043e \u043c\u044b \u0445\u0440\u0430\u043d\u0438\u043c \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u0448\u0430\u0440\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u043c \u0432\u0438\u0434\u0435. \u042d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u043d\u0430 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0443\u0437\u043b\u0430\u0445 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u043e\u0434\u043d\u0438 \u0438 \u0442\u0435 \u0436\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b, \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u044b \u043f\u043e \u043a\u043b\u044e\u0447\u0443 \u0448\u0430\u0440\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f. \u0422\u0435\u043c \u043d\u0435 \u043c\u0435\u043d\u0435\u0435 \u0438\u043d\u043e\u0433\u0434\u0430 \u043d\u0443\u0436\u043d\u043e \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0440\u0430\u0437\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u0430 \u0440\u0430\u0437\u043d\u044b\u0445 \u0443\u0437\u043b\u0430\u0445.<\/p>\n<pre><code class=\"sql\">SELECT * FROM a[instance A] JOIN b[instance B] ON a.fk = b.pk WHERE a1 = 10&nbsp;<\/code><\/pre>\n<p>\u0422\u0430\u043a\u043e\u0439 \u0437\u0430\u043f\u0440\u043e\u0441 \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0441\u0440\u0435\u0434\u0441\u0442\u0432 crud \u0438\u043b\u0438 vshard, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0435\u0433\u043e \u043d\u0443\u0436\u043d\u043e \u043f\u0438\u0441\u0430\u0442\u044c \u043d\u0430 \u0447\u0438\u0441\u0442\u043e\u043c Tarantool.<\/p>\n<p>1. \u041e\u0431\u044a\u044f\u0432\u0438\u0442\u044c \u043d\u0430 \u0440\u0430\u0437\u043d\u044b\u0445 \u0443\u0437\u043b\u0430\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e\u0449\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0435:<\/p>\n<pre><code class=\"lua\">--[[global]] function filtered_select_a(a1) &nbsp;&nbsp;&nbsp;&nbsp;local resultset = {} &nbsp;&nbsp;&nbsp;&nbsp;for _, v1 in box.space.a:pairs{a1} do&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;table.insert(resultset, v1) &nbsp;&nbsp;&nbsp;&nbsp;end &nbsp;&nbsp;&nbsp;&nbsp;return resultset end  --[[global]] function filtered_select_b(fkeys) &nbsp;&nbsp;&nbsp;&nbsp;local resultset = {} &nbsp;&nbsp;&nbsp;&nbsp;for _, fk in ipairs(fkeys) do&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for _, v2 in box.space.b:pairs{fk} do &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;table.insert(resultset, v2) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end &nbsp;&nbsp;&nbsp;&nbsp;end &nbsp;&nbsp;&nbsp;&nbsp;return resultset end<\/code><\/pre>\n<p>2. \u041d\u0430 \u0440\u043e\u0443\u0442\u0435\u0440\u0435:<\/p>\n<pre><code class=\"lua\">local netbox = require('net.box') -- \u043c\u043e\u0434\u0443\u043b\u044c \u0434\u043b\u044f \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043a \u0443\u0437\u043b\u0430\u043c Tarantool local a_conn = netbox.connect(instance_A_URI) local a_res = a_conn:call('filtered_select_a', {10})  -- \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u043c \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u0432\u043d\u0435\u0448\u043d\u0438\u0435 \u043a\u043b\u044e\u0447\u0438 \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0438\u0445 \u0432 filtered_select_b local fkeys_map = {} for _, v in ipairs(a_res) do&nbsp; &nbsp;&nbsp;&nbsp;fkeys[v.fk] = true&nbsp; end  -- \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u043c \u043c\u0430\u043f\u0443 \u0441 \u043a\u043b\u044e\u0447\u0430\u043c\u0438 {fkey1 = true, fkey2 = true, ...} \u0432 \u0432\u0438\u0434 {'fkey1', 'fkey2', ...} local fkeys = {} for k, _ in pairs(fkeys_map) do&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;table.insert(fkeys, k) end  local b_conn = netbox.connect(instance_B_URI) local b_res = b_conn:call('filtered_select_b', {fkeys})  local resultset = {} for _, v1 in ipairs(a_data) do&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;for _, v2 in ipairs(b_data) do &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;table.insert(resultset, {v1.a1, v1.a2, v1.a3, v1.a4, v2.b2, v2.b3}) &nbsp;&nbsp;&nbsp;&nbsp;end end<\/code><\/pre>\n<h3>\u0422\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432<\/h3>\n<p>\u0412\u0441\u0435 \u0441\u043b\u043e\u0436\u043d\u044b\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0443\u0436\u043d\u043e \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c. \u041d\u0430 \u0425\u0430\u0431\u0440\u0435 \u0435\u0441\u0442\u044c \u043c\u043d\u043e\u0433\u043e \u0441\u0442\u0430\u0442\u0435\u0439 \u043f\u0440\u043e \u0442\u043e, \u043a\u0430\u043a \u043c\u044b \u0442\u0435\u0441\u0442\u0438\u0440\u0443\u0435\u043c \u0438 \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043c Tarantool, \u0442\u0430\u043a \u0447\u0442\u043e, \u0440\u0435\u0437\u044e\u043c\u0438\u0440\u0443\u044f \u043d\u0430\u043a\u043e\u043f\u043b\u0435\u043d\u043d\u044b\u0439 \u043e\u043f\u044b\u0442:<\/p>\n<ul>\n<li>\n<p>\u0441\u043e\u0431\u0438\u0440\u0430\u0435\u043c \u043c\u0435\u0442\u0440\u0438\u043a\u0438 \u043f\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0430\u043c: \u0441\u0432\u044f\u0437\u043a\u0430 <a href=\"https:\/\/github.com\/tarantool\/metrics\"><u>metrics<\/u><\/a> + Prometheus + <a href=\"https:\/\/github.com\/tarantool\/grafana-dashboard\"><u>Tarantool Grafana Dashboard<\/u><\/a> \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442 \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u0442\u044c \u0442\u043e\u0440\u043c\u043e\u0437\u044f\u0449\u0438\u0435 \u0438\u043b\u0438 \u043f\u0430\u0434\u0430\u044e\u0449\u0438\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b;<\/p>\n<\/li>\n<li>\n<p>\u043d\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435: <a href=\"https:\/\/habr.com\/ru\/companies\/vk\/articles\/563446\/\"><u>K6<\/u><\/a> \u0438\u043b\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/517488\/\"><u>Pandora<\/u><\/a> \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442 \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u0443\u0437\u043a\u0438\u0435 \u043c\u0435\u0441\u0442\u0430 \u0432 \u0432\u0430\u0448\u0438\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u0430\u0445;<\/p>\n<\/li>\n<li>\n<p>\u0442\u0435\u0441\u0442\u0438\u0440\u0443\u0435\u043c: <a href=\"https:\/\/github.com\/tarantool\/luatest\"><u>Luatest<\/u><\/a> + <a href=\"https:\/\/github.com\/tarantool\/cartridge\/tree\/master\/cartridge\/test-helpers\"><u>Cartridge test-helpers<\/u><\/a>;<\/p>\n<\/li>\n<li>\n<p>\u043e\u0442\u043b\u0430\u0436\u0438\u0432\u0430\u0435\u043c: <a href=\"https:\/\/github.com\/tarantool\/tarantool-lua-debugger-vscode\"><u>Lua-debugger \u0434\u043b\u044f VSCode<\/u><\/a>.<\/p>\n<\/li>\n<\/ul>\n<h3>\u0418\u0442\u043e\u0433\u0438<\/h3>\n<p>Tarantool \u2014 \u043e\u0447\u0435\u043d\u044c \u0433\u0438\u0431\u043a\u0438\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438. \u041f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0432\u0441\u0435 \u043f\u0440\u0438\u0432\u044b\u0447\u043d\u044b\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u0438\u0437 SQL \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u043e\u0432\u0442\u043e\u0440\u0438\u0442\u044c \u043b\u0438\u0431\u043e \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0433\u043e API Tarantool, \u043b\u0438\u0431\u043e \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0433\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u043a\u043e\u0434\u0430 \u043d\u0430 Lua. \u041a\u043e\u043c\u0431\u0438\u043d\u0438\u0440\u0443\u0439\u0442\u0435 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u044b \u0434\u043b\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u043a \u0434\u0430\u043d\u043d\u044b\u043c, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b.<\/p>\n<blockquote>\n<p>\u0421\u043a\u0430\u0447\u0430\u0442\u044c Tarantool \u043c\u043e\u0436\u043d\u043e <a href=\"https:\/\/www.tarantool.io\/ru\/download?utm_source=habr&amp;utm_medium=articles&amp;utm_campaign=2021\"><u>\u043d\u0430 \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u043c \u0441\u0430\u0439\u0442\u0435<\/u><\/a>, \u0430 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043f\u043e\u043c\u043e\u0449\u044c \u2014 <a href=\"https:\/\/t.me\/tarantoolru?utm_source=habr&amp;utm_medium=articles&amp;utm_campaign=2021\"><u>\u0432 Telegram-\u0447\u0430\u0442\u0435<\/u><\/a>.<\/p>\n<\/blockquote>\n<h3>\u041f\u043e\u043b\u0435\u0437\u043d\u044b\u0435 \u0441\u0441\u044b\u043b\u043a\u0438<\/h3>\n<ul>\n<li>\n<p><a href=\"https:\/\/habr.com\/ru\/companies\/vk\/articles\/672386\/\">\u0410\u043d\u0442\u0438\u043f\u0430\u0442\u0442\u0435\u0440\u043d\u044b \u043f\u0440\u0438 \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 Tarantool<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/www.tarantool.io\/en\/doc\/latest\/reference\/reference_rock\/vshard\/vshard_router\/#router-public-api\">\u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f vshard-router<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/github.com\/tarantool\/crud\">tarantool\/crud<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/www.tarantool.io\/en\/doc\/latest\/reference\/reference_lua\/box_index\/pairs\/\">\u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f index:pairs()<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/luafun.github.io\/\">Luafun \u2014 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0434\u043b\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0432 Tarantool<\/a><\/p>\n<\/li>\n<\/ul>\n<\/div>\n<\/div>\n<p> <!----> <!----><\/div>\n<p> <!----> <!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/companies\/vk\/articles\/739540\/\"> https:\/\/habr.com\/ru\/companies\/vk\/articles\/739540\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<p>\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0439 \u043e\u043f\u044b\u0442 \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u043a \u0434\u0430\u043d\u043d\u044b\u043c. \u041c\u044b \u043f\u0440\u0438\u0432\u044b\u043a\u043b\u0438, \u0447\u0442\u043e \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445 SQL \u0441\u0442\u0440\u043e\u044f\u0442 \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u043f\u043b\u0430\u043d \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0437\u0430 \u043d\u0430\u0441. \u0412\u043e \u043c\u043d\u043e\u0433\u0438\u0445 \u0431\u0430\u0437\u0430\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 NoSQL \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u043b\u043e\u0436\u0438\u0442\u0441\u044f \u043d\u0430 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430. \u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u0416\u043e\u0440\u0430, \u0438 \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 <a href=\"https:\/\/habr.com\/ru\/users\/yngvar_antonsson\/\">yngvar_antonsson<\/a> \u043c\u044b \u043f\u0440\u043e\u0432\u0435\u043b\u0438 \u043c\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0437\u0430 \u0430\u0443\u0434\u0438\u0442\u043e\u043c \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0443 \u043d\u0430\u0448\u0438\u0445 \u0437\u0430\u043a\u0430\u0437\u0447\u0438\u043a\u043e\u0432. \u0421\u0435\u0433\u043e\u0434\u043d\u044f \u043c\u044b \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0435\u043c \u043f\u0440\u043e \u043f\u0435\u0440\u0444\u043e\u043c\u0430\u043d\u0441, \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u0438 \u0442\u044f\u0436\u0435\u043b\u044b\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 Tarantool. \u0411\u0443\u0434\u0435\u0442 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e \u0432\u0441\u0435\u043c, \u043a\u0442\u043e \u0443\u0436\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0438\u043b\u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 Tarantool, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0442\u0435\u043c, \u043a\u0442\u043e \u0441\u0442\u0440\u043e\u0438\u0442 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u043d\u044b\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u043f\u043e\u0432\u0435\u0440\u0445 \u0441\u0432\u043e\u0438\u0445 \u0411\u0414.<\/p>\n<figure class=\"full-width\">\n<div><figcaption><em>\u0418\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043e Midjourney<\/em><\/figcaption><\/div>\n<\/figure>\n<h3>\u0414\u0438\u0441\u043a\u043b\u0435\u0439\u043c\u0435\u0440<\/h3>\n<p>\u041d\u0435 \u0432\u0441\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u0432 \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u0445 \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u043d\u0430 \u043f\u0440\u043e\u0434\u0430\u0445. \u041f\u043e\u043c\u043d\u0438\u0442\u0435, \u0447\u0442\u043e Tarantool \u0432\u0441\u0435 \u0435\u0449\u0435 \u043e\u0434\u043d\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u044b\u0439, \u0430 <code>select(nil)<\/code> \u0438\u043b\u0438 \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 \u0446\u0438\u043a\u043b \u0431\u0435\u0437 \u0432\u044b\u0437\u043e\u0432\u0430 <code>fiber.yield()<\/code> \u0441\u043b\u043e\u043c\u0430\u0435\u0442 \u0432\u0430\u043c \u0438\u043d\u0441\u0442\u0430\u043d\u0441.<\/p>\n<p>\u0412 \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u0445 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f Tarantool 2.11 \u0441 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0430\u043c\u0438:<\/p>\n<pre><code class=\"lua\">box.schema.space.create('test') box.space.test:format{     {name = 'a', type = 'integer'},     {name = 'b', type = 'integer'},     {name = 'c', type = 'integer'}, }  box.space.test:create_index('pk', {parts={'a', 'b'}}) box.space.test:create_index('a_index', {parts={'a'}}) box.space.test:create_index('b_index', {parts={'b'}})<\/code><\/pre>\n<p>\u0418\u043b\u0438 \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u044b\u0439 SQL-\u0437\u0430\u043f\u0440\u043e\u0441:<\/p>\n<pre><code class=\"sql\">CREATE TABLE test (     a INTEGER NOT NULL,     b INTEGER NOT NULL,     c INTEGER NOT NULL     PRIMARY KEY (a, b) );  CREATE INDEX a_index ON test(a); CREATE INDEX b_index ON test(b);<\/code><\/pre>\n<p>\u0412\u0435\u0437\u0434\u0435, \u0433\u0434\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0434\u0440\u0443\u0433\u0438\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0438 \u0438\u043d\u0434\u0435\u043a\u0441\u044b, \u0431\u0443\u0434\u0435\u0442 \u0443\u043a\u0430\u0437\u0430\u043d\u043e \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e. \u0412\u0441\u0435 \u043f\u0441\u0435\u0432\u0434\u043e-SQL-\u0437\u0430\u043f\u0440\u043e\u0441\u044b \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u044b \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u0430, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0436\u043d\u043e \u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0434\u043b\u044f \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u044f, \u0447\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432 Lua-\u043a\u043e\u0434\u0435.<\/p>\n<h3>\u0412\u044b\u0431\u043e\u0440\u043a\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0441 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f\u043c\u0438<\/h3>\n<p>\u041e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u043c \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u043c \u043e\u0442\u0431\u043e\u0440\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u043b\u044e\u0431\u043e\u0439 \u0411\u0414 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u044f \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443. Tarantool \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u044d\u0442\u043e \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>pairs<\/code>. \u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u043a\u043b\u044e\u0447, \u043f\u043e \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0442\u044c, \u0430 \u0432\u0442\u043e\u0440\u044b\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u043c \u043c\u043e\u0436\u043d\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0442\u0438\u043f \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0438 \u043f\u043e \u0441\u043f\u0435\u0439\u0441\u0443. \u0418\u043d\u0434\u0435\u043a\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0438, \u044f\u0432\u043d\u043e \u043d\u0435 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f, \u043d\u043e \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u044d\u0442\u043e \u043f\u0435\u0440\u0432\u0438\u0447\u043d\u044b\u0439 \u043a\u043b\u044e\u0447 \u0441\u043f\u0435\u0439\u0441\u0430 (\u0432 Tarantool \u044d\u0442\u043e <strong>\u043f\u0435\u0440\u0432\u044b\u0439 <\/strong>\u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0439 \u0438\u043d\u0434\u0435\u043a\u0441 \u0434\u043b\u044f \u0441\u043f\u0435\u0439\u0441\u0430).<\/p>\n<pre><code class=\"sql\">SELECT * FROM test WHERE a &gt; 10 AND b &gt; 5 LIMIT 10<\/code><\/pre>\n<pre><code class=\"lua\">box.space.test:pairs({10, 5}, {iterator = 'GT'}):take_n(10):totable() box.space.test:select({10, 5}, {iterator = 'GT', limit = 10})<\/code><\/pre>\n<p>\u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 <code>iterator<\/code> \u0432 \u0437\u0430\u043f\u0440\u043e\u0441\u0430\u0445 \u0432\u044b\u0448\u0435: \u043e\u043d \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043d\u0430 \u0442\u0438\u043f \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0432\u044b\u0431\u043e\u0440\u043a\u0438 \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443, \u0438 \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0438\u0437 \u043f\u0435\u0440\u0432\u044b\u0445 \u0431\u0443\u043a\u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0433\u043e \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u0430 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f: GT \u2014 greater than.<\/p>\n<p>\u0414\u043b\u044f \u0444\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u0438 \u043f\u043e \u043f\u043e\u043b\u044f\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435 \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u0432 \u0438\u043d\u0434\u0435\u043a\u0441\u0435, \u043c\u043e\u0436\u043d\u043e \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439 <code>filter<\/code>:<\/p>\n<pre><code class=\"sql\">SELECT * FROM test WHERE a &gt; 10 AND c &gt; 4<\/code><\/pre>\n<pre><code class=\"lua\"> box.space.test:pairs({10}, {iterator = 'GT'})   :filter(function(x) return x.c &gt; 4 end)   :take_n(10)   :totable()<\/code><\/pre>\n<h3>\u041f\u0430\u0433\u0438\u043d\u0430\u0446\u0438\u044f<\/h3>\n<p>\u0412 \u0441\u0442\u0430\u0442\u044c\u0435 \u043f\u0440\u043e <a href=\"https:\/\/habr.com\/ru\/companies\/vk\/articles\/672386\/\"><u>\u0430\u043d\u0442\u0438\u043f\u0430\u0442\u0442\u0435\u0440\u043d\u044b \u0432 Tarantool<\/u><\/a> \u043c\u044b \u043f\u0438\u0441\u0430\u043b\u0438, \u0447\u0442\u043e \u043f\u0430\u0433\u0438\u043d\u0430\u0446\u0438\u044f \u0438 SELECT \u0431\u0435\u0437 \u0443\u0441\u043b\u043e\u0432\u0438\u0439 \u2014 \u044d\u0442\u043e \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043e\u043f\u0430\u0441\u043d\u0430\u044f \u0432\u0435\u0449\u044c. \u0412 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 (2.11 \u043d\u0430 \u043c\u043e\u043c\u0435\u043d\u0442 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0441\u0442\u0430\u0442\u044c\u0438) \u0432\u0441\u0435 \u0441\u0442\u0430\u043b\u043e \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043b\u0443\u0447\u0448\u0435:<\/p>\n<p>1. Tarantool \u0442\u0435\u043f\u0435\u0440\u044c \u043f\u0438\u0448\u0435\u0442 \u0432 \u043b\u043e\u0433\u0438 \u043e \u043f\u043e\u0442\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u0434\u043e\u043b\u0433\u0438\u0445 \u0441\u0435\u043b\u0435\u043a\u0442\u0430\u0445:<\/p>\n<pre><code class=\"lua\">box.space.test:select(nil) 2023-03-15 20:40:55.717 [23511] main\/103\/interactive C&gt; Potentially long select from space 'test' (512)<\/code><\/pre>\n<p>2. \u0421 \u043d\u043e\u0432\u044b\u043c\u0438 \u043e\u043f\u0446\u0438\u044f\u043c\u0438 \u043c\u043e\u0436\u043d\u043e \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0430\u0442\u044c \u0432\u0440\u0435\u043c\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0444\u0430\u0439\u0431\u0435\u0440\u0430. \u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0442\u044c \u0432\u0440\u0435\u043c\u044f, \u043f\u043e\u0441\u043b\u0435 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0432 \u043b\u043e\u0433\u0430\u0445 \u043f\u043e\u044f\u0432\u0438\u0442\u0441\u044f \u043f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u0435, \u0447\u0442\u043e\u0431\u044b \u0434\u0435\u0442\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u043b\u0438\u043d\u043d\u044b\u0435 \u0446\u0438\u043a\u043b\u044b \u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438. \u0418\u043b\u0438 \u0432\u0440\u0435\u043c\u044f, \u043a\u043e\u0433\u0434\u0430 \u0446\u0438\u043a\u043b \u043f\u0440\u0435\u0440\u0432\u0435\u0442\u0441\u044f \u0441 \u043e\u0448\u0438\u0431\u043a\u043e\u0439:<\/p>\n<pre><code class=\"lua\">-- \u0433\u0434\u0435-\u0442\u043e \u0432 init.lua \u0444\u0430\u0439\u043b\u0435 compat.fiber_slice_default = 'new' fiber.set_max_slice{warn = 1, err = 3}  -- \u0432 \u043a\u043e\u0434\u0435 \u0432\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f: for k, v in box.space.test:pairs() do &nbsp; &nbsp;      -- smth end  2023-03-15 21:41:59.157 [28484] main\/103\/interactive fiber.h:1054 W&gt; fiber has not  yielded for more than 1.000 seconds ----  error: fiber slice is exceeded ...<\/code><\/pre>\n<p>3. \u041f\u0430\u0433\u0438\u043d\u0430\u0446\u0438\u044e \u043c\u043e\u0436\u043d\u043e \u0434\u0435\u043b\u0430\u0442\u044c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 \u0432 \u0432\u044b\u0437\u043e\u0432\u0435 select:<\/p>\n<pre><code class=\"lua\">local res, pos, cnt = {}, nil, 0  while cnt &lt; box.space.test:count() do&nbsp; &nbsp;      res, pos = box.space.test:select({},  &nbsp; &nbsp; &nbsp; &nbsp; {limit = 1000, after = pos, fetch_pos = true})&nbsp; &nbsp;      -- do smth with res&nbsp; &nbsp;      cnt = cnt + #res  end<\/code><\/pre>\n<p>4. \u0412\u0441\u0435 \u0435\u0449\u0435 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0434\u043b\u044f \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u044f \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0438:<\/p>\n<pre><code class=\"lua\">local last_key, cnt = nil, 0 while cnt &lt; box.space.test:count() do&nbsp; &nbsp;      res = box.space.test:pairs(last_key, {iterator = 'GE'}):take_n(1000):totable()&nbsp; &nbsp;     -- do smth with res&nbsp; &nbsp;      cnt = cnt + #res&nbsp; &nbsp;      local last_tuple = res[#res]&nbsp; &nbsp;      last_key = {last_tuple.a, last_tuple.b} end<\/code><\/pre>\n<p>5. \u0410 Enterprise-\u0432\u0435\u0440\u0441\u0438\u044f \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442 \u0432\u0430\u043c \u0441\u0434\u0435\u043b\u0430\u0442\u044c Readview \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c fiber.yield \u0432 \u0446\u0438\u043a\u043b\u0435, \u043d\u0435 \u0431\u0435\u0441\u043f\u043e\u043a\u043e\u044f\u0441\u044c \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u043e\u043c\u0435\u043d\u044f\u044e\u0442\u0441\u044f \u043c\u0435\u0436\u0434\u0443 \u0432\u044b\u0437\u043e\u0432\u0430\u043c\u0438:<\/p>\n<pre><code class=\"lua\">rw = box.read_view.open{name = 'test_rw'} while cnt &lt; box.space.test:count() do&nbsp; &nbsp;      res, pos = rw.space.test:select({}, {limit = 1000, after = pos, fetch_pos = true})&nbsp; &nbsp;      -- do smth with res&nbsp; &nbsp;      fiber.yield() &nbsp; &nbsp;      cnt = cnt + #res  end rw:close()<\/code><\/pre>\n<p>\u0410 \u0435\u0449\u0435 \u0443 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 <code>after<\/code> \u0435\u0441\u0442\u044c \u043e\u0433\u0440\u043e\u043c\u043d\u043e\u0435 \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u043e: \u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u043f\u043e \u0441\u0435\u0442\u0438 \u0438 \u0434\u0435\u043b\u0430\u0442\u044c \u0443\u0434\u043e\u0431\u043d\u0435\u0435 \u0447\u0442\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u0430\u0447\u043a\u0430\u043c\u0438.<\/p>\n<h3>\u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430<\/h3>\n<p>\u0412 Tarantool, \u043a\u0430\u043a \u0438 \u0432 \u043b\u044e\u0431\u043e\u0439 SQL-\u0411\u0414, \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u043f\u0435\u0440\u0435\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0432\u0441\u0435\u0433\u0434\u0430 \u043f\u043b\u043e\u0445\u043e \u0441\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438. \u0421\u0430\u043c\u044b\u0439 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u043b\u0438\u0448\u043d\u0435\u0439 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u2014 \u0434\u0435\u043b\u0430\u0442\u044c \u0437\u0430\u043f\u0440\u043e\u0441 \u0441 \u0443\u0447\u0435\u0442\u043e\u043c \u0442\u043e\u0439 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0440\u0430\u0441\u043f\u043e\u043b\u0430\u0433\u0430\u044e\u0442\u0441\u044f \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u0438\u043d\u0434\u0435\u043a\u0441\u0435.&nbsp;<\/p>\n<p>\u0418\u043d\u0434\u0435\u043a\u0441 <code>B+*-tree<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f \u0432 Tarantool \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0443\u0436\u0435 \u0432 \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u043c \u0432\u0438\u0434\u0435. \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043f\u0440\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u0432 \u0446\u0435\u043b\u043e\u043c \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0447\u0438\u0442\u0430\u0442\u044c <a href=\"https:\/\/habr.com\/ru\/companies\/postgrespro\/articles\/330544\/\"><u>\u0437\u0434\u0435\u0441\u044c<\/u><\/a>, \u0430 \u043f\u0440\u043e \u0438\u0445 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u0432 Tarantool <a href=\"https:\/\/habr.com\/ru\/companies\/vk\/articles\/505880\/\"><u>\u0437\u0434\u0435\u0441\u044c<\/u><\/a>.<\/p>\n<pre><code class=\"sql\">SELECT * FROM test ORDER BY b LIMIT 10<\/code><\/pre>\n<pre><code class=\"lua\">box.space.test.index.b_index:select({}, {limit = 10})  -- ordered<\/code><\/pre>\n<p>\u0411\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u043c\u0443 \u0442\u0438\u043f\u0443 \u0438\u0442\u0435\u0440\u0430\u0442\u043e\u0440\u0430 Tarantool \u0442\u0430\u043a\u0436\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435:<\/p>\n<pre><code class=\"sql\">SELECT * FROM test ORDER BY b DESC LIMIT 10<\/code><\/pre>\n<pre><code class=\"lua\">box.space.test.index.b_index:select({}, {limit = 10, iterator = 'REQ' }) -- reverse ordered<\/code><\/pre>\n<p>\u0412\u0430\u0436\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442: \u0432\u044b\u0431\u043e\u0440\u043a\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432\u0441\u0435\u0433\u0434\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442\u044c \u0432 \u043e\u0434\u043d\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435. \u0418\u0437-\u0437\u0430 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0441\u0430\u043c\u043e\u0433\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0430 \u0432\u044b \u043d\u0435 \u0441\u043c\u043e\u0436\u0435\u0442\u0435 \u043e\u0442\u043e\u0431\u0440\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u0434\u0440\u0443\u0433\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435, \u0447\u0435\u043c \u0442\u043e\u0442, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043e\u043d\u0438 \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u0432 \u0438\u043d\u0434\u0435\u043a\u0441\u0435. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043d\u0430 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0435 \u043d\u0438\u0436\u0435 \u0435\u0441\u043b\u0438 \u0435\u0441\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u043f\u043e \u043f\u043e\u043b\u044f\u043c <code>(a, b)<\/code>, \u0442\u043e \u0437\u0430\u043f\u0440\u043e\u0441 \u0432\u0438\u0434\u0430 <code>a &gt;= a2<\/code> \u043f\u0440\u043e\u0439\u0434\u0435\u0442 \u043f\u043e \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u043c \u0437\u0430\u043f\u0438\u0441\u044f\u043c \u0432 \u0438\u043d\u0434\u0435\u043a\u0441\u0435, \u0430 \u0437\u0430\u043f\u0440\u043e\u0441\u0443 b &gt;= b2 \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0431\u044b \u043f\u0435\u0440\u0435\u0441\u043a\u0430\u043a\u0438\u0432\u0430\u0442\u044c \u043c\u0435\u0436\u0434\u0443 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u043c\u0438 \u0442\u0430\u043f\u043b\u0430\u043c\u0438 \u0432 \u0438\u043d\u0434\u0435\u043a\u0441\u0435, \u0447\u0442\u043e \u0432 Tarantool \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e.<\/p>\n<figure class=\"full-width\"><\/figure>\n<p>\u0412\u0441\u0435 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0441\u043b\u043e\u0436\u043d\u0435\u0435, \u043a\u043e\u0433\u0434\u0430 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0443\u0436\u043d\u043e \u0434\u0430\u043d\u043d\u044b\u0435, \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0435 \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u2014 \u0437\u0434\u0435\u0441\u044c \u043c\u044b \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u0438\u0437 memtx_memory \u0432 lua_memory:<\/p>\n<figure class=\"full-width\">\n<div><figcaption> <\/figcaption><\/div>\n<\/figure>\n<pre><code class=\"sql\">data := SELECT * FROM test1 JOIN test_2 ON cond ORDER BY b DESC LIMIT 10<\/code><\/pre>\n<pre><code class=\"lua\">table.sort(data, comparator)<\/code><\/pre>\n<p>\u0422\u0430\u043a\u0430\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u044f\u0442\u044c \u043c\u043d\u043e\u0433\u043e \u043f\u0430\u043c\u044f\u0442\u0438 \u0438 \u043e\u0442\u0431\u0438\u0440\u0430\u0442\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u0443 \u0434\u0440\u0443\u0433\u0438\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u043e\u0434\u043d\u043e\u0433\u043e \u043f\u043e\u0442\u043e\u043a\u0430 \u0432\u0432\u0438\u0434\u0443 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b Tarantool. \u041a\u0430\u043a\u0438\u0435 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u044f?<\/p>\n<ol>\n<li>\n<p>\u041e\u0442\u0434\u0430\u0442\u044c \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0443 \u0432 \u0432\u044b\u0448\u0435\u043b\u0435\u0436\u0430\u0449\u0435\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435: \u043c\u043d\u043e\u0433\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u044b\u0439 Go, Python \u0438\u043b\u0438 Java \u0441\u043f\u0440\u0430\u0432\u044f\u0442\u0441\u044f \u0441 \u044d\u0442\u0438\u043c \u043b\u0443\u0447\u0448\u0435.<\/p>\n<\/li>\n<li>\n<p>\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c <code>yield<\/code> \u0432 \u043a\u043e\u043c\u043f\u0430\u0440\u0430\u0442\u043e\u0440. \u042d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442 \u043e\u0442\u0434\u0430\u0442\u044c \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0434\u0440\u0443\u0433\u0438\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e \u0441 \u043a\u043e\u0434\u043e\u043c \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438.<\/p>\n<\/li>\n<\/ol>\n<h3>\u0413\u0440\u0443\u043f\u043f\u0438\u0440\u043e\u0432\u043a\u0430<\/h3>\n<p>Tarantool \u043d\u0435 \u0443\u043c\u0435\u0435\u0442 \u0430\u0433\u0440\u0435\u0433\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435, \u0442\u0430\u043a \u0447\u0442\u043e \u044d\u0442\u043e \u0432\u0441\u0435\u0433\u0434\u0430 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0437\u0430\u0434\u0430\u0447\u0435\u0439 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 \u0438\u043b\u0438 \u0432\u044b\u0448\u0435\u043b\u0435\u0436\u0430\u0449\u0435\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u0412\u043e\u0442 \u0442\u0430\u043a, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u043c\u0430\u043a\u0441\u0438\u043c\u0443\u043c \u0432 \u0433\u0440\u0443\u043f\u043f\u0435 \u0438\u0437 \u0434\u0432\u0443\u0445 \u043f\u043e\u043b\u0435\u0439:<\/p>\n<pre><code class=\"sql\">SELECT MAX(c) FROM test GROUP BY a, b<\/code><\/pre>\n<pre><code class=\"lua\">-- loop way local aggregate = {} for _, v in box.space.test:pairs() do &nbsp; &nbsp; local key = v.a .. v.b&nbsp; &nbsp;      aggregate[key] = max(aggregate[key], v.c) end  -- luafun way local aggregate = box.space.test:pairs():reduce(&nbsp; &nbsp;      function(acc, x) &nbsp; &nbsp; &nbsp; &nbsp;          local key = x.a .. x.b&nbsp; &nbsp; &nbsp; &nbsp;          acc[key] = max(acc[key], x.c) &nbsp; &nbsp; &nbsp; &nbsp;          return acc &nbsp; &nbsp;  end, {})<\/code><\/pre>\n<h3>Nested Loop Join<\/h3>\n<p>\u0414\u0436\u043e\u0439\u043d\u044b \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u043c\u0438 \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0430\u043c\u0438 Tarantool \u0442\u043e\u0436\u0435 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f, \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0443\u0436\u043d\u043e \u043f\u0438\u0441\u0430\u0442\u044c \u043a\u043e\u0434. \u041c\u043e\u0436\u043d\u043e \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f Lua-\u0442\u0430\u0431\u043b\u0438\u0446\u0430\u043c\u0438, \u0435\u0441\u043b\u0438 \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u044b\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 JOIN \u0431\u0443\u0434\u0435\u0442 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u043c. \u0418\u043b\u0438 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u044b\u0439 \u0442\u0430\u0440\u0430\u043d\u0442\u0443\u043b\u044c\u043d\u044b\u0439 \u0441\u043f\u0435\u0439\u0441, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u043c \u0441\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 JOIN, \u043a\u0430\u043a \u0432 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043d\u0438\u0436\u0435:<\/p>\n<pre><code class=\"sql\">SELECT a1,a2,a3,fk,b2,b3 FROM a JOIN b ON a.fk = b.pk WHERE a2 &gt; 5 AND b3 &lt; 10&nbsp;<\/code><\/pre>\n<p>\u0412\u0430\u0440\u0438\u0430\u043d\u0442 \u0441 \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u044b\u043c \u0441\u043f\u0435\u0439\u0441\u043e\u043c:<\/p>\n<pre><code class=\"lua\">box.schema.space.create('tmp', {temporary = true})  box.space.tmp:create_index('tmp_pk', {parts={{field = 1, type = 'string'}, {field = 4, type = 'string'}}})  for _, v1 in box.space.a:pairs():filter(function(x) return x.a2 &gt; 5 end) do&nbsp; &nbsp;      local a1, a2, a3, a4 = v1:totable()&nbsp; &nbsp;      box.begin()&nbsp; &nbsp;      for _, v2 in box.space.b:pairs({a4}):filter(function(x) return x.b3 &lt; 10 end) do&nbsp;    &nbsp; &nbsp; &nbsp;local _, b2, b3 = v2:totable()&nbsp; &nbsp; &nbsp; &nbsp;         box.space.tmp:insert{a1,a2,a3,a4,b2,b3}&nbsp; &nbsp;      end&nbsp; &nbsp; box.commit() end  local res = box.space.tmp:select{} -- do smth with res  box.space.tmp:drop()<\/code><\/pre>\n<p>\u0412\u0430\u0440\u0438\u0430\u043d\u0442 \u0441 Lua-\u0442\u0430\u0431\u043b\u0438\u0446\u0435\u0439 \u0434\u043b\u044f \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043c\u0430 \u0434\u0430\u043d\u043d\u044b\u0445:<\/p>\n<pre><code class=\"lua\">local res = {}  for _, v1 in box.space.a:pairs():filter(function(x) return x.a2 &gt; 5 end) do&nbsp; &nbsp;      local a1, a2, a3, a4 = v1:totable()&nbsp; &nbsp;      for _, v2 in box.space.b:pairs({a4}):filter(function(x) return x.b3 &lt; 10 end) do &nbsp; &nbsp; &nbsp; &nbsp; local _, b2, b3 = v2:totable()&nbsp; &nbsp; &nbsp; &nbsp;          table.insert(res, {a1,a2,a3,a4,b2,b3})&nbsp; &nbsp;      end end<\/code><\/pre>\n<h3>\u041a\u043b\u0430\u0441\u0442\u0435\u0440\u043d\u044b\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b<\/h3>\n<p>\u0417\u0430\u043f\u0440\u043e\u0441\u044b \u0441\u0442\u0430\u043d\u043e\u0432\u044f\u0442\u0441\u044f \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0435\u0435, \u0435\u0441\u043b\u0438 \u043e\u043d\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0442\u0441\u044f \u043d\u0430 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0445 \u0443\u0437\u043b\u0430\u0445. \u041f\u0440\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0432 \u0442\u0430\u043a\u0438\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u0430\u0445 \u043c\u044b \u0443\u0436\u0435 \u0433\u043e\u0432\u043e\u0440\u0438\u043b\u0438 \u0432 \u043f\u0440\u043e\u0448\u043b\u044b\u0439 \u0440\u0430\u0437, \u0430 \u0441\u0435\u0433\u043e\u0434\u043d\u044f \u0431\u0443\u0434\u0443\u0442 \u043f\u0440\u0438\u043c\u0435\u0440\u044b.<\/p>\n<p>\u041f\u043e\u0447\u0442\u0438 \u0432\u0441\u0435 \u0448\u0430\u0440\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u044b Tarantool \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u044b \u043d\u0430 \u0431\u0430\u0437\u0435 \u043c\u043e\u0434\u0443\u043b\u044f vshard. \u0422\u0430\u043a\u0436\u0435 \u0441 \u043d\u0435\u0434\u0430\u0432\u043d\u0435\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0432 Tarantool \u043f\u043e\u044f\u0432\u0438\u043b\u0441\u044f \u043c\u043e\u0434\u0443\u043b\u044c crud, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c \u0441 vshard-\u0437\u0430\u043f\u0440\u043e\u0441\u0430\u043c\u0438. \u0414\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0438\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u044b \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u043e\u0431\u043e\u0438\u0445 \u043f\u043e\u0434\u0445\u043e\u0434\u043e\u0432 \u2014 pure vshard calls \u0438 crud. \u041d\u0430\u0447\u043d\u0435\u043c \u0441 \u043f\u0440\u043e\u0441\u0442\u043e\u0433\u043e.<\/p>\n<h4>One shard select<\/h4>\n<p>\u0415\u0441\u043b\u0438 \u043c\u044b \u0437\u043d\u0430\u0435\u043c \u043a\u043b\u044e\u0447 \u0448\u0430\u0440\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0437\u0430\u043f\u0438\u0441\u0435\u0439, \u043f\u043e \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u0445\u043e\u0442\u0438\u043c \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u044b\u0431\u043e\u0440\u043a\u0443, \u0442\u043e \u043c\u043e\u0436\u0435\u043c \u0434\u0435\u043b\u0430\u0442\u044c \u0431\u043e\u043b\u0435\u0435 \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b:<\/p>\n<pre><code class=\"sql\">SELECT * FROM test WHERE a = 10 LIMIT 10<\/code><\/pre>\n<p><strong>vshard way:<\/strong><\/p>\n<pre><code class=\"lua\">local bucket_id = bucket_id_calc(sharding_key)  local resultset = vshard.router.callrw(bucket_id, 'box.space.test:select', {{10},  {limit = 10}}, {timeout = 5})<\/code><\/pre>\n<p><strong>crud way:<\/strong><\/p>\n<pre><code class=\"lua\">local resultset = crud.select('test', {{'=', 'a', 10}}, {first = 10, bucket_id = bucket_id_calc(sharding_key)})<\/code><\/pre>\n<h4>Multishard select<\/h4>\n<pre><code class=\"sql\">(SELECT * FROM test[shard 1] WHERE a &gt; 10 AND c &gt; 4)  UNION ALL  (SELECT * FROM test[shard 2] WHERE a &gt; 10 AND c &gt; 4)  UNION ALL&nbsp;  ...  (SELECT * FROM test[shard N] WHERE a &gt; 10 AND c &gt; 4)<\/code><\/pre>\n<p><strong>vshard way:<\/strong><\/p>\n<p>1. \u041e\u0431\u044a\u044f\u0432\u0438\u0442\u044c <\/p>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-348562","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/348562","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=348562"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/348562\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=348562"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=348562"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=348562"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}