powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / ASE 12.5 - поиск в строке, что быстрее?
4 сообщений из 4, страница 1 из 1
ASE 12.5 - поиск в строке, что быстрее?
    #36640131
Kru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Господа,
такой скорее теоретический вопрос.

Есть запросы котором есть SARG по индексированному полю и есть SARG ищущий в строке.

Т.е поиск второго SARG будет осуществляться перебором записей в страницах данных отобранных 1м SARG.

Сам поиск в строке можно реализовать одним из 3х способов:
where substring(x,1,4)='blah' or substring(x,1,4)='foob'
where substring(x,1,4) in ('blah', 'foob')
where x like 'blah%' or x like 'foob%'

Кластеризации по полю x нет, так что с этой стороны у like нет премущества.

Вопрос - будет ли какой-нибудь из 3х способов работать быстрее и почему?

Заранее спасибо
...
Рейтинг: 0 / 0
ASE 12.5 - поиск в строке, что быстрее?
    #36640218
Kru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот ещё такой вопрос - в I/O подобные задачи измерять смысла нет, т.к. вопрос про то что быстрее like или substring.
Можно ли как-нибудь измерить стоимость этих операций?

Заранее большое спасибо
...
Рейтинг: 0 / 0
ASE 12.5 - поиск в строке, что быстрее?
    #36642364
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kru пишет:
> Есть запросы котором есть SARG по индексированному полю и есть SARG
> ищущий в строке.
>
> Т.е поиск второго SARG будет осуществляться перебором записей в
> страницах данных отобранных 1м SARG.

Запросы целиком, пожалуйста.

> Сам поиск в строке можно реализовать одним из 3х способов:
> where substring(x,1,4)='blah' or substring(x,1,4)='foob'

Не оптимизируется индексом

> where substring(x,1,4) in ('blah', 'foob')

Не оптимизируется индексом


> where x like 'blah%' or x like 'foob%'

ОПТИмизируется индексом

> Кластеризации по полю x нет, так что с этой стороны у like нет премущества.

Главное чтобы индекс был по этому полю.

> Вопрос - будет ли какой-нибудь из 3х способов работать быстрее и почему?

Вроде всё написал.

Но лучше запросы целиком смотреть.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
ASE 12.5 - поиск в строке, что быстрее?
    #36674314
Kru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv
Kru пишет:
> Есть запросы котором есть SARG по индексированному полю и есть SARG
> ищущий в строке.
>
> Т.е поиск второго SARG будет осуществляться перебором записей в
> страницах данных отобранных 1м SARG.

Запросы целиком, пожалуйста.

> Сам поиск в строке можно реализовать одним из 3х способов:
> where substring(x,1,4)='blah' or substring(x,1,4)='foob'

Не оптимизируется индексом

> where substring(x,1,4) in ('blah', 'foob')

Не оптимизируется индексом


> where x like 'blah%' or x like 'foob%'

ОПТИмизируется индексом

> Кластеризации по полю x нет, так что с этой стороны у like нет премущества.

Главное чтобы индекс был по этому полю.

> Вопрос - будет ли какой-нибудь из 3х способов работать быстрее и почему?

Вроде всё написал.

Но лучше запросы целиком смотреть.


Добрый день, MasterZiv,
большое спасибо за ответ.
Я извиняюсь, что в свою очередь отвечаю с задержкой - были разные запарки...

Ниже пример
Таблица с 2мя полями - одно числовое, 2е строковое.

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

Далее я использую разные выражения для поиска по фрагменту строки, строю планы и замеряю статистику.

Результаты, не зависимо от выражения получаются одинаковыми, хотя используемые операторы совершенно разные.

В 3м тесте специально добавил пару значений с гораздо более высокой кардинальностью. Запросы тем не менее всё равно используют кластерный индекс, что в общем-то понятно...

В общем-то ясно, что i/o не зависит от оператора, за исключением случаев когда на строковом поле кластерный индекс и используется like 'abc%'.

Но... может всё-же быть разница в производительности заметная на большом объеме данных?

Есть ли какая-нибудь возможность сравнить стоимость операторов?

Заранее большое спасибо


Код: 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.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
create table pat_test( i int, j varchar( 20 ))
go
create clustered index idx_pt on pat_test (i)
go
create index idx_j on pat_test(j)
go
declare @i int, @j varchar ( 20 ), @x int

select @x =  0 

while @x <  10000 
begin 
    select @i = @x
    select @x = @x+ 10 
    while @i < @x
    begin
        select @i = @i+ 1 
        select @j = 'aa' + convert (varchar( 10 ), @i)
        insert into pat_test values (@i, @j)
    end
    
    select @x = @x+ 10 
    while @i <@x
    begin
        select @i = @i+ 1 
        select @j = 'bb' + convert (varchar( 10 ), @i)
            insert into pat_test values (@i, @j)
    end
    
    select @x = @x+ 10 
    while @i <@x
    begin
        select @i = @i+ 1 
        select @j = 'cc' + convert (varchar( 10 ), @i)
            insert into pat_test values (@i, @j)
    end
end

-- test 1
set showplan on
go
select * from pat_test
where i between  120  and  180 
and ( j like 'aa%' or j like 'bb%')

set showplan on
go
select * from pat_test
where  i between  120  and  180 
and substring(j, 1 , 2 ) in ('aa', 'bb')

set showplan on
go
select * from pat_test
where  i between  120  and  180 
and (substring(j, 1 , 2 ) = 'aa' or  substring(j, 1 , 2 ) = 'bb')

-- test 2
set statistics io, time on
go
select * from pat_test
where i between  120  and  180 
and ( j like 'aa%' or j like 'bb%')

set statistics io, time on
go
select * from pat_test
where  i between  120  and  180 
and substring(j, 1 , 2 ) in ('aa', 'bb')

set statistics io, time on
go
select * from pat_test
where  i between  120  and  180 
and (substring(j, 1 , 2 ) = 'aa' or  substring(j, 1 , 2 ) = 'bb')
-- test 3
 insert into pat_test 
 select count(*)+ 1 , 'cc' from pat_test
 
  insert into pat_test 
 select count(*)+ 1 , 'zz' from pat_test
 
 set showplan on
 go
  select * from pat_test
where  i >  10000 
and (substring(j, 1 , 2 ) = 'cc' or  substring(j, 1 , 2 ) = 'zz')
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / ASE 12.5 - поиск в строке, что быстрее?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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