|
|
|
Группировка в больших таблицах?
|
|||
|---|---|---|---|
|
#18+
Дано: есть несколько больших таблиц, в которых есть некое числовое поле К, по которому нужно посчитать некую статистику (= сделать группировку). Есть два пути: 1. сделать сначала ЧАСТИЧНЫЕ группировки по "естественно заданному" материалу, то есть - в данном случае - по каждой отдельно таблице; потом - слить результаты этих частичных группировок в одну таблицу и еще раз повторить группировку. 2. слить сразу исходные данные (необходимые для группировки поля) в одну ГИГАНТСКУЮ таблицу, а потом - один раз - провести по ней группировку. Какой способ предпочтительнее, при условии, что даже каждая из исходных таблиц уже является большой - в том смысле, например, что не вмещается в оперативную память компьютера? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.02.2006, 22:50 |
|
||
|
Группировка в больших таблицах?
|
|||
|---|---|---|---|
|
#18+
Иван FXSКакой способ предпочтительнее, при условии, что даже каждая из исходных таблиц уже является большой - в том смысле, например, что не вмещается в оперативную память компьютера?А почему не третий, сразу написать запрос, берущий данные из всех таблиц без каких-либо копирований ? СУБД обычно и так неплохо умеют работать в условиях нехватки памяти. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2006, 00:36 |
|
||
|
Группировка в больших таблицах?
|
|||
|---|---|---|---|
|
#18+
В смысле - UNION? Но это, я так понимаю, разновидность 2-го варианта, поскольку Engine сольет все в одну (временную) таблицу, которую потом будет группировать. Насчет того, что "хорошо умеет" - наверное ... Вопрос у меня в следующем: если таблица гигантская, то Engine всяко ее будет обрабатывать как-то по частям; и если у меня данные исходно разбиты на много частей, так может их целесообразно так - по частями - и предобработать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2006, 02:02 |
|
||
|
Группировка в больших таблицах?
|
|||
|---|---|---|---|
|
#18+
Иван FXSВ смысле - UNION? Но это, я так понимаю, разновидность 2-го варианта, поскольку Engine сольет все в одну (временную) таблицу, которую потом будет группировать.Не уверен, очень многое зависит от СУБД и оптимизатора запросов. Промышленные СУБД, как правило, имеют алгоритмы для работы с данными, не помещающимися в ОЗУ, с минимизацией обращения к файлам. Ваше право - попытаться облегчить работу для СУБД, но, возможно, сначала стоило бы дать шанс СУБД, не исключено, что у нее это лучше получится. В конце концов, их для этого и пишут :) Искренне сожалею, но вряд ли смогу Вам помочь выбрать лучший вариант, так как есть сильная зависимость от конкретной ситуации. Например, 2 вариант невозможен, по причине нехватки свободного дискового пространства для копирования всей информации в одну таблицу. Да и копирование такое может потребовать неслабой дисковой активности, по типу, прочитал здесь, записал там, опять же, логирование может сильно увеличить нагрузку на диск. Поэтому 1 вариант выглядит несколько привлекательней, но у него могут быть свои трудности. В принципе, лучше один раз пройтись по одной таблице, чем много раз по разным, хотя бы потому что может пострадать общая эффективность физического чтения из-за невозможности упреждающего чтения. Опять же результаты придется тоже писать, а потом выполнять еще одну группировку. Насколько часто придется выполнять эту процедуру, какая активность будет на сервере, OS, СУБД, hardware, RAM, сколь велико отношение объема таблиц к ОЗУ, какие индексы, если используются ? В общем, нюансов масса и не уверен, что их можно учесть все, по крайней мере, в общем случае :) Так что, IMHO, если есть возможность, а процедура повторяющаяся, то, наверное, лучше проверить все варианты, хотя бы по разу. Не исключено, что в Вашей ситуации только один из вариантов окажется абсолютным победителем, хотя, повторюсь, сначала стоит дать шанс СУБД, вдруг результат Вас вполне устроит ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2006, 05:47 |
|
||
|
Группировка в больших таблицах?
|
|||
|---|---|---|---|
|
#18+
Иван FXSДано: есть несколько больших таблиц, в которых есть некое числовое поле К, по которому нужно посчитать некую статистику (= сделать группировку)...есть вероятность, что по полю K в некоторых "больших" таблицах есть индексы а также по иным полям, участвующим в выборках. Т.е вероятно вот это будет разумно SELECT xxx, ... FROM (SELECT yyy, ... FROM T1 GROUP by K UNION ALL SELECT yyy, ... FROM T2 GROUP by K ... UNION ALL SELECT yyy, ... FROM Tn GROUP by K ) GROUP by Y и ваапше "выборка в промежуточную таблицу" (но всё-таки выборочная, а не сплошной слив) обычно применяется на клиент-сервере (в локальную копию - где ее многократное перепрочтение дешевле), или при плохом владении SQL (за исключением случаев необходимости получения набора данных для многократного мспользования в разных участках некой процедуры/запроса). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2006, 11:49 |
|
||
|
Группировка в больших таблицах?
|
|||
|---|---|---|---|
|
#18+
4321 обычно применяется на клиент-сервере читать файл-сервере (пентература, мля, и ваабчхи ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2006, 11:51 |
|
||
|
Группировка в больших таблицах?
|
|||
|---|---|---|---|
|
#18+
4321есть вероятность, что по полю K в некоторых "больших" таблицах есть индексы - нет, в моей конкретной задаче индексов нет. Хотя, согласен, это - существенное обстоятельство, которое я должен был упомянуть! 4321SELECT xxx, ... FROM (SELECT yyy, ... FROM T1 GROUP by K UNION ALL ... SELECT yyy, ... FROM Tn GROUP by K ) GROUP by Y [/quot] - это я расцениваю как разновидность первого обозначенного мной варианта, поскольку на каждый "внутренний" SELECT - Engine будет создавать некую внутреннюю таблицу ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2006, 12:12 |
|
||
|
Группировка в больших таблицах?
|
|||
|---|---|---|---|
|
#18+
4321и ваапше "выборка в промежуточную таблицу" ..... за исключением случаев необходимости получения набора данных для многократного мспользования в разных участках некой процедуры/запроса). Да и для этого выборка в промежуточную таблицу не то чтобы особо нужна. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2006, 12:21 |
|
||
|
Группировка в больших таблицах?
|
|||
|---|---|---|---|
|
#18+
Иван FXSпоскольку на каждый "внутренний" SELECT - Engine будет создавать некую внутреннюю таблицу ... Говоря простым языком, Вы гоните. Я так подозреваю, на самом деле Вы используете некое свое представление о работе СУБД и некую свою терминологию, и в их рамках Ваше утверждение верно. Проблема только в том, что эта терминология очень уж расходится с принятой, а Вы не озаботились растолковать, что же Вы имеете в виду. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2006, 12:24 |
|
||
|
Группировка в больших таблицах?
|
|||
|---|---|---|---|
|
#18+
[quot softwarer] Да и для этого выборка в промежуточную таблицу не то чтобы особо нужна. [src oracle] ну это "ит-дипендз" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2006, 12:35 |
|
||
|
Группировка в больших таблицах?
|
|||
|---|---|---|---|
|
#18+
Дык, может и "гоню" ... А Вы утверждаете, что - при выполнении запроса: Код: plaintext 1. 2. 3. 4. 5. 6. Конечно, можно исходить из того, что - не наше дело, как работает enginе . Да только ... проблема в том, что ресурсов у компьютера маловато ... для моей задачи. И, можно сказать, что "в лоб" enginе просто не работает ! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2006, 12:40 |
|
||
|
Группировка в больших таблицах?
|
|||
|---|---|---|---|
|
#18+
Иван FXS enginе просто не работает ! вопрос должен ставицца так: Дано - инжайн - такой-то. вопрос - чито ему надо отвинтить нахрен?, чтобы он таки фурыкал. А ви таки гонити. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2006, 13:10 |
|
||
|
Группировка в больших таблицах?
|
|||
|---|---|---|---|
|
#18+
нууу ... скажу я Вам, что Engine - MS Access ... и что Вы посоетуете ему "отвинтить", чтобы он "летал" на таблицах больше Гига? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2006, 13:24 |
|
||
|
Группировка в больших таблицах?
|
|||
|---|---|---|---|
|
#18+
Иван FXSнууу ... скажу я Вам, что Engine - MS Access ... и что Вы посоетуете ему "отвинтить", чтобы он "летал" на таблицах больше Гига?а данные иде? на клиенте, или на файл - сервере? 1. Я бы выкачал базку с данными к себе 2. Я не делал бы глупостей типа попытки записать данные в одну та блитцу. (разве что сильно уже усеченные по числу строк выборки) 3. Я бы таки подумал, а не помогут ли мне те или иные индексы. 4. На худой конетц можно руками открыть рекордсеты (табличные, а не по запросам) и бежать по ним. При наличии нужного индекса (и его задании после открытия таблицы) такая пробежка немногим хуже самого енжайна, а если вы данные пробежки _очень_компактно_ куда-то пишете (группируя по мере изменения значения индекса), то память вам сильно не потребуется. (одна запись рекордсета + буфер накопления агрегатов для текущего значения индекса). Но ждать на гигабайтных данных вам таки придется. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2006, 13:41 |
|
||
|
Группировка в больших таблицах?
|
|||
|---|---|---|---|
|
#18+
Все данные на клиенте, это вообще - локальная задача. На самом деле - есть-таки третий вариант, к которому я сейчас и склоняюсь: писать данные, только не в нов ую , а - в нов ые таблица, разделяя эти данные СРАЗУ на классы по значению ключа. Конкретно, у меня ключ, по которому нужно групировать иследуемые данные, состоит из двух целочисленных полей. И я решил выписывать все данные в ЧЕТЫРЕ промежуточных таблицы - разделяя их по значениям пары (К1 mod 2, K2 mod 2). А потом - в каждой из этих четырех таблиц по очереди - производить группировку. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2006, 14:21 |
|
||
|
Группировка в больших таблицах?
|
|||
|---|---|---|---|
|
#18+
Иван FXSВсе данные на клиенте, это вообще - локальная задача. На самом деле - есть-таки третий вариант, к которому я сейчас и склоняюсь: писать данные, только не в нов ую , а - в нов ые таблица, разделяя эти данные СРАЗУ на классы по значению ключа. Конкретно, у меня ключ, по которому нужно групировать иследуемые данные, состоит из двух целочисленных полей. И я решил выписывать все данные в ЧЕТЫРЕ промежуточных таблицы - разделяя их по значениям пары (К1 mod 2, K2 mod 2). А потом - в каждой из этих четырех таблиц по очереди - производить группировку.мдя. ф сис теме без функциональных индексов вводить ключи, инфа из которых извлекаеццца токо методом декомпозиции, причем декомпозирующая ф-я не монотонна... И кто же вам насоветовал искать таких приключений на свой бэк-сайд? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2006, 14:29 |
|
||
|
Группировка в больших таблицах?
|
|||
|---|---|---|---|
|
#18+
Что-то Вы такое мудреное сказали, я не понял! 1. "ф системе без функциональных индексов" - ну да, в смысле -там индексы может и есть - свои в каждой таблице, но к тем полям, по которым мне нужно произвести ИССЛЕДОВАНИЕ (=группировку) они отношения не имеют. 2. "вводить ключи, инфа из которых извлекаеццца токо методом декомпозиции, причем декомпозирующая ф-я не монотонна" - эт надо бы перевести на язык ежиков! Еще раз: я выписываю из очччень разнородных таблиц данные, подготавливая их к последующей группировке, и сразу разделяя их на N таблиц - по тривиальному критерию. Так, что значения "признаков группировки" (= ключа) для записей (разных из этих N) таблиц заведомо не пересекаются ... В чем ересь? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2006, 14:57 |
|
||
|
Группировка в больших таблицах?
|
|||
|---|---|---|---|
|
#18+
как я понял, ключи у вас становятся осмысленными только после воздействия на них ф-й вида К1 mod 2 (т.е. "декомпозиции" - ф том смысле, что клютч не есь значимая велична, а есть композиция значимых величин, которые могут быть из него извлечены). т.е. мы имеем полный бардак на литце. (как правило это любят деить любители банд - поразрядных операторов BAND и т.п.) Если бы вы могли создать индекс не по К1, а именно по (К1 mod 2), то это било бы еще терпимо, (но усе равно - идиотством, имхо). Но аксесс под это не заточен. Не умеет он функциональных индексов. Если бы композирующая/декомпозирующая ф-я была монотонной, вы (но не движок - он об этом не знает) могли бы воспользоваться обычным индексом . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2006, 15:07 |
|
||
|
Группировка в больших таблицах?
|
|||
|---|---|---|---|
|
#18+
Нет, Вы неправильно поняли: mod я применяю только для того, чтобы разделить все множество значений интересующего меня ключа на четыре примерно одинаковых подмножества, и чтобы рассортировать выписываемые записи сразу в четыре таблицы, - в ндежде, что я потом смогу эти таблицы обработать по отдельности, поскольку целиком получающийся массив записейсквозь Engine не пролезает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2006, 15:12 |
|
||
|
Группировка в больших таблицах?
|
|||
|---|---|---|---|
|
#18+
кстати, как я понял, вам надо сгрупировать _всего_ четыре (в клюяах нет Null) записи - по количеству вариантов декомпозированных ключей (0,0)(0,1)(1,0)(1,1). ТАк откройте массив (0 to числоПолейРезультата, 0 to 3) вариантов, и копите туда свои агрегаты по мере MoveNext _по таблицам_. К памяти это не критично. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2006, 15:16 |
|
||
|
Группировка в больших таблицах?
|
|||
|---|---|---|---|
|
#18+
4321 ну это "ит-дипендз" Безусловно. Собственно, "ит дипендз" - вообще универсальный рефрен для любых местных обсуждений. Я в данном случае хотел показать, что это возможно. Ну и подозреваю, что постепенно это перейдет в "возможно практически везде". Иван FXSА Вы утверждаете, что - при выполнении запроса:...... - внутренние селекты НЕ БУДУТ выполняться (enginе-ом) по-отдельности? Я утверждаю нечто совершенно другое, никак не связанное со сказанным Вами сейчас. Поэтому сказанное комментировать не буду. Еще раз: я утверждаю, что данный запрос может быть выполнен без использования каких бы то ни было "внутренних промежуточных таблиц для каждого подзапроса". Как он выполняется в Вашем случае - вопрос для форума по соответствующей БД, и как его выполнить быстро - вопрос туда же. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2006, 15:21 |
|
||
|
Группировка в больших таблицах?
|
|||
|---|---|---|---|
|
#18+
Неужели я так непонятно объясняю? Мне необходимо посчитать статистику по ключу, состоящему из ПАРЫ целочисленных значений, находящихся в пределах от 1 до приблизительно 16 000 000. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2006, 15:27 |
|
||
|
Группировка в больших таблицах?
|
|||
|---|---|---|---|
|
#18+
Иван FXSНет, Вы неправильно поняли: теперь понял, что я всё неправильно понял :). ЗЫ1 А что, Top (+count + max) не годится для разборки таблицы на части? Обязательно надо mod-ить? короче, ставьте задачу конкретно, раз общие соображения ведут вас несколько не в ту степь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2006, 15:29 |
|
||
|
Группировка в больших таблицах?
|
|||
|---|---|---|---|
|
#18+
последний постер адресован 4321 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2006, 15:30 |
|
||
|
Группировка в больших таблицах?
|
|||
|---|---|---|---|
|
#18+
4321ЗЫ1 А что, Top (+count + max) не годится для разборки таблицы на части? Обязательно надо mod-ить? - идея состоит в том, чтобы не просто "разобрать таблицу на части", а в том, чтобы разобрать ее так, что все записи со значением ключа: (10000,20000) - попадут в одну "часть", а все записи со значением ключа: (10001,20000) - попадут в другую. Тогда - проведя группировку в каждой из получившихся таблиц ОТДЕЛЬНО (и по очереди) - я смогу потом просто "слить" результаты. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2006, 15:35 |
|
||
|
|

start [/forum/topic.php?fid=32&msg=33537422&tid=1545417]: |
0ms |
get settings: |
9ms |
get forum list: |
18ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
165ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
84ms |
get tp. blocked users: |
2ms |
| others: | 207ms |
| total: | 504ms |

| 0 / 0 |
