Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.12.10;
Скачать: CL | DM;

Вниз

Запись в таблицу и поиск   Найти похожие ветки 

 
MixAnOL ©   (2006-10-04 16:21) [0]

Здарова Всем!

Возник вопрос, мне нужно организовать поиск среди нескольких десятков тысяч текстовых строк. Т.е. выбрать строки соответствующие, например, шаблону "йц*". Причем набор строк строится  динимически.
Вот и думаю как это сделать, что бы поиск занимал минимальное кол-во времени.
Подумал, что можно загонять в таблицу и SQL LIKE мне там поможет... и соответственно возник вопрос какую СУБД использовать.

Где-то видел, но не смог сейчас найти, компоненты поддерживающие SQL для простых таблиц...


 
Desdechado ©   (2006-10-04 16:24) [1]

Если тебе только по первым символам искать, то никакой SQL и СУБД 100 леи не нужен. Просто сортируешь свой TStringList и потом в сортированном это ищется моментально. Можешь свой двоичный или другой поиск подключить.

Кстати, если не по первым символам искать, то LIKE в SQL не будет использовать индекс, т.е. все равно толку нет.


 
Stanislav ©   (2006-10-04 16:25) [2]

MSACCESS подойдет, если одновременно будет работать 1 пользователь.
А на текстовое поле нужно поставить индекс.


 
MixAnOL ©   (2006-10-04 16:41) [3]


> MSACCESS подойдет, если одновременно будет работать 1 пользователь.
>
> А на текстовое поле нужно поставить индекс.

А тормозить не будет, если я туда 80000 строк текста[255] закорячу?

> если не по первым символам искать

нужно не только по первым...


 
Stanislav ©   (2006-10-04 16:44) [4]

MixAnOL ©   (04.10.06 16:41) [3]
недолжно.


 
MixAnOL ©   (2006-10-04 16:51) [5]

там в акцесе вроде фишка была, что при delete from table1, сами записи не удаляются, т.е. если я 100 раз засуну в таблицу по 80000 строк, то у меня база нехилая станет по размеру..


 
Sergey13 ©   (2006-10-04 16:55) [6]

> [3] MixAnOL ©   (04.10.06 16:41)

А откуда эти 80000 строк?


 
AngeL B.   (2006-10-04 16:58) [7]


> нужно не только по первым...

А тогда всё равно что использовать, потому что поиск всё равно будет линейным.

Можно и просто TStringList вместе с for-ом и pos-ом


 
sniknik ©   (2006-10-04 17:04) [8]

> там в акцесе вроде фишка была, что при delete from table1, сами записи не удаляются
эта фишка практически в любой базе... (так сразу и не вспомнить где этого нет...)

> т.е. если я 100 раз засуну в таблицу по 80000 строк, то у меня база нехилая станет по размеру..
> 80000 строк текста[255] с текстом "под завязку" до последнего байта, это примерно 40мег. 100 ра это 400 мег., пока до 1,5 гигбайта не дойдет можеш не буспокоиться, а место из под удаленных записей используется повторно...

> Можно и просто TStringList вместе с for-ом и pos-ом
движок базы скорее всего сделает это более оптимальным способом. сравнить бы надо.


 
MsGuns ©   (2006-10-04 17:10) [9]

>Stanislav ©   (04.10.06 16:25) [2]
>MSACCESS подойдет, если одновременно будет работать 1 пользователь.

Глупость

>А на текстовое поле нужно поставить индекс.

Еще одна.


 
MixAnOL ©   (2006-10-04 17:10) [10]


> движок базы скорее всего сделает это более оптимальным способом

вот почему мне и не охота руками поиск делать...


 
Stanislav ©   (2006-10-04 17:12) [11]

MsGuns ©   (04.10.06 17:10) [9]
?


 
sniknik ©   (2006-10-04 17:20) [12]

> MsGuns ©   (04.10.06 17:10) [9]
> ?
поиск внутри строки индексов не использует, а к базе аксесса разрешено до 5ти подключений с одной машины (вернее там сформулировано более хитро, типа "гарантируется работа" или типа того, не хочу смотреть в доку лень, а на самом деле позволяется гораздо больше)


 
Stanislav ©   (2006-10-04 17:27) [13]

sniknik ©   (04.10.06 17:20) [12]

Для многопользовательской работы может подойти больше другая БД.
А индекс используется при Like "йц*". , не используется в Like "*йц*", во всяком случае в MSSQL.


 
MsGuns ©   (2006-10-04 17:33) [14]

>Stanislav ©   (04.10.06 17:27) [13]
>Для многопользовательской работы может подойти больше другая БД.

Для организации многопользовательской работы нужна прежде всего другая ТЕХНОЛОГИЯ. А уже потом "другая БД".

>А индекс используется при Like "йц*". , не используется в Like "*йц*", во всяком случае в MSSQL.

Поинтересуйтесь механизмом использования индексов "серверными поисковиками" (например, в том же BOL для MS SQL) и много чего узнаете. Например то, что в некоторых случаях создание "лишних" индексов может существенно ЗАМЕДЛИТЬ поиск и (особенно !) выборку.


 
sniknik ©   (2006-10-04 17:45) [15]

> Для многопользовательской работы может подойти больше другая БД.
это вовсе не одно и тоже с "аксесс может работать только с одним пользователем".

> А индекс используется при Like "йц*". , не используется в Like "*йц*", во всяком случае в MSSQL.
под фразу в [12] "внутри строки" подходит только второй вариант, т.к. первый это будет вначале. т.е. ты повторил сказаное в [12] только своими словами... не пойму, повторение является ответом? или есть какойто другой, тайный смысл послания?


 
Stanislav ©   (2006-10-05 08:44) [16]

1. На момент моего ответа [2]. речь нешлп о поиске внутри строки, поэтому индекс был просто необходим.
2. Даже при поиске либо внутри строки либо по первым буквам индекс такж е необходим, т.к. при поиске внутри строки он просто использоваться не будет, а при поиске по первым буквам скорость поиска увеличиться в разы.
К тому же автору захочется отсортировать найденый материал, где индекс также необходим.
3. MsGuns ©   (04.10.06 17:33) [14]  Я отлично знаком с индексами и могу уверить что это не тот случай где индекс может мешать выборке.
4. А для развеевания сомнений MsGuns ©  мы попросим MixAnOL © произвести тест на производительность с индексом и без и опубликовать результаты, если конечно MixAnOL © не против.
со sniknik © по поводу Access спорить не буду, но обращаю внимание что я не говорил что акцесс может работать с одним пользователем
MSACCESS подойдет, если одновременно будет работать 1 пользователь - это несет совершенно другой смысл.
Исходя из вышесказанного можно с полной уверенностью заявить что глупости были высказаны в [9] , [14].
А в [2] ответы на вопросы изложенные в автором.
ВОТ!


 
Sergey13 ©   (2006-10-05 09:02) [17]

> Причем набор строк строится  динимически.

Если это происходит перед каждым поиском, то использование БД, ИМХО, вообще нецелесообразно.


 
MsGuns ©   (2006-10-05 10:18) [18]

>Stanislav ©   (05.10.06 08:44) [16]
>Исходя из вышесказанного можно с полной уверенностью заявить что глупости были высказаны в [9] , [14].

Блажен кто верует ;)

>А в [2] ответы на вопросы изложенные в автором.

А в [2] есть ответы на поставленные вопросы ?


 
MixAnOL ©   (2006-10-05 11:58) [19]


> мы попросим MixAnOL © произвести тест на производительность
> с индексом и без и опубликовать результаты, если конечно
> MixAnOL © не против

не против, как только будут результаты - откину сюда, самому интересно...


 
Stanislav ©   (2006-10-05 15:10) [20]

Чтобы дальше не спорить привожу результаты своего теста
Тест проводился на ACCESS c таблицей в 316945 записей,
Размер текстового поля - 100 знаков
Максимальная длинна внесенной строки состовляет 35 знаков
Запрос:SELECT Count(*) AS CNT
FROM dbo_SOSTDET
WHERE (((dbo_SOSTDET.NOMDOK) Like "%37%"));
Вот результаты
параметр-колво записей - время в сек без инд. - время в сек с индексом
%37 - 854 - 0,045 - 0,045
37 - 39 - 0,06 - 0,04
37% - 1425 - 0,044 - 0,0006
%37%-3504-0,045-0,045



Страницы: 1 вся ветка

Текущий архив: 2006.12.10;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.029 c
15-1164184841
zdm
2006-11-22 11:40
2006.12.10
INDY attach


2-1164561641
Busik
2006-11-26 20:20
2006.12.10
Мой вопрос про изменение атрибутов файлов


15-1163771975
Labamba
2006-11-17 16:59
2006.12.10
PIN to PIN messages


2-1164160871
Shedow
2006-11-22 05:01
2006.12.10
трафикометр


3-1160132563
Ikela
2006-10-06 15:02
2006.12.10
TDBGrid