|
|
|
Можно ли такое сделать запросом?
|
|||
|---|---|---|---|
|
#18+
Исходные данные: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Необходимо подсчитать колво уникальных записей по полю Name Сначала сделал такой запрос: Код: plaintext 1. 2. Результат соотв.: 2 1 2 получили запрос из 3 записей - что и ожидалось... но как просто подсчитать их кол-во? (фетч не предлагать - там их оч. много) перебрал уже все варианты, даже сумел положить сервер (1.5 релиз) таким вот запросом: Код: plaintext 1. 2. 3. 4. ЗЫ, COUNT на вьюв таки получилось, но в у меня в реальной задаче еще динамический where :( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.03.2004, 20:47 |
|
||
|
Можно ли такое сделать запросом?
|
|||
|---|---|---|---|
|
#18+
Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.03.2004, 21:39 |
|
||
|
Можно ли такое сделать запросом?
|
|||
|---|---|---|---|
|
#18+
Вот это? select count("Code") from "TAB1" where "Name" in ( SELECT "Name" FROM "TAB1" GROUP BY "Name" having count("Name")=1) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2004, 04:06 |
|
||
|
Можно ли такое сделать запросом?
|
|||
|---|---|---|---|
|
#18+
Код: plaintext век живи - век учись... огромное спасибо! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2004, 12:28 |
|
||
|
Можно ли такое сделать запросом?
|
|||
|---|---|---|---|
|
#18+
епт! только ж почему DISTINCT не использует индекс по Name ??? это даже тормознее, чем фетчить по моему запросу :( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2004, 13:40 |
|
||
|
Можно ли такое сделать запросом?
|
|||
|---|---|---|---|
|
#18+
мдя, придется, видимо, ХП делать, раз никто не знает :( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2004, 21:16 |
|
||
|
Можно ли такое сделать запросом?
|
|||
|---|---|---|---|
|
#18+
Ну не факт что с индексом быстрее. Если записей в таблице очень много, то попробуй так: Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2004, 21:26 |
|
||
|
Можно ли такое сделать запросом?
|
|||
|---|---|---|---|
|
#18+
А может мне кто-нибудь объяснить, почему этот запрос SELECT COUNT(DISTINCT NAME) FROM TAB1 вообще должен использовать индекс и какой от индекса толк в данном случае . И не совсем понятно как здесь может помочь ХП - разве в любом случае, не придется пробежаться по всем записям? Спрашиваю не из желания поумничать - мне в самом деле не понятно. 2Gold Мне кажется (могу ошибаться) ваш запрос вернет N-е количество едениц. Причем N будет равно значению count (distinct) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2004, 21:45 |
|
||
|
Можно ли такое сделать запросом?
|
|||
|---|---|---|---|
|
#18+
Я 2Gold Мне кажется (могу ошибаться) ваш запрос вернет N-е количество едениц. Причем N будет равно значению count (distinct) Или имеется ввиду использовать данный запрос в ХП, а потом выполнить select count(*) для этой процедуры? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2004, 22:00 |
|
||
|
Можно ли такое сделать запросом?
|
|||
|---|---|---|---|
|
#18+
Может я и торможу :-( Тогда можно написать Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2004, 22:36 |
|
||
|
Можно ли такое сделать запросом?
|
|||
|---|---|---|---|
|
#18+
>SELECT COUNT(NAME) FROM TAB1 GROUP BY NAME Да это почти тоже, только вместо едениц будет содержать количество вхождений того или иного name. Я в принципе не об этом - как здесь может быть использован индекс по name если name не используется в условии where ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2004, 22:42 |
|
||
|
Можно ли такое сделать запросом?
|
|||
|---|---|---|---|
|
#18+
Вернее так (извращение): Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2004, 22:50 |
|
||
|
Можно ли такое сделать запросом?
|
|||
|---|---|---|---|
|
#18+
Да что-то я затормозил. Я ещё хотел посоветовать SELECT SUM(COUNT(...)) ... и SELECT COUNT(SELECT ...) ... Хорошо вовремя остановился ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2004, 22:51 |
|
||
|
Можно ли такое сделать запросом?
|
|||
|---|---|---|---|
|
#18+
>SELECT COUNT(*) FROM TAB1 WHERE NAME=ANY(SELECT NAME FROM TAB1 GROUP BY NAME) Да уж - по моему это еще медленее , чем просто select count(distinct)) Ладно, пойду я тоже спать - все равной мой вопрос игнорируют. Пациент: Доктор, вы знаете, меня все игнорируют! Доктор: Следующий! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2004, 23:02 |
|
||
|
Можно ли такое сделать запросом?
|
|||
|---|---|---|---|
|
#18+
2 Somebody Somebody>SELECT COUNT(NAME) FROM TAB1 GROUP BY NAME как здесь может быть использован индекс по name если name не используется в условии where NAME используется в GROUP BY, следовательно нужна сортировка. Она может быть выполнена навигацией по индексу (ORDER-план) или вычитыванием записей в буфер с последующей внешней сортировкой (SORT-план). С DISTINCT тоже самое - эффективно убрать дубликаты можно только в отсортированном наборе. Вот только в последних версиях (то ли с IB 5.6, то ли с IB 6.0) оптимизатор никогда не использует индексную навигацию для выполнения DISTINCT. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2004, 09:59 |
|
||
|
Можно ли такое сделать запросом?
|
|||
|---|---|---|---|
|
#18+
dimitrВот только в последних версиях (то ли с IB 5.6, то ли с IB 6.0) оптимизатор никогда не использует индексную навигацию для выполнения DISTINCT. Хм. А это как чревато? В смысле не вернуть ли все назад чтобы по индексам строил выборку. Или не нужно и тогда почему. P.S. Кстати, а что там с конференцией? Подвисла? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2004, 10:07 |
|
||
|
Можно ли такое сделать запросом?
|
|||
|---|---|---|---|
|
#18+
авторХм. А это как чревато? В смысле не вернуть ли все назад чтобы по индексам строил выборку. Или не нужно и тогда почему. Там нюансов много. Каждый раз, когда борманы это делали, всплывали новые баги. Пол-оптимизатора утыкано комментариями на эту тему :-) После того, как там затычка уже сидела на затычке, они отключили это нафиг. Да и очевидных преимуществ это не даст в большинстве случаев. ORDER-план для сортировки (при условии полной выборки, т.е. fetch-all) становится эффективным при hit-ratio страничного кеша выше 90%, чтобы минимизировать потери на случайный доступ к записям. Внешняя сортировка же от эффективности кеша не зависит и приводит к замедлению только при уходе на диск (когда сортируемые объемы большие). Но в этом случае (большие объемы) ORDER-план просто убьет страничный кеш и тоже приведет к значительному I/O. К GROUP BY это все тоже относится, но он все же чаще используется в fetch-first паттернах, чем DISTINCT, и поэтому его выгодно отображать на индекс, если это возможно. авторP.S. Кстати, а что там с конференцией? Подвисла? Вроде через гейт все работает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2004, 10:37 |
|
||
|
Можно ли такое сделать запросом?
|
|||
|---|---|---|---|
|
#18+
2dimitr thks. Понятно. Т.е. сортировка используется в любом случае, если я правильно понял. Проверял на таблице из порядка 172000 записей - count (distinct) визуально работает примерно столько же времени как и group by, хотя в первом случае план натурал, а во втором используется индекс соответствующего поля . Хотя может просто записей мало. Ну и насчет Gold SELECT COUNT(*) FROM TAB1 WHERE NAME=ANY(SELECT NAME FROM TAB1 GROUP BY NAME) Проверил (из любопытства) подобное на этой же таблице... Минут 20 IBConsole просто висела, а затем я ее "убил"... Эх Gold, Gold ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2004, 10:47 |
|
||
|
Можно ли такое сделать запросом?
|
|||
|---|---|---|---|
|
#18+
авторПроверил (из любопытства) подобное на этой же таблице... Минут 20 IBConsole просто висела, а затем я ее "убил"... Это удивляет? ;-) Код: plaintext 1. 2. превращается сервером в: Код: plaintext 1. 2. В результате, имеем коррелированный подзапрос, выполняющийся для каждой записи из TAB1. Вдобавок, этот подзапрос имеет абсолютно избыточную группировку. Ну и наконец, этим подсчитается просто число записей в TAB1 ;-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2004, 11:01 |
|
||
|
Можно ли такое сделать запросом?
|
|||
|---|---|---|---|
|
#18+
2dimitr >Это удивляет? ;-) Да вобщем нет Но результат превзошел все ожидания ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2004, 11:18 |
|
||
|
|

start [/forum/topic.php?fid=40&msg=32439667&tid=1579021]: |
0ms |
get settings: |
8ms |
get forum list: |
11ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
174ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
45ms |
get tp. blocked users: |
1ms |
| others: | 218ms |
| total: | 474ms |

| 0 / 0 |
