Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / реализация like и substring / 19 сообщений из 19, страница 1 из 1
10.07.2008, 19:24
    #35424028
yaro83
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
реализация like и substring
привет,

скажите pls чем лучше пользоваться в ситуации, когда есть строка из 10 символов, на 9 месте может встречаться символ 1, like '1' или substring( , 10, 1) = 1 ?

спасибо
...
Рейтинг: 0 / 0
10.07.2008, 19:46
    #35424055
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
реализация like и substring
Теоретически, substring будет чуть пошустрее.
На практике, я разницы "на глаз" не замечал.
...
Рейтинг: 0 / 0
10.07.2008, 20:07
    #35424083
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
реализация like и substring
yaro83 пишет:

> скажите pls чем лучше пользоваться в ситуации, когда есть строка из 10
> символов, на 9 месте может встречаться символ 1, like '1' или substring(
> , 10, 1) = 1 ?

Для чего пользоваться ?

Заметь, что
-- WhiteOwl неправ
-- like '1' эквивалентно = '1'
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
10.07.2008, 20:21
    #35424102
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
реализация like и substring
MasterZivЗаметь, что
-- WhiteOwl неправ
-- like '1' эквивалентно = '1'Почему это я неправ???
like '1' действительно будет эквивалентно ='1'. Но это очень частный случай, совершенно не используемый в реальной жизни. На него нет смысла равняться.
...
Рейтинг: 0 / 0
10.07.2008, 23:27
    #35424253
Ggg_old
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
реализация like и substring
Что-бы не поставили, а если это единственное условие поиска, о будет tablescan
...
Рейтинг: 0 / 0
11.07.2008, 00:29
    #35424294
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
реализация like и substring
White OwlПочему это я неправ???


Потому что фраза "Теоретически, substring будет чуть пошустрее." не имеет смысла. Когда пошустрее? Где ?
...
Рейтинг: 0 / 0
11.07.2008, 11:01
    #35424803
yaro83
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
реализация like и substring
я может с ошибками код пишу, sybase не знаю

declare @string varchar(10)
select @string = '0000000001'

if (@string like '1') begin ... end

либо

if (substring(@string, 10, 1) = '1') begin ... end

что быстрее будет работать из этих двух инструкций, в варианте когда @string это varchar(10) и @string это varchar(20) вида 00000000000000000001?

thx
...
Рейтинг: 0 / 0
11.07.2008, 16:12
    #35425978
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
реализация like и substring
yaro83 пишет:

> if (@string like '1') begin ... end

Должно быть
if (@string like '%1') begin ... end

> что быстрее будет работать из этих двух инструкций, в варианте когда
> @string это varchar(10) и @string это varchar(20) вида 00000000000000000001?

Пофигу. Там разница будет в наносекундах.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
14.07.2008, 09:42
    #35427671
Badger
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
реализация like и substring
Получается, что if (@string like '1') работает быстрее

Код: 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.
declare @string        varchar( 10 )
declare @ii            int
declare @date_time     datetime


select @string = '0000000001'


SELECT @date_time = GetDate () 
SELECT @ii     =  1 

WHILE @ii <  10000 
BEGIN

    if (@string like '1') 
        SELECT @ii = @ii +  1 
    else    
        SELECT @ii = @ii +  1 
END

SELECT @date_time = GetDate (), @ii = DATEDIFF(ms, @date_time, GetDate ()) 

/* Время первого цикла у меня (12590)*/
SELECT @ii

SELECT @ii     =  1 

WHILE @ii <  10000 
BEGIN

    if (substring(@string,  10 ,  1 ) = '1') 
        SELECT @ii = @ii +  1 
    else    
        SELECT @ii = @ii +  1 
END

SELECT @date_time = GetDate (), @ii = DATEDIFF(ms, @date_time, GetDate ()) 

/* Время второго цикла у меня (13046) */
SELECT @ii
...
Рейтинг: 0 / 0
14.07.2008, 09:56
    #35427703
Badger
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
реализация like и substring
Нет, фигня если блоки поменять местами то substring(@string, 10, 1) = '1' быстрее
...
Рейтинг: 0 / 0
14.07.2008, 10:03
    #35427713
yaro83
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
реализация like и substring
я пытался вот такое протестировать

Код: 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.
begin

declare @d varchar( 100 )
declare @t datetime
declare @i integer
declare @maxcount integer
declare @teststring varchar( 20 )
declare @searchstring varchar( 1 )

select @maxcount =  100000 
--select @teststring = '12345678901234567890'
--select @teststring = '0000000001'
--select @teststring = '00000000000000000001'
select @teststring = '000000000000000000000000000001'

select @t = getdate()
select @d = convert(varchar( 20 ),@t, 108 )
print @d


select @i =  0 
while @i < @maxcount
begin
    
    -- это если оставить like    
    /*if (@teststring like '%1%') 
    begin
         select @i = @i + 1
    end
    */
    
    
    -- а это если подстрока номерация с 
    if (substring(@teststring, 30 , 1 ) = '1')
    begin
         select @i = @i +  1 
    end
    
end

-- статистика 
-- кол-во 100000 строка 10 чаров
    -- like        8 сек
    -- substr      7 сек 
-- кол-во 100000 строка 20 чаров
    -- like        8 сек
    -- substr      7 сек
-- кол-во 100000 строка 30 чаров
    -- like        ? сек
    -- substr      ? сек



select @t = getdate()
select @d = convert(varchar( 20 ),@t, 108 )
print @d

end

но ничего путного не получил...
...
Рейтинг: 0 / 0
14.07.2008, 10:18
    #35427761
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
реализация like и substring
Badger пишет:
> Автор: "Badger"

> Получается, что if (@string like \'1\') работает быстрее

Не занимайтесь ерундой. Лучше исправьте ошибку, о которой
я вам говорю уже в который раз


вместо

if (@string like \'1\')

должно быть

if (@string like \'%1\')

так что вы мерили просто

if (@string = \'1\')

которому @string like \'1\' эквивалентно.

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
14.07.2008, 10:26
    #35427787
Badger
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
реализация like и substring
MasterZiv
Не занимайтесь ерундой. Лучше исправьте ошибку, о которой
я вам говорю уже в который раз

вместо

if (@string like '1')

должно быть

if (@string like '%1')

так что вы мерили просто

if (@string = '1')

которому @string like '1' эквивалентно.

Posted via ActualForum NNTP Server 1.4

Ошибку исправил, а время осталось практически темже какой блок раньше, тот и быстрее
...
Рейтинг: 0 / 0
14.07.2008, 10:26
    #35427789
yaro83
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
реализация like и substring
у меня в тесте стоит if (@teststring like '%1%') - разве не тоже самое?
...
Рейтинг: 0 / 0
14.07.2008, 11:42
    #35428141
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
реализация like и substring
yaro83 wrote:
> Автор: "yaro83"
> у меня в тесте стоит if (@teststring like \'%1%\') - разве не тоже самое?
У тебя - да, стоит. У него - нет.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
14.07.2008, 11:58
    #35428198
yaro83
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
реализация like и substring
т.е. можно ли сформулировать, что пытаться оптимизировать like заменив его на substring и введя разрядность в строке не имеет смысла?
...
Рейтинг: 0 / 0
14.07.2008, 12:16
    #35428254
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
реализация like и substring
yaro83 wrote:

> т.е. можно ли сформулировать, что пытаться оптимизировать like заменив
> его на substring и введя разрядность в строке не имеет смысла?

Конечно.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
14.07.2008, 12:29
    #35428311
yaro83
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
реализация like и substring
тяжело в это поверить ибо доступ по индексу быстрее же должен быть, чем перебор со сравнением, думаю, в STL это можно ярко показать и в Oracle это тоже будет видно...
...
Рейтинг: 0 / 0
14.07.2008, 13:47
    #35428594
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
реализация like и substring
yaro83 wrote:

> тяжело в это поверить ибо доступ по индексу быстрее же должен быть, чем
> перебор со сравнением, думаю, в STL это можно ярко показать и в Oracle
> это тоже будет видно...
Где ты там индексы видал в ваших тестах ?
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / реализация like и substring / 19 сообщений из 19, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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