powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / OUTER APPLY LIKE
6 сообщений из 6, страница 1 из 1
OUTER APPLY LIKE
    #40071145
Фотография a_voronin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Господа, скажите как бы вы оптимизировали вот такой запрос? Таблицы А и Б в реальности большие. около 10000 тыр. Обратите внимание, что есть подвох в логике.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
WITH A AS 
(
	SELECT 1 AS N, 0 AS DELETED UNION ALL 
	SELECT 2 AS N, 0 AS DELETED UNION ALL 
	SELECT 3 AS N, 1 AS DELETED UNION ALL 
	SELECT 4 AS N, 0 AS DELETED UNION ALL 
	SELECT 5 AS N, 0 AS DELETED 
), 
B AS 
(
	SELECT 'dadasdas X=1;X=5;X=8; adad' AS S, 'A' AS ID UNION ALL 
	SELECT 'adas X=3;X=2;X=2;X=7 dddd;' AS S, 'B' AS ID UNION ALL 
	SELECT 'ada423s X=6;X=3 dddd;' AS S, 'C' AS ID  UNION ALL 
	SELECT 'ada423s X=1;X=2 dddd;' AS S, 'D' AS ID 
) 

SELECT C.N, B.ID FROM B
OUTER APPLY 
(
	SELECT TOP 1 * FROM A
	WHERE 
		B.S LIKE CONCAT('%X=', A.N, ';%') AND 
		A.DELETED = 0
) C
...
Рейтинг: 0 / 0
OUTER APPLY LIKE
    #40071158
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну да, TOP 1 без ORDER BY - это, конечно, подвох...
...
Рейтинг: 0 / 0
OUTER APPLY LIKE
    #40071164
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
a_voronin
Господа, скажите как бы вы оптимизировали вот такой запрос?
Запрос - никак, что можно сделать с сканами в циклах?
Можно попробовать поменять модель данных, если вникнуть в бизнес-задачу.
Akina
Ну да, TOP 1 без ORDER BY - это, конечно, подвох...
А что такого, если любое совпадение подходит?
...
Рейтинг: 0 / 0
OUTER APPLY LIKE
    #40071168
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как-то так
Код: sql
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.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
use tempdb;
set ansi_nulls, quoted_identifier, xact_abort on;
go

create table dbo.A
(
 N int not null, DELETED bit not null
);

insert into dbo.A
 (N, DELETED)
 select
  a.N, a.DELETED
 from
  (select top (1000) 1 from master.dbo.spt_values a cross join master.dbo.spt_values b) t(dummy) cross apply
  (
   SELECT 1 AS N, 0 AS DELETED UNION ALL
   SELECT 2 AS N, 0 AS DELETED UNION ALL
   SELECT 3 AS N, 1 AS DELETED UNION ALL
   SELECT 4 AS N, 0 AS DELETED UNION ALL
   SELECT 5 AS N, 0 AS DELETED
  ) a(N, DELETED);

create index IX_A__N on dbo.A(N) include (DELETED);

create table dbo.B
(
 S varchar(1000), ID varchar(100) --primary key
);

insert into dbo.B
 (ID, S)
select
 concat(b.ID, t.n), b.S
from
 (select top (1000) row_number() over (order by 1/0) from master.dbo.spt_values a cross join master.dbo.spt_values b) t(n) cross apply
 (
  SELECT 'dadasdas X=1;X=5;X=8; adad' AS S, 'A' AS ID UNION ALL
  SELECT 'adas X=3;X=2;X=2;X=7 dddd;' AS S, 'B' AS ID UNION ALL
  SELECT 'ada423s X=6;X=3 dddd;' AS S, 'C' AS ID UNION ALL
  SELECT 'ada423s X=1;X=2 dddd;' AS S, 'D' AS ID
 ) b
go

declare @N int, @ID varchar(100);

set statistics xml, time, io on;

SELECT @N = C.N, @ID = B.ID FROM dbo.B
OUTER APPLY
(
SELECT TOP 1 A.N FROM dbo.A
WHERE
B.S LIKE CONCAT('%X=', A.N, ';%') AND
A.DELETED = 0
) C;

print '';
print '------------------------------------------------------------------------------';
print '';

SELECT @N = C.N, @ID = B.ID FROM dbo.B
OUTER APPLY
(
SELECT TOP (1) t.N FROM
(
  select
   cast(replace(value, 'X=', '') as int)
  from
   string_split(replace(B.S, ';', ' '), ' ')
  where
   value like 'X=[0123456789]%'
) t(N) join
dbo.A on A.N = t.N and A.DELETED = 0
) C;

set statistics xml, time, io off;
go

drop table dbo.A, dbo.B;
go



Код: 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.
(5000 rows affected)

(4000 rows affected)
Table 'A'. Scan count 1, logical reads 12000, physical reads 0, page server reads 0, read-ahead reads 0, page server read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob page server reads 0, lob read-ahead reads 0, lob page server read-ahead reads 0.
Table 'B'. Scan count 1, logical reads 21, physical reads 0, page server reads 0, read-ahead reads 0, page server read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob page server reads 0, lob read-ahead reads 0, lob page server read-ahead reads 0.

(1 row affected)

 SQL Server Execution Times:
   CPU time = 6203 ms,  elapsed time = 6379 ms.
 

 SQL Server Execution Times:
   CPU time = 0 ms,  elapsed time = 0 ms.
------------------------------------------------------------------------------

 SQL Server Execution Times:
   CPU time = 0 ms,  elapsed time = 0 ms.
 

 SQL Server Execution Times:
   CPU time = 0 ms,  elapsed time = 0 ms.
Table 'A'. Scan count 6, logical reads 20, physical reads 0, page server reads 0, read-ahead reads 0, page server read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob page server reads 0, lob read-ahead reads 0, lob page server read-ahead reads 0.
Table 'Worktable'. Scan count 0, logical reads 0, physical reads 0, page server reads 0, read-ahead reads 0, page server read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob page server reads 0, lob read-ahead reads 0, lob page server read-ahead reads 0.
Table 'B'. Scan count 1, logical reads 21, physical reads 0, page server reads 0, read-ahead reads 0, page server read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob page server reads 0, lob read-ahead reads 0, lob page server read-ahead reads 0.

(1 row affected)

 SQL Server Execution Times:
   CPU time = 16 ms,  elapsed time = 53 ms.
...
Рейтинг: 0 / 0
OUTER APPLY LIKE
    #40071184
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
a_voronin,

полнотекстовый поиск может подойти, теоретически, если включен.
...
Рейтинг: 0 / 0
OUTER APPLY LIKE
    #40071239
godsql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina
Ну да, TOP 1 без ORDER BY - это, конечно, подвох...

Скорее всего, подвох в том, что отбираются только те значения "X", которые закрываются ";" , судя по приложенному запросу
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / OUTER APPLY LIKE
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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