|
|
|
Вопрос про эффективность запросов, наверное OFF, но очень надо :)
|
|||
|---|---|---|---|
|
#18+
Как быстрее: объединить таблицы или поставить лишние проверки? Собственно, вопрос такой: Пусть есть две таблицы - таблица стран и таблица городов. Каждому городу приписан id страны, в которой годо находится. Пусть еще есть таблица гостиниц, каждой гостинице приписан id города. Предыдущим запросом я выбрал все города, которые находятся в конкретной стране (это делается в любом случае). Теперь мне нужно сделать выборку гостиниц, которые находятся в этой же стране. Есть соответственно два способа, с объединением 3 таблиц и 2 таблиц с более мощным условием. SELECT hotels.name FROM hotels, cities WHERE hotels.city_id = cities.city_id AND cities.country_id = ID-нужной-страны; или: SELECT hotels.name FROM hotels WHERE hotels.city_id = ID-города-1-в-нужной стране OR hotels.city_id = ID-города-2-в-нужной-стране OR hotels.city_id = ID-города-3-в-нужной-стране; Как сделать лучше? Основное требование - скорость, база данных скорее всего Access. Или может я вообще неправильно организовал таблицы для этой задачи? :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.06.2002, 13:16:56 |
|
||
|
Вопрос про эффективность запросов, наверное OFF, но очень надо :)
|
|||
|---|---|---|---|
|
#18+
Вопрос не имеет однозначного ответа. Очень много переменных величин. Основной критерий - это практика. Т.е. сделай оба варианта на конкретной базе данных с заведомо большим числом записей и посмотри, что будет быстрее. Для очень грубой оценки не учитывающей оптимизацию запросов и использование индексов можно прикинуть общее количество записей, которое необходимо обработать. Например, у тебя 10 стран (10 записей), в каждой стране 10 городов (100 записей) и в каждом городе 10 гостиниц (1000 записей). Если использовать все 3 таблицы в одном запросе, то необходимо обработать 10*100*1000=1 000 000 записей Если делать 2 последовательных запроса, то необходимо обработать в первом запросе 10*100=1 000 записей. В результате пусть окажутся те же 10 городов, тогда во втором запросе 10*1000=10 000. Итого 1000+10000=11 000 Т.е. при использовании 2 последовательных запросов необходимо обработать примерно в 100 раз меньше записей чем при использовании 1 запроса. Однако, эта оценка применительно к скорости выборки весьма приблизительна, поскольку не учитывает использование индексов. При использовании одного запроса все индексы задействованы, а при использовании 2 последовательных таблиц у промежуточной таблицы нет индекса. И что тут перевесит: уменьшение количества записей или использование индекса зависит от конкретной задачи и средства разработки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.06.2002, 15:26:51 |
|
||
|
Вопрос про эффективность запросов, наверное OFF, но очень надо :)
|
|||
|---|---|---|---|
|
#18+
Не совсем так, точнее совсем не так... Второй вариант мне, лично, вообще непонятен: а что делать если городов будет 100 или 1000? Первый вариант абсолютно нормальный, не заморачивайте себе и другим головы. А про 1 000 000 записей в предыдущем ответе - почитайте как SQL сервера делают планы запросов и для чего они (планы) нужны... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.06.2002, 21:44:25 |
|
||
|
Вопрос про эффективность запросов, наверное OFF, но очень надо :)
|
|||
|---|---|---|---|
|
#18+
Я бы на самом деле сделал следующее: У таблицы стран первичным ключом сделал CountryID. У таблицы городов первичным ключом сделал CountryID, CityID с Foreign Key на таблицу стран через CountryID. Соответственно, у таблицы гостиниц делается первичный ключ на CountryID, CityID, HotelID и Foreign key на таблицу гостиниц через CountryID, CityID. Все первичные ключи делаются кластерными. В таком случае производительность будет наилучшей. -- Слон ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.06.2002, 22:23:05 |
|
||
|
|

start [/forum/topic.php?fid=46&msg=32033117&tid=1822303]: |
0ms |
get settings: |
8ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
210ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
37ms |
get tp. blocked users: |
1ms |
| others: | 199ms |
| total: | 487ms |

| 0 / 0 |
