Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Использование Like в поиске по БД / 7 сообщений из 7, страница 1 из 1
13.06.2006, 18:46
    #33788678
Ющенко
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование Like в поиске по БД
Собственно вопрос: Есть интернет-магазин книг (про него уже писал когда-то)!
И по полю в которое входит название книги и автора, например:
"Маркетинг туристских услуг. // Восколович Н.А. "

поэтому полю в данный момент происходит поиск с использованием оператора "like"

Код: plaintext
1.
2.
3.
4.
select kod_b,ImyaBook,Izdatelstvo,year_b,price,link,UrlPicture,[description],
(select count(id_b) from Price_Books where ImyaBook like '%'+@FindStr+'%') as colStr
from Price_Books
where ImyaBook like '%'+@FindStr+'%'
order by id_b

пользователь может вводить в окно поиска и имя автора и название книжки!

Тем не менее при росте кол-ва книг производительность запроса будет "хромать"!
Как на ваш взгляд лучше переделать механизм поиска поделитесь соображениями и опытом (кому не жалко :))?

зы добавлять еще одно окошко на странице чтобы искать и по автору и по книге как-то не хочется (крайний вариант).
...
Рейтинг: 0 / 0
13.06.2006, 19:11
    #33788723
Axeleron
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование Like в поиске по БД
1) Крайне всё-таки желательно искать по нескольким параметрам.
2) Завставить юзера ввести определённое минимальное количество символом из названия книги.
3) Если MS SQL Server, советую:
Код: plaintext
1.
2.
3.
4.
5.
select kod_b,ImyaBook,Izdatelstvo,year_b,price,link,UrlPicture,[description],
(select count(id_b) from Price_Books where ImyaBook like '%'+@FindStr+'%') as colStr
from Price_Books (NOLOCK)
where ImyaBook like '%'+@FindStr+'%'
order by id_b
4) Неудачная структура. Два раза ищите по частям названия книги в одной таблице. Не понятно что и зачем это:
Код: plaintext
1.
(select count(id_b) from Price_Books where ImyaBook like '%'+@FindStr+'%') as colStr
Пока не будет ясно, вряд ли что-то можно оптимизировать, но плохая практика таблице ссылаться на саму себя. В общем, ждём пояснений...
...
Рейтинг: 0 / 0
14.06.2006, 01:03
    #33788988
profil
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование Like в поиске по БД
как вариант - создать таблицу, в которую заносить все ключевые слова, а поиск производить уже по ней...


Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
14.06.2006, 09:41
    #33789235
hDrummer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование Like в поиске по БД
Хочу обратить ваше внимание на возможность SQL-инъекции в запрос вида

where ImyaBook like '%'+@FindStr+'%'
...
Рейтинг: 0 / 0
14.06.2006, 11:51
    #33789705
Лиман Артём
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование Like в поиске по БД
думаю, тебе лучше обратиться в соседний форум по SQL Server - думаю там тебе смогут быстрее помочь дельным советом
_______________________________________________________
Never ask users what they want, or they'll tell you.
...
Рейтинг: 0 / 0
14.06.2006, 12:18
    #33789793
Ющенко
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование Like в поиске по БД
Axeleron
4) Неудачная структура. Два раза ищите по частям названия книги в одной таблице. Не понятно что и зачем это:
Код: plaintext
1.
(select count(id_b) from Price_Books where ImyaBook like '%'+@FindStr+'%') as colStr
Пока не будет ясно, вряд ли что-то можно оптимизировать, но плохая практика таблице ссылаться на саму себя. В общем, ждём пояснений...

Для получения количества книг в возвращаемом наборе!
зы хотя есть "загвоздки" в написание клиента, поэтому пока предпочитаю использовать ф-ию агрегации, а не делать подсчет датасета на клиенте. Но в будущем я думаю уберу "лишнее" в запросе!

конечно план без count
Код: plaintext
 |--Clustered Index Scan(OBJECT:([Eshop].[dbo].[Price_Books].[PK_Price_Books_1]),  WHERE:(like([Price_Books].[ImyaBook], '%'+[@FindStr]+'%', NULL)) ORDERED FORWARD)


а с count

Код: plaintext
1.
2.
3.
4.
5.
|--Compute Scalar(DEFINE:([Expr1002]=[Expr1002]))
       |--Nested Loops(Inner Join)
            |--Compute Scalar(DEFINE:([Expr1002]=Convert([Expr1023])))
            |    |--Stream Aggregate(DEFINE:([Expr1023]=Count(*)))
            |         |--Clustered Index Scan(OBJECT:([Eshop].[dbo].[Price_Books].[PK_Price_Books_1]), WHERE:(like([Price_Books].[ImyaBook], '%'+[@FindStr]+'%', NULL)))
            |--Clustered Index Scan(OBJECT:([Eshop].[dbo].[Price_Books].[PK_Price_Books_1]),  WHERE:(like([Price_Books].[ImyaBook], '%'+[@FindStr]+'%', NULL)) ORDERED FORWARD)

2 Лиман Артём

Попробую



profil как вариант - создать таблицу, в которую заносить все ключевые слова, а поиск производить уже по ней...

не самый легкий вариант на мой взгляд ....
...
Рейтинг: 0 / 0
14.06.2006, 12:22
    #33789813
profil
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование Like в поиске по БД
> не самый легкий вариант на мой взгляд ....
возможно... но пригодиться при проектировании следующего магазина :)


Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Использование Like в поиске по БД / 7 сообщений из 7, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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