powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Оптимизация рабаты с BIG DATA
25 сообщений из 33, страница 1 из 2
Оптимизация рабаты с BIG DATA
    #39732724
Shanga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
Всем привет!

У меня такая проблема, есть Зоны (числовые коды) в количестве  60  штук

CREATE TABLE [dbo].[Zones]
(
	[ID] INT IDENTITY(1,1) NOT NULL, 
	val INT, 
...
)

Необходимо сотавить каты Зон по 10 штук, так, чтобы зоны не повторялись внутри строки и чтобы каждая строка была уникальной.

Т.е.

SELECT
	zone01.val,
	zone02.val,
	zone03.val,
	zone04.val,
	zone05.val,
	zone06.val,
	zone07.val,
	zone08.val,
	zone09.val,
	zone10.val
FROM
	[PremierShipping].[dbo].[Zones] AS zone01
	RIGHT JOIN [dbo].[Zones] AS zone02 ON zone02.val > zone01.val
	RIGHT JOIN [dbo].[Zones] AS zone03 ON zone03.val > zone02.val
	RIGHT JOIN [dbo].[Zones] AS zone04 ON zone04.val > zone03.val
	RIGHT JOIN [dbo].[Zones] AS zone05 ON zone05.val > zone04.val
	RIGHT JOIN [dbo].[Zones] AS zone06 ON zone06.val > zone05.val
	RIGHT JOIN [dbo].[Zones] AS zone07 ON zone07.val > zone06.val
	RIGHT JOIN [dbo].[Zones] AS zone08 ON zone08.val > zone07.val
	RIGHT JOIN [dbo].[Zones] AS zone09 ON zone09.val > zone08.val
	RIGHT JOIN [dbo].[Zones] AS zone10 ON zone10.val > zone09.val	
WHERE
	ISNULL(zone01.val , 0) <> 0
AND	ISNULL(zone02.val , 0) <> 0
AND	ISNULL(zone03.val , 0) <> 0
AND	ISNULL(zone04.val , 0) <> 0
AND	ISNULL(zone05.val , 0) <> 0
AND	ISNULL(zone06.val , 0) <> 0
AND	ISNULL(zone07.val , 0) <> 0
AND	ISNULL(zone08.val , 0) <> 0
AND	ISNULL(zone09.val , 0) <> 0
AND	ISNULL(zone10.val , 0) <> 0

Это не сложная задача была бы, если бы не одно но, количество зон...  (т.е. 60 шт)

По моим расчетам это 75 394 027 566 возможных результатов

С примерным расчетным временем 872 сутокб что не приемлемо.

Так же, количество зон будет расти со временем.


 Помогите оптимизировать запрос плиз 

...
Рейтинг: 0 / 0
Оптимизация рабаты с BIG DATA
    #39732725
Shanga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
я имел ввиду 8,72 суток
...
Рейтинг: 0 / 0
Оптимизация рабаты с BIG DATA
    #39732736
Фотография court
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shanga,

1
LEFT JOIN должен быть ... или знак в ON поменяй
2
достаточно одного условия ISNULL(zone01.val , 0) <> 0 (это если на ЛЕФТ поменяешь)
...
Рейтинг: 0 / 0
Оптимизация рабаты с BIG DATA
    #39732737
Shanga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
court,

Пробовал, результат практически идентичен... (((
...
Рейтинг: 0 / 0
Оптимизация рабаты с BIG DATA
    #39732738
Фотография court
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
даа, и почему джоин по val ?
джойни по ID (это ж ПК, надеюсь ?)
Или val не уникальный ?
...
Рейтинг: 0 / 0
Оптимизация рабаты с BIG DATA
    #39732742
PizzaPizza
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shanga,

у вас "зоны" видимо цифровые, раз вы их сравниваете по >, но почему именно знак больше непонятно.

Этот вот кусок
Код: sql
1.
2.
WHERE
	ISNULL(zone01.val , 0) <> 0



у вас val может быть null? Зачем вы null превращаете в 0 и потом сравниваете с нулем когда есть конструкция is not null? Это лишние операции конвертации, которые вам совсем не нужны.
...
Рейтинг: 0 / 0
Оптимизация рабаты с BIG DATA
    #39732745
Shanga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PizzaPizza,

Т.к. выборка каждой зоны из одного и того же массива
то надо данные различать (они не должны повторяться)

Для этого знак ">", можно знак "<" иначе данные могут дублироваться

Пример:

[dbo].[Zones] 1276, 5684, 3254, 4323, 1589, 412, 893, 8543... и так 60шт

при SELECT > будет

412, 893, 1276, 1589, 3254, 4323, 5684, ...

893, 1276, 1589, 3254, 4323, 5684, 8543...
...
Рейтинг: 0 / 0
Оптимизация рабаты с BIG DATA
    #39732749
Shanga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PizzaPizza,
В случае, когда будут задействованы последние значения [dbo].[Zones]
ос тавшиеся зоны будут NULL

Пример:

[dbo].[Zones] ...1276, 5684, 3254, 4323, 1589, 412, 893, 8543


zone01.val = 3254
zone02.val = 4323
zone03.val = 5684
zone04.val = 8543 (данные закончились)
zone05.val = NULL
zone06.val = NULL
zone07.val = NULL
zone08.val = NULL
zone09.val = NULL
zone10.val = NULL
...
Рейтинг: 0 / 0
Оптимизация рабаты с BIG DATA
    #39732752
Shanga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PizzaPizza,

ISNULL очень быстрая операция, практически сравнимая с IS NOT NULL
...
Рейтинг: 0 / 0
Оптимизация рабаты с BIG DATA
    #39732761
Shanga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Изменил, не помогает... (((

SELECT
zone01.val,
zone02.val,
zone03.val,
zone04.val,
zone05.val,
zone06.val,
zone07.val,
zone08.val,
zone09.val,
zone10.val
FROM
[dbo].[Zones] AS zone10
LEFT JOIN [dbo].[Zones] AS zone09 ON zone09.ID < zone10.ID
LEFT JOIN [dbo].[Zones] AS zone08 ON zone08.ID < zone09.ID
LEFT JOIN [dbo].[Zones] AS zone07 ON zone07.ID < zone08.ID
LEFT JOIN [dbo].[Zones] AS zone06 ON zone06.ID < zone07.ID
LEFT JOIN [dbo].[Zones] AS zone05 ON zone05.ID < zone06.ID
LEFT JOIN [dbo].[Zones] AS zone04 ON zone04.ID < zone05.ID
LEFT JOIN [dbo].[Zones] AS zone03 ON zone03.ID < zone04.ID
LEFT JOIN [dbo].[Zones] AS zone02 ON zone02.ID < zone03.ID
LEFT JOIN [dbo].[Zones] AS zone01 ON zone01.ID < zone02.ID
WHERE
zone01.val IS NOT NULL
...
Рейтинг: 0 / 0
Оптимизация рабаты с BIG DATA
    #39732764
PizzaPizza
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shanga,

Наверное я не очень понимаю задачу.
Судя по числу 75 394 027 566 вам нужны сочетания (все комбинации по 10 элементов из множества 60 элементов).
При соединении с правилом B n >A n что случится с вариантами, когда A n <B n ? Сдается мне вы получите разное количество элементов.

AB12765684 3254 4323 15895684854332545684 4323 854343235684 854315895684 3254 4323 85434121276 5684 3254 4323 1589 412 893 85438931276 5684 3254 4323 1589 893 85438543
...
Рейтинг: 0 / 0
Оптимизация рабаты с BIG DATA
    #39732775
Shanga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PizzaPizza,

Условие ">" или "<" покрывает все возможные комбинации (без дубликатов)
Порядок не важен, важны лишь уникальные карты Зон

Пример:

1 2 3 4 5

1 2 3
1 2 4
1 2 5
1 3 4
1 3 5
1 4 5
2 3 4
2 3 5
2 4 5
3 4 5

идентичны (в моем случае)

5 4 3 2 1

5 4 3
5 4 2
5 4 1
5 3 2
5 3 1
5 2 1
4 3 2
4 2 1
3 2 1
...
Рейтинг: 0 / 0
Оптимизация рабаты с BIG DATA
    #39732776
PizzaPizza
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я наверное к вечеру не очень понимаю.

У вас данные отсортированные? Иначе у меня получается вот такое

1 2 3 5 4

123
125
124
135
134
15
235
234
245
35
...
Рейтинг: 0 / 0
Оптимизация рабаты с BIG DATA
    #39732778
Shanga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PizzaPizza,

Сортировка не проблема можно с ней, а можно и без нее по ID
главное уникальность комбинации

134
15

именно для таких случаев у меня проверка на NULLL
...
Рейтинг: 0 / 0
Оптимизация рабаты с BIG DATA
    #39732840
Oleg_SQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
DECLARE @T TABLE (ID INT PRIMARY KEY)

INSERT @T VALUES (1), (2), (3), (4)
        
SELECT * 
  FROM @T AS Column1
       RIGHT JOIN @T AS Column2 ON Column1.Id <> Column2.Id
       RIGHT JOIN @T AS Column3 ON Column1.Id <> Column3.Id AND Column2.Id <> Column3.Id
       RIGHT JOIN @T AS Column4 ON Column1.Id <> Column4.Id AND Column2.Id <> Column4.Id  AND Column3.Id <> Column4.Id
ORDER BY 1, 2, 3, 4




Здесь только 4, а не 10. Но суть одна..
...
Рейтинг: 0 / 0
Оптимизация рабаты с BIG DATA
    #39732841
Charles Weyland
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Во-первых, пока ты писал название поста тебя почему-то глючило несколько раз, в конце вообще на английский переключился. Суть в том, что BIG DATA тут вообще ни при чём. BIG DATA - это кластеры, хадуп и пр.

Во-вторых, я вообще не понимаю, зачем ты используешь Right join, позволяющий работать с NULL-полями и тут же пишешь "но только не NULL", причём череж зопу - путём конвертации в ноль.
Убери все проверки на NULL и замени все RIGHT JOIN на INNER JOIN. Он будет подразумевать обязательный не-null.

В-третьих,
В целом, у меня ощущение, что тут БД вообще не пахнет. Надо писать какой-нибудь внешний модуль, который нагенерирует тебе столько значений. Тут C++ и распараллеливание нужно.
Вот, у меня были сложные запросы - они возвращали миллионы записей (не миллиарды), при этом в результате оптимизации выяснялось, что где-то можно индексы вставить, от нескольких сотен тысяч записей отказаться, что-то редко изменяемое предварительно агрегировать по ночам либо триггерами в отдельную таблицу или столбцы и т.д. Т.е. там был простор для оптимизаций.

У тебя здесь банально - нагенерировать все сочетания без повторений 10 элементов из 60. SQL для этого не стоит использовать.
...
Рейтинг: 0 / 0
Оптимизация рабаты с BIG DATA
    #39732843
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PizzaPizzaу вас val может быть null? Зачем вы null превращаете в 0 и потом сравниваете с нулем когда есть конструкция is not null? Это лишние операции конвертации, которые вам совсем не нужны.Условие
Код: sql
1.
ISNULL(zone01.val,0)<>0

эквивалентно следующему
Код: sql
1.
zone01.val<>0

Причём это условие превращает запрос в SARGable
...
Рейтинг: 0 / 0
Оптимизация рабаты с BIG DATA
    #39732849
Charles Weyland
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iapPizzaPizzaу вас val может быть null? Зачем вы null превращаете в 0 и потом сравниваете с нулем когда есть конструкция is not null? Это лишние операции конвертации, которые вам совсем не нужны. Условие
Код: sql
1.
ISNULL(zone01.val,0)<>0

эквивалентно следующему
Код: sql
1.
zone01.val<>0

Причём это условие превращает запрос в SARGable
бред какой-то.

1. Как раз то выражение, которое ты идентифицировал словом условие , делает его не оптимизируемым ("не саргблеа") банально из-за использования функции.
2. Первое и второе выражения не являются эквивалентными, поскольку
Код: sql
1.
ISNULL(zone01.val,0)<>0


эквивалентно
Код: sql
1.
zone01.val !=0 and zone01.val is not null



3. Почему нельзя вместо
Код: sql
1.
ISNULL(zone01.val , 0) <> 0


написать
Код: sql
1.
zone01.val is not null


чтобы как раз оно стало оптимизируемым?
Я уверен, что val не содержит скалярных нулей.

4. Нафига писать сначала right join, который разрешает использование null, а затем тут же запрещать использование null какими-то условиями? (кажется, я уже писал про это, но ты проигнорировал).
...
Рейтинг: 0 / 0
Оптимизация рабаты с BIG DATA
    #39732856
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Charles Weyland,

бред какой-то

Код: sql
1.
zone01.val !=0 and zone01.val is not null

и это не равно zone01.val !=0? как же так
...
Рейтинг: 0 / 0
Оптимизация рабаты с BIG DATA
    #39732866
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Charles Weylandбред какой-тоПолегче!
Charles WeylandПочему нельзя вместо
Код: sql
1.
ISNULL(zone01.val , 0) <> 0

написать
Код: sql
1.
zone01.val is not null

Потому что результат этих выражений разный

в WHERE различаются результаты булевых выражений TRUE и NOT TRUE.
Если zone01.val IS NULL, то zone01.val<>0 возвращает UNKNOWN, то есть NOT TRUE.
Таким образом, NULL фильтруется и без всякого ISNULL().
...
Рейтинг: 0 / 0
Оптимизация рабаты с BIG DATA
    #39732881
PizzaPizza
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iap,

А можно пояснить?

Имеет ли преимущества выражение
Код: sql
1.
ISNULL(zone07.val , 0) <> 0


в случае, когда не подразумевается 0 как возможное знание (насколько я понял у тс это используется именно для фильтрации null от outer joinов) ?
А в случае, если возможны и null и 0 это выражение лучше чем два @ <> 0 and @ is not null?
...
Рейтинг: 0 / 0
Оптимизация рабаты с BIG DATA
    #39732882
Cristiano_Rivaldo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Возможно недопонимаю постановку , но запрос ТС неправильный (взять на 4 ) :
Запрос
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
WITH Zones (id,VAL)
AS 
(
	SELECT 1,1
	UNION ALL
	SELECT 12,2
	UNION ALL
	SELECT 7,3
	UNION ALL
	SELECT 5,4
)
SELECT	zone01.val,
		zone02.val,
		zone03.val,
		zone04.val
FROM Zones zone01
	RIGHT JOIN Zones zone02 ON zone02.val > zone01.val
	RIGHT JOIN Zones zone03 ON zone03.val > zone02.val
	RIGHT JOIN Zones zone04 ON zone04.val > zone03.val


вернет меньше комбинаций,чем
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
WITH Zones (Id ,val)
AS 
(
	SELECT 1, 1 UNION ALL SELECT 12,2 UNION ALL SELECT 7,3 UNION ALL SELECT 5,4
)
,
cte (id,val,c_path)
AS
(
	SELECT DISTINCT  tt.id, tt.val ,CAST(tt.val AS VARCHAR(MAX))
	FROM Zones tt 
	
	UNION ALL
	
	SELECT	zn.id,
			zn.val,
			c.c_path + ',' + CAST(zn.val AS VARCHAR(MAX))
	FROM cte c INNER JOIN  Zones zn ON zn.val > c.val 
)

SELECT val,c_path 
FROM cte


Возможно в последнем запросе нужно написать
Код: sql
1.
2.
3.
SELECT val,c_path 
FROM cte
WHERE c_path LIKE '1.%'


чтобы результаты были идентичными
...
Рейтинг: 0 / 0
Оптимизация рабаты с BIG DATA
    #39732886
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PizzaPizzaiap,

А можно пояснить?

Имеет ли преимущества выражение
Код: sql
1.
ISNULL(zone07.val , 0) <> 0



в случае, когда не подразумевается 0 как возможное знание (насколько я понял у тс это используется именно для фильтрации null от outer joinов) ?
А в случае, если возможны и null и 0 это выражение лучше чем два @ <> 0 and @ is not null?Однако, если не равно 0, то автоматически IS NOT NULL.
Отдельное IS NOT NULL - лишнее.
Что касается именно функции ISNULL(), то сервер во многих случаях умеет использовать индексы и в случае её применения.
Но полный перечень таких случаев я дать не могу.
Общее правило - по возможности не накладывать ограничение на функцию от поля,
а стараться накладывать его на само поле.
...
Рейтинг: 0 / 0
Оптимизация рабаты с BIG DATA
    #39732888
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iapЧто касается именно функции ISNULL(), то сервер во многих случаях умеет использовать индексы и в случае её применения.
Но полный перечень таких случаев я дать не могу.Вот, например, если в таблице прописано, что поле NOT NULL, то сервер реагирует на ISNULL(поле,...) так, как будто никакого ISNULL() нет.
...
Рейтинг: 0 / 0
Оптимизация рабаты с BIG DATA
    #39733138
Shanga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Charles Weyland,

Да, я уже думал о другой платформе для генерирования, но уж слишком большой результат 75 394 027 566 и он будет расти т.к. количество зон, будет расти.

Пока не нашел ничего подходящего... (((
...
Рейтинг: 0 / 0
25 сообщений из 33, страница 1 из 2
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Оптимизация рабаты с BIG DATA
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]