Мастера DELPHI, Delphi programming community Рейтинг@Mail.ru Титульная страница Поиск, карта сайта Написать письмо 
| Новости |
Новости сайта
Поиск |
Поиск по лучшим сайтам о Delphi
FAQ |
Огромная база часто задаваемых вопросов и, конечно же, ответы к ним ;)
Статьи |
Подборка статей на самые разные темы. Все о DELPHI
Книги |
Новинки книжного рынка
Новости VCL
Обзор свежих компонент со всего мира, по-русски!
|
| Форумы
Здесь вы можете задать свой вопрос и наверняка получите ответ
| ЧАТ |
Место для общения :)
Орешник |
Коллекция курьезных вопросов из форумов
KOL и MCK |
KOL и MCK - Компактные программы на Delphi
Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / rsdn.org

 
Чтобы не потерять эту дискуссию, сделайте закладку « предыдущая ветвь | форум | следующая ветвь »
Страницы: 1 2 3

Реализация оператора like в Delphi


Тимохов Дима ©   (19.12.16 22:13[40]


> iop ©   (19.12.16 22:06) [39]


Хороший тезис. Продолжаем)

Как вы в своей масштоасинхронногетерогеннокроссплтформенной системе решаете следующую задачу: построение отчетов?

Вот есть, например, отчет, который затрагивает таблицу, в которую ведутся постоянные (раз в секунду, например) добавления. Отчет на sql строится долго - несколько минут.

Вот как вы избегаете deadlock'ов?


Игорь Шевченко ©   (19.12.16 22:33[41]


> Вот есть, например, отчет, который затрагивает таблицу,
> в которую ведутся постоянные (раз в секунду, например) добавления.
>  Отчет на sql строится долго - несколько минут.
>
> Вот как вы избегаете deadlock'ов?


Используя соответствующие уровни изоляции транзакций, вроде, иначе трудно.


Тимохов Дима ©   (19.12.16 23:00[42]


> Игорь Шевченко ©   (19.12.16 22:33) [41]
>
> Используя соответствующие уровни изоляции транзакций, вроде,
>  иначе трудно.


Игорь, неужели у вас не бывает deadlock'ов?
Ну вот представь, что нужен серьезный отчет - из 10 таблиц да еще и за год.
А при этом в таблицы добавляются данные, изменяются данные, удаляются данные.

Неужели нет проблем?

ЗЫ Знаю, что у тебя Оракл. Петр Абрамов мне рассказывал, что Оракл творит чудеса, будучи версионником. Но поверить сложно...


Игорь Шевченко ©   (19.12.16 23:07[43]


> Неужели нет проблем?


А с чего бы им появиться ?
Тебя не удивляет же тот факт, что штатными средствами делается резерная работоспособная копия базы данных, в которую во время копирования могут также вноситься изменения.
Про изоляцию транзакций в MS SQL тут все вроде написано
https://msdn.microsoft.com/ru-ru/library/ms173763.aspx


An a Student   (20.12.16 00:24[44]

> Отчет на sql строится долго - несколько минут.

Это не долго. Проходил практику, там бывало отчёты по 15 минут думали (запросы сами).
Запихнуть весь этот запрос в штатный профилировщик и создать в БД индексы, которые тот посоветует?


Игорь Шевченко ©   (20.12.16 10:26[45]

An a Student   (20.12.16 00:24) [44]

"Вы, сударь, ерунду говорите. И хуже всего то, что говорите безапеляционно и уверенно"


sniknik ©   (20.12.16 13:34[46]

> http://regexpstudio.com/TRegExpr/TRegExpr.html
тоже раньше пользовался, пока не наткнулся на какое то ограничение (там в модуле посмотри 2004го года вроде последнее обновление) пришлось срочно переделывать на http://www.regular-expressions.info/pcre.html (перловский синтаксис)

> хочу некоторую фильтрацию делать на клиенте
> если мне нужен реально быстрый like, то нужно его писать самому
сам быстрый вряд ли сделаешь, к примеру вот до этого думал о индексах? like поддерживает, в некоторых случаях. вообще индексы в твоей локальной структуре есть?
+
локальный рекордсет ADO поддерживает и локальные индексы и локальный же, убогий (с некоторыми отличиями от серверного MSSQL-евского) like, который тем не менее наверняка круче любого "велосипеда".


Тимохов Дима ©   (21.12.16 14:05[47]


> sniknik ©   (20.12.16 13:34) [46]


1. Ты только не подумай, что на основе одного примера я делаю выводы, что все, что написано другими - плохо, а все мое - хорошо.
Вот сам пример (понятно, что утрированный):
StringReplace(DupeString('ab', 1000000), 'a', 'aa', [rfReplaceAll]);
У меня на Дельфи2007 он выполняется 2808 сек. Причина в StringReplace (жуткий алгоритм).
Мой аналогичный алгоритм делает это за 0.2 сек.

Это я к тому, что генофонд от производителя не всегда безупречен.
И в определенных случаях, возможно, что самописное решение будет лучше стандартного.
Так... немного философии.

2. Теперь по сути. Все обсуждаемое еще не написано полностью, но все требуемые компоненты (сервисы, сервер на им. каналах,  пр.) есть из других проектов. Пока думаю над горизонтальным масштабированием: считать некоторые отчеты не в БД, а рядом. Хочу пилота сделать и представить остальному коллективу.
Но коллега iop (с) поселил во мне сомнения в правильности того, что я хочу сделать. Возможно, он прав и надо убиться об стену, но считать все в БД. Буду думать.

3. Насчет ADO. Спасибо, посмотрю.

4. Индексы есть. По сути вариантов key не так много (несколько тысяч). Все различные варианты key+индексы соответствующих строк в А по сути и есть индекс.
С учетом малости вариантов key согласен с коллегой iop (c), что можно воспользоваться TRegExpr, а не писать свой like.


Игорь Шевченко ©   (21.12.16 14:31[48]


> Это я к тому, что генофонд от производителя не всегда безупречен.


Всякий овощ приносит пользу будучи употреблен надлежащим образом в надлежащее время.

Ты привел неудачный пример для иллюстрации. Можно и содержимое большого файла обрабатывать, прочитав его в TMemo, и так тоже делают, но этот вовсе не повод для критики TMemo.


Тимохов Дима ©   (21.12.16 15:52[49]


> Игорь Шевченко ©   (21.12.16 14:31) [48]
> Ты привел неудачный пример для иллюстрации.


Ну почему же?

Вот нужно тебе в большом тексте заменить одно на другое. Берешь StringReplace (а с чего бы взять другую функцию? функция есть, она описана, не сказано, что не подсовывать большие строки). И получаешь результат в 2808 секунд.

Вот ты бы в подобной ситуации (когда надо заменить в большой стоке одно на другое) взял бы другой овощ (функцию)? Какую? Как бы ты, опытный разработчик, понял, что использовать StringReplace не надо ибо она медленная?

Пример, кстати жизненный. В доке к MSSQL сказано, что sp_exec кеширует план запроса, если все объекты fully qualified, т.е. имеют префикс [DataBaseName].[dbo] перед таблицами, процедурами и вьюхами. Я собрал батч, где место для [DataBaseName].[dbo] помечено маркером, вызвал замену маркера на [DataBaseName].[dbo] и сижу жду... Честно говоря, я когда наконец понял, почему у меня стало в порядок работать медленнее, был поражен неоптимальностью алгоритма в StringReplace...


sniknik ©   (21.12.16 17:24[50]

> Мой аналогичный алгоритм делает это за 0.2 сек.
сравни вот с этим http://www.loginovprojects.ru/index.php?page=faststringreplace
у меня он показал 16 милисекунды, хотя это на разных машинах ничего не значит, StringReplace проверять не стал (подождал с минуту и прервал)

время засекал так
procedure TForm1.Button1Click(Sender: TObject);
var
 Tick: Cardinal;
 st: string;
begin
 st:= DupeString('ab', 1000000);
 Tick:= GetTickCount();
 //st:= StringReplace(st, 'a', 'aa', [rfReplaceAll]);
 st:= FastStringReplace(st, 'a', 'aa', [rfReplaceAll]);
 Button1.Caption:= IntToStr(GetTickCount() - Tick);
end;


Игорь Шевченко ©   (21.12.16 21:35[51]


> Вот нужно тебе в большом тексте заменить одно на другое


а) Мне крайне редко нужно менять "в большом тексте одно на другое"
б) Еще в 1988 году я написал себе функцию замены текста (на С, разумеется), которая приемлемо по скорости работала и если мне таки потребуется поменять в "большом" тексте, я буду использовать приемлемый алгоритм.


Тимохов Дима ©   (23.12.16 16:14[52]


> sniknik ©   (21.12.16 17:24) [50]
> > Мой аналогичный алгоритм делает это за 0.2 сек.
> сравни вот с этим http://www.loginovprojects.ru/index.php?
> page=faststringreplace

Спасибо. Быстрее в 4 раза. Возьму его. Пусть будет. К тому же мой не работает в режиме IngnoreCase (не нужно было и не написал).


stas ©   (17.01.17 15:38[53]

Тимохов Дима ©   (19.12.16 22:13) [40]

   Честно говоря не совсем понятно с чем связаны deadlock у вас, но это не причина, писать какой-то свой сервер подобие SQL, в крайнем случае можно использовать  2 SQL сервера для разных задач.
  Рассмотрите повышение производительности другими путями, пересмотрите код (к стати в некоторых отчетах можно использовать "грязное чтение"), возможно серверу можно добавить просто ОЗУ либо более быстрые диски поставить.
Не забывайте о том что в итоге такой проект выйдет дороже чем апгрейд сервера. Сделать пилот это одно, а потом провести его тестирование, вылавливать баги и заниматься поддержкой - другое.


TohaNik ©   (22.01.17 19:22[54]


> Игорь Шевченко ©   (19.12.16 22:33) [41]
>
> > Вот есть, например, отчет, который затрагивает таблицу,
>  
> > в которую ведутся постоянные (раз в секунду, например)
> добавления.
> >  Отчет на sql строится долго - несколько минут.
> >
> > Вот как вы избегаете deadlock'ов?
>
>
> Используя соответствующие уровни изоляции транзакций, вроде,
>  иначе трудно.

Исчерпывающий ответ!
Просто это сообщение... возникает в процессе развития БД, от его очень трудно избавиться, не переписывая логику. А так чтение ни при чем.


stas ©   (23.01.17 13:15[55]


> трудно избавиться, не переписывая логику


Это придется сделать рано или поздно. т.к. частые deadlock это не нормально при любой нагрузке.
А какая версия MS SQL ?


Страницы: 1 2 3 версия для печати

Написать ответ

Ваше имя (регистрация  E-mail 







Разрешается использование тегов форматирования текста:
<b>жирный</b> <i>наклонный</i> <u>подчеркнутый</u>,
а для выделения текста программ, используйте <code> ... </code>
и не забывайте закрывать теги! </b></i></u></code> :)


Наверх

  Рейтинг@Mail.ru     Титульная страница Поиск, карта сайта Написать письмо