2012-01-11 4 views
0

У меня есть таблица в Access с 1 полем с именем HostName, это текстовое поле со 100 символами макс. Я использую его для хранения имен хостов DNS. Поле настраивается как первичный ключ. Если я следующий запрос возвращает ожидаемые результаты, но занимает около 8 секунд, чтобы завершить на столе с 1 миллиона записей:Запрос доступа, не использующий индекс

ВЫБРАТЬ TOP 1 HostsRev.HostName FROM HostsRev WHERE (((HostsRev.HostName)> = "test")) ORDER BY HostsRev.HostName;

Если я удаляю часть «ORDER BY», она возвращается менее чем за 1 секунду, но не всегда возвращает то, что я ожидаю, а не первую запись, которая равна = = «test».

Я делаю запрос через ADO из приложения C++, но я также тестировал в Access, создавая запрос и получая те же результаты.

Мне нужно быстро найти первую запись, если она есть, которая начинается с заданной строки. Я также попытался использовать LIKE-запрос, но имел те же результаты. Мне нужно сделать это, потому что, если я ищу на сайте images.google.com, мне нужно знать, содержит ли список google.com, но не images.google.com (я фактически храню имена хостов в порядке обратной строки, чтобы сделать эту работу правильно , и переверните строки перед выполнением поиска).

ответ

1

Вопрос заключается в том, что TOP команда по себе не применяется сортировки данных, поэтому без ORDER BY он вернется в другом порядке, и, таким образом, дают разные результаты, вы можете попробовать следующие вместо:

SELECT Min(HostName) FROM HostsRev WHERE HostName >= "test" 

не уверен, если это даст какой-либо более высокую производительность, но, хотя стоит идти:)

+0

В этом была проблема, я просто решил немного по-другому. Поскольку мои имена хостов используют известный формат, я добавил что-то вроде WHERE HostName> = "test" И HostName <= ".test", который получил начальную фильтрацию вплоть до нескольких записей, а затем верхняя часть 1 выбора могла быть быстрой. – eselk

0

Я не уверен, если вы можете сделать это из C++, не будучи C++ программист, но ADO поддерживает свойство .index к позволяют вам указать индекс, который вы хотите использовать, и метод .seek для поиска по этому индексу. вот какой код в VB для чего он стоит.

Dim conn As ADODB.Connection 
Dim rs As ADODB.Recordset 

Set conn = New ADODB.Connection 
conn.Open ConnectionString 

rs.Open "mytable", conn 
rs.Index = "primarykey" 
rs.Seek "test", adSeekAfterEQ 
If rs.EOF Then ' record not found 
Смежные вопросы