Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Оптимизировать перебор записей в таблице [D7, MSSQL]


Страницы:   1 2 3

WhiteCat ©   (2007-07-13 13:52:00) 

Здравствуйте.
Подскажите как решать следующую проблему? В таблице на 10000 записей в поле Adress "Россия, Москва, друг детства и т.д." необходимо, допустим, подстроку "Москва"  заменить на "Московская область".

Первоначально было такое решение настроить фильтр таблицы на Adress LIKE %Москва% и пройтись по оставшимся записям используя ReplaseString.
Видимо это плохое решение, поскольку возможности Filter ограничены, а использование OnFilterRecord, как мне кажется приведет к еще более медленному выполнению перебора. см.
http://www.delphimaster.ru/cgi-bin/forum.pl?id=1184266719&n=1

Пример абстрактный, но близкий к требуемому, поэтому прошу не пенять на неправильную реляционую модель.


sniknik   (2007-07-16 14:49:00) [1]

вообще если делать "ускорение" то я бы сам составил команду апдейта, и выполнял бы ее в асинхронном ADOCommand, тогда бы сэкономилось немного времени, не ожидалось бы завершения команды для перехода на следующую запись основного рекордсета. может быть бы и получилось... (проверить надо (возможно уже в оригинальном так и сделано тогда ;())


sniknik   (2007-07-16 14:43:00) [2]

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


Stanislav   (2007-07-16 14:25:00) [3]

sniknik ©   (13.07.07 17:41) [45]
Почему не добавит?
он же будет в цикле бежать по набору данных и заменять значения, при этом каждая строка будет фиксироваться в базе, а если установить BathOptimistic, то сохранение в базу пройдет в конце цикла 1 раз.


WhiteCat   (2007-07-13 17:42:00) [4]

to Stanislav
 Спасибо, попробую.


sniknik   (2007-07-13 17:41:00) [5]

> Можно для ускорения использовать LocType:=BathOptimistic
не надо. это не для этого и скорости не добавит.


sniknik   (2007-07-13 17:39:00) [6]

> Согласитесь, это же не повод всем пользователям Access, InterBase, Paradox, MySQL перейти в срочном порядке на MSSQL.
моим и не надо, они и так на MSSQL практически половно...

а для других баз могут другие, отличные от этого решения. для того же access 1 запрос на выборку нужных, и цикл по нему с вызовом команды updete в adocommsnd (обязательно параметризированным).
хотя тебе это не пойдет т.к. у тебя почемуто вопреки всем
> ... LIKE '%Москва%'
> ... LIKE '%москва%' дают разные результаты.
т.е. ничего не получится пока не добьешся чтобы было как у всех одинаковые.


Jan1   (2007-07-13 17:38:00) [7]


> Что нужно сделать??????? Скажите мне.

единоразовая задача? или это действие в проге? если единовразово, то создай в Аксесе такой запрос [8] и там же его выполни...


Stanislav   (2007-07-13 17:36:00) [8]

Сначала заменить AdoTable на AdoDataSet
Потом написать SQL Select... Where ... like '%москва%'
Потом открыть и вцикле сделать replace
Можно для ускорения использовать LocType:=BathOptimistic


sniknik   (2007-07-13 17:30:00) [9]

> Так вроде все уже обсудили. Сказали что нужно сделать...
но еще никто не дал готового кода... т.что жди третий круг. ;о)


WhiteCat   (2007-07-13 17:30:00) [10]


> ну так как я в основном использую MSSQL, и collation у баз
> делаю case insensetive то очевидно простым запросом update

Согласитесь, это же не повод всем пользователям Access, InterBase, Paradox, MySQL перейти в срочном порядке на MSSQL.


WhiteCat   (2007-07-13 17:30:00) [11]


> Так вроде все уже обсудили. Сказали что нужно сделать...

Что нужно сделать??????? Скажите мне.
Поменять СУБД?


Stanislav   (2007-07-13 17:28:00) [12]

sniknik ©   (13.07.07 17:23) [37]
Так вроде все уже обсудили. Сказали что нужно сделать...


sniknik   (2007-07-13 17:23:00) [13]

Stanislav ©   (13.07.07 17:18) [35]
сходи по ссылке в [0]


sniknik   (2007-07-13 17:21:00) [14]

> Пришел на ум красивый пример:
это не пример, отмазка с попыткой получить нужную информацию самому ничего не сказав... а от того, что в исходных данных, что ты не сказал решение может менятся на полную противоположность...

> Как бы вы решали такую задачу?
ну так как я в основном использую MSSQL, и collation у баз делаю case insensetive то очевидно простым запросом update с заменой нужного функцией replace не обращая внимания на регист букв (для insensetive они равнозначны)

помогло?


Stanislav   (2007-07-13 17:18:00) [15]

WhiteCat   (13.07.07 17:11) [34]
А что не понятно?


WhiteCat   (2007-07-13 17:11:00) [16]


> вообще не понимаю, использовать ADOTable (в ссылке) и говорить
> что чтото оптимизируеш!?!?! нонсенс.


Хорошо! Пришел на ум красивый пример: Есть таблица с полем комментарий. В таблице большое число записей. Необходимо из всех комментариев удалить указанное нецензурное слово. Как бы вы решали такую задачу?


sniknik   (2007-07-13 17:03:00) [17]

какого рода условие?


Stanislav   (2007-07-13 17:03:00) [18]

вместо фильтра в SQL пиши Like '%москва%'


sniknik   (2007-07-13 17:02:00) [19]

> Запрос с условием, но опять же Акцесс (JET) его не поддерживает.
в смысле? как это не поддерживает?


sniknik   (2007-07-13 17:01:00) [20]

> Согласитесь построчно 10000 записей обработать солидная задержка.
две,три сек, на среднем компе, это солидно? (впрочем, возможно я переборщил... и займет меньше времени. хотя... если в каждом обрабатываемом текстовом поле чтото типа войны и мира...)

> Но в фильтре нет возможности учесть регистр поскольку "Москва","москва" ,"МОСКВА"   разные результаты.
как раз таки в фильтре это будет один результат. но и кроме того тебе предлагали аналог с твоим собственным обработчиком фильтра.

вообще не понимаю, использовать ADOTable (в ссылке) и говорить что чтото оптимизируеш!?!?! нонсенс.


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо