11.01.2008, 14:49 | #21 |
MCTS
|
|
|
11.01.2008, 14:52 | #22 |
Участник
|
а планы запросов можешь привести?
|
|
11.01.2008, 14:54 | #23 |
Участник
|
|
|
11.01.2008, 15:04 | #24 |
MCTS
|
У меня на 200 000 записей время было около секунды, поэтому, собственно и пользовался функцией WinAPI::getTickCount() для большей точности вместо timeNow(). Сомнительно, что устойчивая разница в 10 раз является погрешностью. Меня больше интересует exists join, но как вариант, можно еще поиследовать и INNER JOIN
|
|
11.01.2008, 16:30 | #25 |
Участник
|
Вопросы для тестового примера:
1. В какую сторону сделано выравнивание поля id ? 2. Какая версия SQL сервера ? 3. Какой Collation установлен на базе ? |
|
11.01.2008, 19:38 | #26 |
Модератор
|
Цитата:
Такая постановка вопроса не имеет смысла, так как единственный ответ на него - 'it depends' Твой тест не на 100% корректен Во-первых - не зря выше про выравнивание спросили. В зависимости от настроек выравнивания EDT выравнивания для LIKE могут различаться. Более адекватным для сравнения exists join с промежуточной таблицей был бы запрос (Trans.Id == 1 || Trans.Id == 2 || .. ) Во-вторых, начали c X++: SELECT LEDGERTRANS EXISTS JOIN X++: SELECT COUNT(RECID) и т.д. У меня на LEDGERTRANS около 5 млн записей (правда, LEDGERTRANS индексирован нестандартно ) EXISTS JOIN с временной таблицей шуршит примерно на 60% (350мс против 600мс) быстрее Все равно мне вариант с EXISTS JOIN не нравится - он будет сильно зависеть от условий запроса (наполнения промежуточной таблицы), т.е. менее предсказуем в дальнейшем. Если промежуточная таблица статичная (настроечная) - такой вариант имеет право на существование, если ее перед каждым запросом придется наполнять (не забываем про многопользовательскую работу) - отказать
__________________
-ТСЯ или -ТЬСЯ ? |
|
12.01.2008, 11:32 | #27 |
MCTS
|
Выравнивание - right, как и на большинстве основных справочников в системе.
Цитата:
Цитата:
Сообщение от Vadik
Кто сильнее - кит или слон?
Такая постановка вопроса не имеет смысла, так как единственный ответ на него - 'it depends' ......... Все равно мне вариант с EXISTS JOIN не нравится - он будет сильно зависеть от условий запроса (наполнения промежуточной таблицы), т.е. менее предсказуем в дальнейшем. Если промежуточная таблица статичная (настроечная) - такой вариант имеет право на существование, если ее перед каждым запросом придется наполнять (не забываем про многопользовательскую работу) - отказать Получается, что если 2-ая таблица (param), определяющая выборку записей из 1-ой (trans), - настроечная (является статической, и содержит не более 10-15 записей), то вариант с exists join значительно предпочтительнее использования like с маской, так как дает ощутимый прирост производительности (от в 1,5 до более чем в 10 раз). |
|
14.01.2008, 10:18 | #28 |
Участник
|
|
|
14.01.2008, 12:00 | #29 |
Участник
|
|
|
14.01.2008, 12:29 | #30 |
Участник
|
В смысле правильных результатов, то да. С точки зрения производительности, тоже должно быть не хуже чем с дополнительной таблицей, т.к. прямое указание критерия в запросе на SQL преобразуется в конкретное значение с ведущими пробелами, а при использовании like используется ltrim, исключающий использование индексов.
|
|
|
За это сообщение автора поблагодарили: kashperuk (5). |
14.01.2008, 13:48 | #31 |
Участник
|
но тогда получается, что результат будет неэквивалентен like
|
|
14.01.2008, 14:30 | #32 |
Участник
|
|
|