|
LIMIT, JOIN и использование индексов
|
|||
---|---|---|---|
#18+
servitLeXa NalBat...а Ваш запрос сначала выберет случайные 50 строк из этой сотни...Запрос сперва выберет первые 50 минимальных уникальных значений поля f1 ... Приведите пример данных, так как на моих данных (я пробовал несколько комбинаций) результаты в обоих случаях совпадают.разве Cache в запросе "select TOP 50 f1 from test.C order by f1" уникализирует выдачу DISTINCT-ом? мой контр-пример - "например в таблице A есть 100 строк с одинаковым минимальным значением f1". ... |
|||
:
Нравится:
Не нравится:
|
|||
15.03.2012, 13:14 |
|
LIMIT, JOIN и использование индексов
|
|||
---|---|---|---|
#18+
LeXa NalBatразве Cache в запросе "select TOP 50 f1 from test.C order by f1" уникализирует выдачу DISTINCT-ом?Если вызвать этот запрос отдельно, то нет - вернутся 50 одинаковых значений. Но в контексте подзапроса для конструкции TOP/ORDER BY действуют специальные оптимизации . Даже запрос select TOP 50 * from test.C where f1 in (select top all f1 from test.C order by f1) order by f1,f2 отрабатывает быстро. LeXa NalBatмой контр-пример - "например в таблице A есть 100 строк с одинаковым минимальным значением f1".Пробую: &sql(truncate table test.C) for i=1:1:60 &sql(insert into test.C(f1,f2) values(2,10)) for i=1:1:40 &sql(insert into test.C(f1,f2) values(2,1)) for i=1:1:60 &sql(insert into test.C(f1,f2) values(1,10)) for i=1:1:40 &sql(insert into test.C(f1,f2) values(1,1)) Все три варианта запроса возвращают одинаковый результат: #IDf1f2116111216211316311416411516511616611716711816811916911101701111171111217211131731114174111517511161761117177111817811191791120180112118111221821123183112418411251851126186112718711281881129189113019011311911132192113319311341941135195113619611371971138198113919911402001141101110421021104310311044104110451051104610611047107110481081104910911050110110 ... |
|||
:
Нравится:
Не нравится:
|
|||
15.03.2012, 15:23 |
|
LIMIT, JOIN и использование индексов
|
|||
---|---|---|---|
#18+
Bond_JamesBond...Смущает только без индексов для 1млн выполнение 2,5 секунды, остальные субд справляются за 300-500мс....Ничего определённого не могу сказать на этот счёт: кэширование, умение оптимизатора создавать/использовать неявные индексы, др. Можно попробовать оптимизатору через хинты явно указать не использовать никаких индексов. Bond_JamesBondМожет к Cache адаптер сделать :)... Попробуйте . Помимо поддержки Java, .NET, Delphi, PHP и др. разработчики недавно добавили нативную поддержку для node.js . Кроме реляционного интерфейса Вы ещё можете попробовать объектный или прямой. Bond_JamesBondКак у них кстати с SQL compliance, в смысле поддержка WINDOW функций, RECURSIVE CTE, и наличие каких-нибудь дебильных ограничений, типа того что временную таблицу нельзя юзать 2 раза в одном запросе (помню убило меня такое ограничение в MySQL)Свои ограничения есть, как и везде. Например, нельзя cделать в федеративном хранилище гетерогенные запросы к таблицам от разных источников данных. То есть, если у Вас одна таблица принадлежит Oracle, а другая допустим MySQL, то над ними вместе нельзя сделать, к примеру, операцию JOIN. SQL-92 Compliance Caché SQL Reference WarstoneЕсли вы пользуете Коше, то пользуйте его COS(вроде-бы)... Просто то-же самое, но написанное на SQL будет в 1,5 - 2 раза медленней.Примеры выше показывают, что и на SQL скорость бывает приемлемая. Хотя, конечно, если есть необходимость добиться ещё большей скорости, то всегда можно "спуститься" с SQL и/или объектов на уровень ниже (NoSQL). Если не получается декларативно сделать быстро, то можно сделать это императивно. COS (Caché ObjectScript) - более универсальный язык (потомок M ) и позволяет писать любой код с использованием объектов/классов, запросов; c доступом к низкоуровневым структурам (глобалам). На нём можно писать также код, не относящийся напрямую к работе с данными, например: работа с почтой, файлами, X.509 сертификатами, XML, SOAP и т.д. В СУБД Caché для этого есть довольно богатая библиотека готовых классов . ... |
|||
:
Нравится:
Не нравится:
|
|||
15.03.2012, 15:50 |
|
LIMIT, JOIN и использование индексов
|
|||
---|---|---|---|
#18+
servit, Не, нас интересует только "базовый" SQL. И вообщем, то поддержка SQL 2003 - (в 99- поддержка RECURSIVE CTE, в 2003 - window функции), все остальное - не критично. Вот что-то их я не нашел (хотя может невнимательно искал). Может поделитесь ссылкой? ... |
|||
:
Нравится:
Не нравится:
|
|||
15.03.2012, 16:43 |
|
LIMIT, JOIN и использование индексов
|
|||
---|---|---|---|
#18+
Bond_JamesBondНе, нас интересует только "базовый" SQL. И вообщем, то поддержка SQL 2003 - (в 99 - поддержка RECURSIVE CTE, в 2003 - window функции), все остальное - не критично. Вот что-то их я не нашел (хотя может невнимательно искал). Может поделитесь ссылкой?Именно таких функций нет. Но уверен, что есть конструкции-аналоги или специальные предикаты к функциям, которые помогут Вам получить желаемый результат, например: аналог ROW_NUMBER() два типа вычисляемых полей %AFTERHAVING %FOREACH %INLIST FOR SOME и т.д. Помимо прочего для SQL представлены объектные расширения ( Special Features ), позволяющие в большинстве случаев отказаться от JOIN множества таблиц, а также упрощающих работу с полями-коллекциями. PS: посмотрите ещё Caché Transact-SQL (TSQL) Migration Guide . ... |
|||
:
Нравится:
Не нравится:
|
|||
15.03.2012, 18:06 |
|
LIMIT, JOIN и использование индексов
|
|||
---|---|---|---|
#18+
servitLeXa NalBatразве Cache в запросе "select TOP 50 f1 from test.C order by f1" уникализирует выдачу DISTINCT-ом?Если вызвать этот запрос отдельно, то нет - вернутся 50 одинаковых значений. Но в контексте подзапроса для конструкции TOP/ORDER BY действуют специальные оптимизации .не нашел подтверждения в разделе "The TOP Clause" по вашей ссылке. servit &sql(truncate table test.C) for i=1:1:60 &sql(insert into test.C(f1,f2) values(2,10)) for i=1:1:40 &sql(insert into test.C(f1,f2) values(2,1)) for i=1:1:60 &sql(insert into test.C(f1,f2) values(1,10)) for i=1:1:40 &sql(insert into test.C(f1,f2) values(1,1))а что на этих данных выдаст такой запрос select * from test.C where f1 in (select top 2 f1 from test.C order by f1) order by f1,f2 PS: убираю ваше цветное форматирование не со зла. :) а из-за того, что при цитировании текст портится вопросительными знаками. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.03.2012, 18:54 |
|
LIMIT, JOIN и использование индексов
|
|||
---|---|---|---|
#18+
LeXa NalBatа что на этих данных выдаст такой запрос select * from test.C where f1 in (select top 2 f1 from test.C order by f1) order by f1,f2 РезультатIDf1f216111162111631116411165111661116711168111691117011171111721117311174111751117611177111781117911180111811118211183111841118511186111871118811189111901119111192111931119411195111961119711198111991120011101110102110103110104110105110106110107110108110109110110110111110112110113110114110115110116110117110118110119110120110121110122110123110124110125110126110127110128110129110130110131110132110133110134110135110136110137110138110139110140110141110142110143110144110145110146110147110148110149110150110151110152110153110154110155110156110157110158110159110160110 ... |
|||
:
Нравится:
Не нравится:
|
|||
15.03.2012, 22:06 |
|
LIMIT, JOIN и использование индексов
|
|||
---|---|---|---|
#18+
servitLeXa NalBatа что на этих данных выдаст такой запрос select * from test.C where f1 in (select top 2 f1 from test.C order by f1) order by f1,f2Результат ...то есть такой результат опровергает Ваши утверждения "Запрос сперва выберет первые 50 минимальных уникальных значений поля f1" и "Если вызвать этот запрос отдельно, то ... вернутся 50 одинаковых значений. Но в контексте подзапроса для конструкции TOP/ORDER BY ...", так как по-вашему подзапрос "select top 2" выбрал бы два уникальных значения f1 = 1 и 2, и внешний запрос возвратил бы все 200 строк из тестовой таблицы. PS: однако я понял, что мое утверждение о неэквивалентности Вашего запроса исходному не верно. и на моем контр-примере "например в таблице A есть 100 строк с одинаковым минимальным значением f1" Ваш запрос выдаст правильный результат. потому что условию f1 IN ( 1 ) удовлетворяют 100 строк, и они все упорядочатся по (f1,f2), и лишь после этого часть строк отсечется. то есть Ваш запрос правильный. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.03.2012, 00:19 |
|
LIMIT, JOIN и использование индексов
|
|||
---|---|---|---|
#18+
LeXa NalBat , Да, Вы правы: я неточно описал работу первоначального запроса. Под это описание подходит следующий запрос: select top 50 * from test.C where f1 in (select distinct top 50 f1 from test.C) order by f1,f2 select distinct top 50 f1 from test.C Оптимизатор пройдётся по индексу idxF1, который изначально уже отсортирован, отсекая повторяющиеся значения и ограничивая результат до 50 элементов.Цитата из документации по ссылке вышеHowever, Caché applies the DISTINCT and ORDER BY keywords (if specified) before selecting the TOP rows.PS: но в общем случае могут быть ситуации, например, 100млн одинаковых f1, когда один лишь индекс на f1 не поможет. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.03.2012, 11:02 |
|
|
start [/forum/topic.php?fid=35&msg=37707715&tid=1552577]: |
0ms |
get settings: |
9ms |
get forum list: |
11ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
35ms |
get topic data: |
12ms |
get forum data: |
2ms |
get page messages: |
50ms |
get tp. blocked users: |
2ms |
others: | 249ms |
total: | 378ms |
0 / 0 |