powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Фильтр по подстроке в небольшой таблице
8 сообщений из 8, страница 1 из 1
Фильтр по подстроке в небольшой таблице
    #39888414
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть небольшая справочная таблица, порядка тысяч записей.
В таблице есть неиндексированное строковое поле NAME.
Мне нужно выбрать записи, в которых NAME начинается с определенной подстроки (например "Тест: ").
Как это будет лучше сделать, substr(NAME,1,6)='Тест: ' или NAME like 'Тест: %' ?
В плане или на замерах времени выполнения на такой маленькой выборке я разницы не вижу.
...
Рейтинг: 0 / 0
Фильтр по подстроке в небольшой таблице
    #39888422
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.
В плане или на замерах времени выполнения на такой маленькой выборке я разницы не вижу.
Хочешь сэкономить на спичках?
...
Рейтинг: 0 / 0
Фильтр по подстроке в небольшой таблице
    #39888427
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не успел отредактировать.
Проверил.
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
declare i number; n number; t1 number; t2 number; s varchar2(100);
begin
  n := 10000000;
  t1 := dbms_utility.get_time;
  s := 'Депозит / 123';
  for i in 1..n loop
    --if (substr(s,1,10)='Депозит / ') then
    if (s like 'Депозит / %') then
      null;
    end if;
  end loop;
  t2 := dbms_utility.get_time;
  dbms_output.put_line('n='||n||', t1='||t1||', t2='||t2||', delta='||(t2-t1));
end;


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
n=10000000, t1=2072028320, t2=2072028365, delta=45
n=10000000, t1=2072028633, t2=2072028678, delta=45
n=10000000, t1=2072028797, t2=2072028842, delta=45
n=10000000, t1=2072028952, t2=2072028996, delta=44
n=10000000, t1=2072030723, t2=2072030743, delta=20
n=10000000, t1=2072030960, t2=2072030981, delta=21
n=10000000, t1=2072031189, t2=2072031210, delta=21

Немного странно, что в Oracle работа с шаблоном вдвое быстрее, чем получение подстроки и сравнение ее с образцом.
...
Рейтинг: 0 / 0
Фильтр по подстроке в небольшой таблице
    #39888431
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.
Код: plsql
1.
bms_utility.get_time

RTFM timestamp
Alibek B.
Немного странно
Исследовать PL/SQL для оценки SQL-я.
...
Рейтинг: 0 / 0
Фильтр по подстроке в небольшой таблице
    #39888455
Артём Б
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Alibek B.,

Почему странно?

10000000 раз вызвать substr, вернуть временный результат и сравнить его с литералом
или
10000000 раз вызвать like

Вот когда в шаблон будет начинаться с '%', а у вас четкая структура строки, то substr может оказаться быстрее,но тоже под вопросом.
...
Рейтинг: 0 / 0
Фильтр по подстроке в небольшой таблице
    #39888456
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Elic
Исследовать PL/SQL для оценки SQL-я.

Я исхожу из того, что в PL/SQL и SQL машинный код для сравнения строк один и тот же (либо физически один и тот же, либо реализован одинаково). Разный машинный код для одной задачи — это было бы действительно странно.
...
Рейтинг: 0 / 0
Фильтр по подстроке в небольшой таблице
    #39888466
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.
Я исхожу из того
Это ложная импликация.
И вообще, тебе с твоими детскими "опытами" лучше не высовываться на форум.
...
Рейтинг: 0 / 0
Фильтр по подстроке в небольшой таблице
    #39888595
SQL*Plus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если бы я был оптимизатором PL/SQL, я не стал бы выполнять выделенное желтым... :-)
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
declare i number; n number; t1 number; t2 number; s varchar2(100);
begin
  n := 10000000;
  t1 := dbms_utility.get_time;
  s := 'Депозит / 123';
  for i in 1..n loop
    --if (substr(s,1,10)='Депозит / ') then
    if (s like 'Депозит / %') then
      null;
    end if;
  end loop;
  t2 := dbms_utility.get_time;
  dbms_output.put_line('n='||n||', t1='||t1||', t2='||t2||', delta='||(t2-t1));
end;
/
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Фильтр по подстроке в небольшой таблице
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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