2009-08-05 2 views
0

Который будет быстрее, от ответа зависит:Какой из этих двух конструкций БД приведет к более быстрым запросам?

1) Ищет числовой идентификатор в таблице Б А, а затем запрашивает другую таблицу В для всех экземпляров этого числового идентификатора. где таблица B, вероятно, будет в 100 раз больше.

2) Запрос таблицы B непосредственно для данной строки.

Теперь, когда я пишу это, я думаю, что интуитивно решение 1 выполняется быстрее (это то, что я собирался делать в любом случае), но хотел бы знать ваши мысли.

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

+0

Вы должны дать более подробную информацию об этих Если, например, они являются последними именами, то нет, для этого нет смысла иметь отдельную таблицу. Теперь, если строка, о которой идет речь, представляет собой большой текст, тогда вам может быть лучше использовать функцию хэширования. На самом деле все зависит от ваших данных. –

+0

Струны будут объектами, такими как «Автомобиль», «Дом», «Художник», «Барак Обама», Соединенные Штаты Америки или предикаты, такие как «используется», является президентом и т. Д. Я не думаю, что они достаточно велики, чтобы оправдать хеширование. – Ankur

ответ

2

Фактически вы строите свой собственный индекс. Базы данных делают это очень хорошо. Добавьте соответствующие индексы в таблицу B и дайте Db выполнить работу.

1

В основном это зависит от используемого вами механизма SQL (Oracle, SQL Server, MySQL, Postgres и т. Д.), Поскольку все они будут оптимизироваться по-разному.

Из моего опыта работы с SQL Server я не видел никакой измеримой разницы между поиском номера или поиском строки, при условии, что целевые столбцы соответствующим образом индексируются. Таким образом, я бы выбрал (2), поскольку это один меньше SQL-запросов. Тем не менее, я бы сравнивал каждое решение, а также проверял тайминги ...

У меня было слишком много случаев, когда был сделан регресс «по соображениям производительности» обратным огнем или имел неоправданную выгоду, решение, подобное этому, на жестких цифрах, а не на теоретической основе.

0

Это вопрос о нормализации?

Является ли строка хранимой несколько раз в вашей таблице B? Вы спрашиваете, следует ли хранить эту строку в таблице B, а также таблицу A.

Я бы сказал, что вариант 1 - лучший способ пойти.

TableA - ID_A, имя, данные ...

TableB - "струнами" ID_B, ID_A, данные ...

SELECT 
    * 
FROM 
    TableA 
INNER JOIN 
    TableB 
ON 
    TableA.ID_A = TableB.ID_A 
WHERE 
    TableA.Name LIKE '%search%'