Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.09.2009, 10:22   #1
GenniY
Форумчанин
 
Регистрация: 09.09.2009
Сообщений: 181
Счастье Индексы в БД

Привет всем.
Подскажите, пожалуйста, вкратце, что нужно знать про индексы и как ими пользоваться в Делфях.
Краткую теорию я знаю.
Получил помощь — отблагодарил.
GenniY вне форума Ответить с цитированием
Старый 23.09.2009, 11:16   #2
GenniY
Форумчанин
 
Регистрация: 09.09.2009
Сообщений: 181
Счастье

Простой индекс на поле при использовании LIKE '%Name' (например) работать не будет. Индексирование идет слева-направо. При этом нужно создать дополнительный индекс reverse(colum).

Вопрос: А Что делать когда нужно использовать при поиске LIKE '%Name%'?
Получил помощь — отблагодарил.
GenniY вне форума Ответить с цитированием
Старый 23.09.2009, 11:28   #3
фЁдОр
Форумчанин
 
Аватар для фЁдОр
 
Регистрация: 06.09.2007
Сообщений: 908
По умолчанию

используя LIKE я понимаю, что вы пользуетесь query, а индекс является отличительной особенностью компонента TTable. так что пишите так же LIKE '%Name%' и используйте order by для сортировки.
фЁдОр вне форума Ответить с цитированием
Старый 23.09.2009, 11:38   #4
GenniY
Форумчанин
 
Регистрация: 09.09.2009
Сообщений: 181
По умолчанию

Да я использую Query и нужно только этот компонент.
Но вы меня немножко неправильно поняли. Выборку с сортировкой я знаю как делать. Меня интересует, как создать индекс, что бы такой запрос сработал с использованием индекса?

Цитата:
возьмём такой запрос: SELECT email_address FROM customers WHERE email_address LIKE '%@yahoo.com';. Этот запрос должен нам найти всех клиентов, у которых е-мейл заканчивается на "@yahoo.com", однако даже если по столбцу email_address есть индекс, СУБД всё равно будет использовать полный перебор таблицы. Это связано с тем, что индексы строятся в предположении, что слова/символы идут слева направо. Использование символа подстановки в начале условия поиска исключает для СУБД возможность использования поиска по B-дереву. Эта проблема может быть решена созданием дополнительного индекса по выражению reverse(email_address) и формированием запроса вида: select email_address from customers where reverse(email_address) like reverse('%@yahoo.com');. В данном случае символ подстановки окажется в самой правой позиции ("moc.oohay@%"), что не исключает использование индекса по reverse(email_address).
Получил помощь — отблагодарил.

Последний раз редактировалось GenniY; 23.09.2009 в 11:40. Причина: 1
GenniY вне форума Ответить с цитированием
Старый 23.09.2009, 11:44   #5
фЁдОр
Форумчанин
 
Аватар для фЁдОр
 
Регистрация: 06.09.2007
Сообщений: 908
По умолчанию

насколько мне известо если в таблице есть индексы, то они автоматически задействуются, т.е. в запросе вы не можете явно указать индекс.
фЁдОр вне форума Ответить с цитированием
Старый 23.09.2009, 11:48   #6
soleil@mmc
SQL-коддинг
Участник клуба
 
Регистрация: 16.01.2009
Сообщений: 1,192
По умолчанию

а в чем вопрос-то?
вот и создай свой индекс по полю reverse(...)

а для полноты ответов требуется и полнота вопроса со всеми нюансами (субд, версия и т.п.)
soleil@mmc вне форума Ответить с цитированием
Старый 23.09.2009, 11:57   #7
GenniY
Форумчанин
 
Регистрация: 09.09.2009
Сообщений: 181
По умолчанию

Цитата:
вот и создай свой индекс по полю reverse(...)
reverse сработает только когда символ подстановки стоит в первой позиции!
Также сработает простой индекс с использование LiKE когда '%' стоит в конце.

А что сделать когда LIKE '%Name%'?

СУБД — Oracle 10
Получил помощь — отблагодарил.
GenniY вне форума Ответить с цитированием
Старый 23.09.2009, 12:14   #8
soleil@mmc
SQL-коддинг
Участник клуба
 
Регистрация: 16.01.2009
Сообщений: 1,192
По умолчанию

Цитата:
Сообщение от GenniY Посмотреть сообщение
А что сделать когда LIKE '%Name%'?
только разбивка запроса так чтобы % был одним, либо мириться с фуллсканом, либо научиться юзать регулярные выражения
soleil@mmc вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Индексы в строке Шура Помощь студентам 3 27.11.2008 17:55
БД. Индексы и ключи Сергей089 Помощь студентам 4 22.09.2008 21:30
Надстрочные индексы в RichEdit Serega_P Общие вопросы Delphi 4 20.06.2008 11:34
Индексы AlexDoul БД в Delphi 12 24.11.2007 16:52
Индексы Таня84 БД в Delphi 4 20.03.2007 14:09