mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-11-19 06:01:57 +00:00
Merge remote-tracking branch 'upstream/master' into fix25
This commit is contained in:
commit
d01212f41c
@ -0,0 +1,46 @@
|
||||
join_use_nulls = 1
|
||||
1 1
|
||||
2 2
|
||||
-
|
||||
1 1
|
||||
-
|
||||
1 1 1 1
|
||||
-
|
||||
1 1
|
||||
2 2
|
||||
-
|
||||
-
|
||||
-
|
||||
1 1 1 1
|
||||
-
|
||||
-
|
||||
-
|
||||
-
|
||||
-
|
||||
join_use_nulls = 0
|
||||
1 1
|
||||
2 2
|
||||
-
|
||||
1 1
|
||||
-
|
||||
1 1 1 1
|
||||
-
|
||||
1 1
|
||||
2 2
|
||||
-
|
||||
1 1 1 1
|
||||
2 2 0 0
|
||||
-
|
||||
1 1 1 1
|
||||
2 2 0 0
|
||||
-
|
||||
1 1 1 1
|
||||
-
|
||||
-
|
||||
-
|
||||
1 1 0 0
|
||||
2 2 0 0
|
||||
-
|
||||
1 1 1 1
|
||||
2 2 0 0
|
||||
-
|
@ -0,0 +1,64 @@
|
||||
drop table if exists t;
|
||||
drop table if exists s;
|
||||
|
||||
create table t(a Int64, b Int64) engine = Memory;
|
||||
create table s(a Int64, b Int64) engine = Memory;
|
||||
|
||||
insert into t values(1,1);
|
||||
insert into t values(2,2);
|
||||
insert into s values(1,1);
|
||||
|
||||
select 'join_use_nulls = 1';
|
||||
set join_use_nulls = 1;
|
||||
select * from t left outer join s using (a,b) order by t.a;
|
||||
select '-';
|
||||
select * from t join s using (a,b);
|
||||
select '-';
|
||||
select * from t join s on (t.a=s.a and t.b=s.b);
|
||||
select '-';
|
||||
select t.* from t left join s on (t.a=s.a and t.b=s.b) order by t.a;
|
||||
select '-';
|
||||
-- select t.*, s.* from t left join s on (t.a=s.a and t.b=s.b); -- TODO
|
||||
select '-';
|
||||
-- select t.*, s.* from t left join s on (s.a=t.a and t.b=s.b); -- TODO
|
||||
select '-';
|
||||
select t.*, s.* from t right join s on (t.a=s.a and t.b=s.b);
|
||||
select '-';
|
||||
-- select * from t left outer join s using (a,b) where s.a is null; -- TODO
|
||||
select '-';
|
||||
-- select * from t left outer join s on (t.a=s.a and t.b=s.b) where s.a is null; -- TODO
|
||||
select '-';
|
||||
-- select t.*, s.* from t left join s on (s.a=t.a and t.b=s.b and t.a=toInt64(2)) order by t.a; -- TODO
|
||||
select '-';
|
||||
-- select t.*, s.* from t left join s on (s.a=t.a); -- TODO
|
||||
select '-';
|
||||
select t.*, s.* from t left join s on (t.b=toInt64(2) and s.a=t.a) where s.b=2;
|
||||
|
||||
select 'join_use_nulls = 0';
|
||||
set join_use_nulls = 0;
|
||||
select * from t left outer join s using (a,b) order by t.a;
|
||||
select '-';
|
||||
select * from t join s using (a,b);
|
||||
select '-';
|
||||
select * from t join s on (t.a=s.a and t.b=s.b);
|
||||
select '-';
|
||||
select t.* from t left join s on (t.a=s.a and t.b=s.b) order by t.a;
|
||||
select '-';
|
||||
select t.*, s.* from t left join s on (t.a=s.a and t.b=s.b) order by t.a;
|
||||
select '-';
|
||||
select t.*, s.* from t left join s on (s.a=t.a and t.b=s.b) order by t.a;
|
||||
select '-';
|
||||
select t.*, s.* from t right join s on (t.a=s.a and t.b=s.b);
|
||||
select '-';
|
||||
-- select * from t left outer join s using (a,b) where s.a is null; -- TODO
|
||||
select '-';
|
||||
-- select * from t left outer join s on (t.a=s.a and t.b=s.b) where s.a is null; -- TODO
|
||||
select '-';
|
||||
select t.*, s.* from t left join s on (s.a=t.a and t.b=s.b and t.a=toInt64(2)) order by t.a;
|
||||
select '-';
|
||||
select t.*, s.* from t left join s on (s.a=t.a) order by t.a;
|
||||
select '-';
|
||||
select t.*, s.* from t left join s on (t.b=toInt64(2) and s.a=t.a) where s.b=2;
|
||||
|
||||
drop table t;
|
||||
drop table s;
|
@ -0,0 +1,11 @@
|
||||
<Trace>
|
||||
.
|
||||
<Debug>
|
||||
.
|
||||
<Information>
|
||||
.
|
||||
<Error>
|
||||
-
|
||||
.
|
||||
.
|
||||
.
|
20
dbms/tests/queries/0_stateless/00965_logs_level_bugfix.sh
Executable file
20
dbms/tests/queries/0_stateless/00965_logs_level_bugfix.sh
Executable file
@ -0,0 +1,20 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
CURDIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)
|
||||
. $CURDIR/../shell_config.sh
|
||||
|
||||
$CLICKHOUSE_BINARY client --send_logs_level="trace" --query="SELECT 1" 2>&1 | awk '{ print $8 }' | grep "Trace" | head -n 1
|
||||
echo "."
|
||||
$CLICKHOUSE_BINARY client --send_logs_level="debug" --query="SELECT 1" 2>&1 | awk '{ print $8 }' | grep "Debug" | head -n 1
|
||||
echo "."
|
||||
$CLICKHOUSE_BINARY client --send_logs_level="information" --query="SELECT 1" 2>&1 | awk '{ print $8 }' | grep "Information" | head -n 1
|
||||
echo "."
|
||||
$CLICKHOUSE_BINARY client --send_logs_level="error" --query="SELECT throwIf(1)" 2>&1 | awk '{ print $8 }' | grep "Error" | head -n 1
|
||||
echo "-"
|
||||
$CLICKHOUSE_BINARY client --send_logs_level="debug" --query="SELECT 1" 2>&1 | awk '{ print $8 }' | grep "Trace" | head -n 1
|
||||
echo "."
|
||||
$CLICKHOUSE_BINARY client --send_logs_level="information" --query="SELECT 1" 2>&1 | awk '{ print $8 }' | grep "Debug\|Trace" | head -n 1
|
||||
echo "."
|
||||
$CLICKHOUSE_BINARY client --send_logs_level="error" --query="SELECT throwIf(1)" 2>&1 | awk '{ print $8 }' | grep "Debug\|Trace\|Information" | head -n 1
|
||||
echo "."
|
||||
$CLICKHOUSE_BINARY client --send_logs_level="None" --query="SELECT throwIf(1)" 2>&1 | awk '{ print $8 }' | grep "Debug\|Trace\|Information\|Error" | head -n 1
|
@ -1,24 +0,0 @@
|
||||
1
|
||||
1
|
||||
1
|
||||
1
|
||||
1
|
||||
1
|
||||
<Debug>
|
||||
<Trace>
|
||||
<Debug>
|
||||
|
||||
|
||||
|
||||
|
||||
<Information>
|
||||
<Debug>
|
||||
<Debug>
|
||||
<Debug>
|
||||
|
||||
|
||||
|
||||
|
||||
<Information>
|
||||
<Debug>
|
||||
<Information>
|
@ -1,17 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
CURDIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)
|
||||
. $CURDIR/../shell_config.sh
|
||||
|
||||
> 00965_logs_level_bugfix.tmp
|
||||
|
||||
clickhouse-client --send_logs_level="trace" --query="SELECT 1;" 2>> 00965_logs_level_bugfix.tmp
|
||||
clickhouse-client --send_logs_level="debug" --query="SELECT 1;" 2>> 00965_logs_level_bugfix.tmp
|
||||
clickhouse-client --send_logs_level="information" --query="SELECT 1;" 2>> 00965_logs_level_bugfix.tmp
|
||||
clickhouse-client --send_logs_level="warning" --query="SELECT 1;" 2>> 00965_logs_level_bugfix.tmp
|
||||
clickhouse-client --send_logs_level="error" --query="SELECT 1;" 2>> 00965_logs_level_bugfix.tmp
|
||||
clickhouse-client --send_logs_level="none" --query="SELECT 1;" 2>> 00965_logs_level_bugfix.tmp
|
||||
|
||||
awk '{ print $8 }' 00965_logs_level_bugfix.tmp
|
||||
|
||||
|
@ -1,12 +0,0 @@
|
||||
<Debug>
|
||||
<Trace>
|
||||
<Debug>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<Information>
|
||||
<Debug>
|
||||
*****
|
||||
<Information>
|
@ -1,17 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
CURDIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)
|
||||
. $CURDIR/../shell_config.sh
|
||||
|
||||
> 00965_send_logs_level_concurrent_queries_first.tmp
|
||||
> 00965_send_logs_level_concurrent_queries_second.tmp
|
||||
|
||||
clickhouse-client --send_logs_level="trace" --query="SELECT * from numbers(100000);" >> /dev/null 2>> 00965_send_logs_level_concurrent_queries_first.tmp &
|
||||
clickhouse-client --send_logs_level="information" --query="SELECT * from numbers(100000);" >> /dev/null 2>> 00965_send_logs_level_concurrent_queries_second.tmp
|
||||
|
||||
sleep 2
|
||||
|
||||
awk '{ print $8 }' 00965_send_logs_level_concurrent_queries_first.tmp
|
||||
echo "*****"
|
||||
awk '{ print $8 }' 00965_send_logs_level_concurrent_queries_second.tmp
|
||||
|
11
dbms/tests/queries/0_stateless/00965_send_logs_level_concurrent_queries.sh
Executable file
11
dbms/tests/queries/0_stateless/00965_send_logs_level_concurrent_queries.sh
Executable file
@ -0,0 +1,11 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
CURDIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)
|
||||
. $CURDIR/../shell_config.sh
|
||||
|
||||
for i in {1..10}; do
|
||||
$CLICKHOUSE_BINARY client --send_logs_level="trace" --query="SELECT * from numbers(1000000);" > /dev/null 2> /dev/null &
|
||||
$CLICKHOUSE_BINARY client --send_logs_level="information" --query="SELECT * from numbers(1000000);" 2>&1 | awk '{ print $8 }' | grep "Debug\|Trace" &
|
||||
done
|
||||
|
||||
wait
|
@ -209,7 +209,7 @@ Possible values:
|
||||
- 0 — Disabled.
|
||||
- 1 — Enabled.
|
||||
|
||||
Default value: 0.
|
||||
Default value: 1.
|
||||
|
||||
## input_format_skip_unknown_fields {#settings-input_format_skip_unknown_fields}
|
||||
|
||||
@ -306,8 +306,8 @@ Default value: `ALL`.
|
||||
|
||||
Changes behavior of join operations with `ANY` strictness.
|
||||
|
||||
!!! note "Attention"
|
||||
This setting applies only for the [Join](../table_engines/join.md) table engine.
|
||||
!!! warning "Attention"
|
||||
This setting applies only for `JOIN` operations with [Join](../table_engines/join.md) engine tables.
|
||||
|
||||
Possible values:
|
||||
|
||||
@ -336,7 +336,7 @@ Default value: 0.
|
||||
|
||||
## join_any_take_last_row {#settings-join_any_take_last_row}
|
||||
|
||||
Changes the behavior of `ANY JOIN`. When disabled, `ANY JOIN` takes the first row found for a key. When enabled, `ANY JOIN` takes the last matched row, if there are multiple rows for the same key. The setting is used only in [Join table engine](../table_engines/join.md).
|
||||
Changes the behavior of `ANY JOIN`. When disabled, `ANY JOIN` takes the first row found for a key. When enabled, `ANY JOIN` takes the last matched row if there are multiple rows for the same key. The setting is used only in [Join table engine](../table_engines/join.md).
|
||||
|
||||
Possible values:
|
||||
|
||||
|
@ -537,13 +537,25 @@ ClickHouse doesn't directly support syntax with commas, so we don't recommend us
|
||||
|
||||
#### Strictness {#select-join-strictness}
|
||||
|
||||
- `ALL` — If the right table has several matching rows, ClickHouse creates a [Cartesian product](https://en.wikipedia.org/wiki/Cartesian_product) from matching rows. This is the normal `JOIN` behavior for standard SQL.
|
||||
- `ALL` — If the right table has several matching rows, ClickHouse creates a [Cartesian product](https://en.wikipedia.org/wiki/Cartesian_product) from matching rows. This is the standard `JOIN` behavior in SQL.
|
||||
- `ANY` — If the right table has several matching rows, only the first one found is joined. If the right table has only one matching row, the results of queries with `ANY` and `ALL` keywords are the same.
|
||||
- `ASOF` — For joining sequences with a non-exact match. Usage of `ASOF JOIN` is described below.
|
||||
- `ASOF` — For joining sequences with a non-exact match. `ASOF JOIN` usage is described below.
|
||||
|
||||
**ASOF JOIN Usage**
|
||||
|
||||
`ASOF JOIN` is useful when you need to join records that have no exact match. For example, consider the following tables:
|
||||
`ASOF JOIN` is useful when you need to join records that have no exact match.
|
||||
|
||||
Tables for `ASOF JOIN` must have an ordered sequence column. This column cannot be alone in a table, and should be one of the data types: `UInt32`, `UInt64`, `Float32`, `Float64`, `Date`, and `DateTime`.
|
||||
|
||||
Use the following syntax for `ASOF JOIN`:
|
||||
|
||||
```
|
||||
SELECT expression_list FROM table_1 ASOF JOIN table_2 USING(equi_column1, ... equi_columnN, asof_column)
|
||||
```
|
||||
|
||||
`ASOF JOIN` uses `equi_columnX` for joining on equality (`user_id` in our example) and `asof_column` for joining on the closest match.
|
||||
|
||||
For example, consider the following tables:
|
||||
|
||||
```
|
||||
table_1 table_2
|
||||
@ -556,22 +568,13 @@ event_1_2 | 13:00 | 42 event_2_3 | 13:00 | 42
|
||||
... ...
|
||||
```
|
||||
|
||||
`ASOF JOIN` takes the timestamp of a user event from `table_1` and finds in `table_2` an event, which timestamp is closest (equal or less) to the timestamp of the event from `table_1`. In our example, `event_1_1` can be joined with the `event_2_1`, `event_1_2` can be joined with `event_2_3`, `event_2_2` cannot be joined.
|
||||
|
||||
Tables for `ASOF JOIN` must have the ordered sequence column. This column cannot be alone in a table. You can use `UInt32`, `UInt64`, `Float32`, `Float64`, `Date` and `DateTime` data types for this column.
|
||||
|
||||
Use the following syntax for `ASOF JOIN`:
|
||||
|
||||
```
|
||||
SELECT expression_list FROM table_1 ASOF JOIN table_2 USING(equi_column1, ... equi_columnN, asof_column)
|
||||
```
|
||||
|
||||
`ASOF JOIN` uses `equi_columnX` for joining on equality (`user_id` in our example) and `asof_column` for joining on the closest match.
|
||||
`ASOF JOIN` takes the timestamp of a user event from `table_1` and finds an event in `table_2` where the timestamp is closest (equal or less) to the timestamp of the event from `table_1`. Herewith the `user_id` column is used for joining on equality and the `ev_time` column is used for joining on the closest match.
|
||||
In our example, `event_1_1` can be joined with `event_2_1`, `event_1_2` can be joined with `event_2_3`, but `event_2_2` cannot be joined.
|
||||
|
||||
Implementation details:
|
||||
|
||||
- The `asof_column` should be the last in the `USING` clause.
|
||||
- The `ASOF` join is not supported in the [Join](../operations/table_engines/join.md) table engine.
|
||||
- `asof_column` should be last in the `USING` clause.
|
||||
- `ASOF` join is not supported in the [Join](../operations/table_engines/join.md) table engine.
|
||||
|
||||
To set the default strictness value, use the session configuration parameter [join_default_strictness](../operations/settings/settings.md#settings-join_default_strictness).
|
||||
|
||||
|
@ -31,7 +31,7 @@ ClickHouse применяет настройку в тех случаях, ко
|
||||
- 0 — выключена.
|
||||
- 1 — включена.
|
||||
|
||||
Значение по умолчанию: 1.
|
||||
Значение по умолчанию — 1.
|
||||
|
||||
**Использование**
|
||||
|
||||
@ -87,7 +87,7 @@ ClickHouse применяет настройку в тех случаях, ко
|
||||
- 0 — выключена.
|
||||
- 1 — включена.
|
||||
|
||||
Значение по умолчанию: 0.
|
||||
Значение по умолчанию — 0.
|
||||
|
||||
## http_zlib_compression_level {#settings-http_zlib_compression_level}
|
||||
|
||||
@ -108,7 +108,7 @@ ClickHouse применяет настройку в тех случаях, ко
|
||||
- 0 — выключена.
|
||||
- 1 — включена.
|
||||
|
||||
Значение по умолчанию: 0.
|
||||
Значение по умолчанию — 0.
|
||||
|
||||
## send_progress_in_http_headers {#settings-send_progress_in_http_headers}
|
||||
|
||||
@ -121,7 +121,7 @@ ClickHouse применяет настройку в тех случаях, ко
|
||||
- 0 — выключена.
|
||||
- 1 — включена.
|
||||
|
||||
Значение по умолчанию: 0.
|
||||
Значение по умолчанию — 0.
|
||||
|
||||
## input_format_allow_errors_num
|
||||
|
||||
@ -209,7 +209,7 @@ Ok.
|
||||
- 0 — выключена.
|
||||
- 1 — включена.
|
||||
|
||||
Значение по умолчанию: 0.
|
||||
Значение по умолчанию — 1.
|
||||
|
||||
## input_format_skip_unknown_fields {#settings-input_format_skip_unknown_fields}
|
||||
|
||||
@ -259,7 +259,27 @@ Ok.
|
||||
- `ANY` — если в правой таблице несколько соответствующих строк, то соединяется только первая найденная. Если в "правой" таблице есть не более одной подходящей строки, то результаты `ANY` и `ALL` совпадают.
|
||||
- `Пустая строка` — если `ALL` или `ANY` не указаны в запросе, то ClickHouse генерирует исключение.
|
||||
|
||||
**Значение по умолчанию**: `ALL`
|
||||
Значение по умолчанию — `ALL`.
|
||||
|
||||
## join_any_take_last_row {#settings-join_any_take_last_row}
|
||||
|
||||
Изменяет поведение операций, выполняемых со строгостью `ANY`.
|
||||
|
||||
!!! warning "Внимание"
|
||||
Настройка применяется только для операций `JOIN`, выполняемых над таблицами с движком [Join](../table_engines/join.md).
|
||||
|
||||
Возможные значения:
|
||||
|
||||
- 0 — если в правой таблице несколько соответствующих строк, то присоединяется только первая найденная строка.
|
||||
- 1 — если в правой таблице несколько соответствующих строк, то присоединяется только последняя найденная строка.
|
||||
|
||||
Значение по умолчанию — 0.
|
||||
|
||||
**Смотрите также**
|
||||
|
||||
- [Секция JOIN](../../query_language/select.md#select-join)
|
||||
- [Движок таблиц Join](../table_engines/join.md)
|
||||
- [join_default_strictness](#settings-join_default_strictness)
|
||||
|
||||
## join_use_nulls {#settings-join_use_nulls}
|
||||
|
||||
@ -694,4 +714,3 @@ load_balancing = first_or_random
|
||||
- [Множественный JOIN](../../query_language/select.md#select-join)
|
||||
|
||||
[Оригинальная статья](https://clickhouse.yandex/docs/ru/operations/settings/settings/) <!--hide-->
|
||||
|
||||
|
@ -538,14 +538,49 @@ SELECT * FROM t1, t2, t3 WHERE t1.a = t2.a AND t1.a = t3.a
|
||||
|
||||
ClickHouse не поддерживает синтаксис с запятыми напрямую и мы не рекомендуем его использовать. Алгоритм пытается переписать запрос с помощью секций `CROSS JOIN` и `INNER JOIN` и затем продолжает его выполнение. При переписывании запроса, ClickHouse пытается оптимизировать производительность и потребление памяти. По умолчанию, ClickHouse трактует запятые как `INNER JOIN` и конвертирует их в `CROSS JOIN` когда не может гарантировать, что `INNER JOIN` возвращает запрошенные данные.
|
||||
|
||||
#### ANY или ALL - строгость:
|
||||
#### Строгость {#select-join-strictness}
|
||||
|
||||
Если указано `ALL`, то при наличии в "правой" таблице нескольких соответствующих строк, данные будут размножены по количеству этих строк. Это нормальное поведение `JOIN` как в стандартном SQL.
|
||||
Если указано `ANY`, то при наличии в "правой" таблице нескольких соответствующих строк, будет присоединена только первая попавшаяся. Если известно, что в "правой" таблице есть не более одной подходящей строки, то результаты `ANY` и `ALL` совпадают.
|
||||
- `ALL` — если правая таблица содержит несколько подходящих строк, то ClickHouse выполняет их [декартово произведение](https://ru.wikipedia.org/wiki/Прямое_произведение). Это стандартное поведение `JOIN` в SQL.
|
||||
- `ANY` — если в правой таблице несколько соответствующих строк, то присоединяется только первая найденная. Если в правой таблице есть только одна подходящая строка, то результаты `ANY` и `ALL` совпадают.
|
||||
- `ASOF` — для объединения последовательностей с нечётким совпадением. `ASOF JOIN` описан ниже по тексту.
|
||||
|
||||
**Использование ASOF JOIN**
|
||||
|
||||
`ASOF JOIN` применим в том случае, когда необходимо объединять записи, которые не имеют точного совпадения.
|
||||
|
||||
Таблицы для `ASOF JOIN` должны иметь столбец с отсортированной последовательностью. Этот столбец не может быть единственным в таблице и должен быть одного из типов: `UInt32`, `UInt64`, `Float32`, `Float64`, `Date` и `DateTime`.
|
||||
|
||||
Синтаксис `ASOF JOIN`:
|
||||
|
||||
```
|
||||
SELECT expression_list FROM table_1 ASOF JOIN table_2 USING(equi_column1, ... equi_columnN, asof_column)
|
||||
```
|
||||
|
||||
`ASOF JOIN` использует `equi_columnX` для объединения по равенству и `asof_column` для объединения по ближайшему совпадению.
|
||||
|
||||
Например, рассмотрим следующие таблицы:
|
||||
|
||||
```
|
||||
table_1 table_2
|
||||
event | ev_time | user_id event | ev_time | user_id
|
||||
----------|---------|---------- ----------|---------|----------
|
||||
... ...
|
||||
event_1_1 | 12:00 | 42 event_2_1 | 11:59 | 42
|
||||
... event_2_2 | 12:30 | 42
|
||||
event_1_2 | 13:00 | 42 event_2_3 | 13:00 | 42
|
||||
... ...
|
||||
```
|
||||
|
||||
`ASOF JOIN` принимает метку времени пользовательского события из `table_1` и находит такое событие в `table_2` метка времени которого наиболее близка (равна или меньше) к метке времени события из `table_1`. При этом столбец `user_id` используется для объединения по равенству, а столбец `ev_time` для объединения по ближайшему совпадению. В нашем примере `event_1_1` может быть объединено с `event_2_1`, `event_1_2` может быть объединено с `event_2_3`, а `event_2_2` не объединяется.
|
||||
|
||||
Детали реализации:
|
||||
|
||||
- `asof_column` должен быть последним в секции `USING`.
|
||||
- `ASOF JOIN` не поддержан для движка таблиц [Join](../operations/table_engines/join.md).
|
||||
|
||||
Чтобы задать значение строгости по умолчанию, используйте сессионный параметр [join_default_strictness](../operations/settings/settings.md#settings-join_default_strictness).
|
||||
|
||||
**GLOBAL JOIN**
|
||||
#### GLOBAL JOIN
|
||||
|
||||
При использовании обычного `JOIN` , запрос отправляется на удалённые серверы. На каждом из них выполняются подзапросы для формирования "правой" таблицы, и с этой таблицей выполняется соединение. То есть, "правая" таблица формируется на каждом сервере отдельно.
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user