Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Получение данных из большой таблицы
|
|||
|---|---|---|---|
|
#18+
Здравствуйте! Есть таблица, в которой хранится трафик. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. Из этой таблицы нужно взять трафик для каждого client_id и поместить его в свой файл. client_id имеет около 16000 различных значений. Подскажите, как лучше выбирать данные? Записывать в файл будет скрипт либо на php, либо на python (еще не определился). Вариантов вижу несколько: 1. запрос для каждого client_id. Недостаток - очень много запросов. выполнение каждого запроса - около 3-4 секунд. 2. запрос для диапазонов - сначала от 1 до 100, затем от 101 до 200 и т.д. В скрипте можно будет открыть 100 файлов, и туда всё записать. Время выполнения одного запроса - 27секунд. 3. запрос всех данных. Не хочу загружать 6 гиг в оперативку. время выполнения не вычислял ;) 4. дамп таблицы и работа уже в текстовым файлом. время выполнения дампа - около 20 минут. Пока других вариантов не вижу, а хочется придумать, ибо такая задача будет выполняться каждую ночь. После создания таких файлов таблица будет удаляться. Надеюсь на ваши советы :) БД: PostgreSQL 8.3 Debian 4, 30Gb RAM, 4x2.8 CPU ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2008, 21:22 |
|
||
|
Получение данных из большой таблицы
|
|||
|---|---|---|---|
|
#18+
Скрябин Дмитрий wrote: > Table "internet.trafic_20080901" > Column | Type | Modifiers > -----------+-----------------------------+------------------------ > ip_from | inet | not null > port_from | character varying(*10*) | not null > ip_to | inet | not null > bytes | bigint | not null > t_t | smallint | not null > place | smallint | not null > tm | timestamp without time zone | not null default now() > client_id | integer | not null > Indexes: > "trafic_20080901_client_idx" btree (client_id) > > В таблице 80млн. записей, размер таблицы - 6Гб. > Из этой таблицы нужно взять трафик для каждого client_id и поместить его > в свой файл. select * from internet.trafic_20080901 order by client_id бежать по запросу, и переписывать данные в куда надо. Как только будет меняться client_id, закрывать предыдущий файл клиента и открывать следующий. Перед выполнением запроса проверьте его план, и убедитесь в том, что сервер не будет сортировать данные, а будет использовать индекс. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2008, 22:17 |
|
||
|
Получение данных из большой таблицы
|
|||
|---|---|---|---|
|
#18+
MasterZiv, в этом случае все данные будут в память загружаться всей кучей, все 6 гигабайт. Думаешь, это оптимальный вариант? Код: plaintext 1. 2. 3. 4. 5. 6. Планировщик решил, что правильнее будет индекс не использовать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2008, 08:03 |
|
||
|
Получение данных из большой таблицы
|
|||
|---|---|---|---|
|
#18+
Скрябин ДмитрийMasterZiv, в этом случае все данные будут в память загружаться всей кучей, все 6 гигабайт. Думаешь, это оптимальный вариант? Код: plaintext 1. 2. 3. 4. 5. 6. Планировщик решил, что правильнее будет индекс не использовать. Возможно проблема в SELECT * Перечислите только те поля, которые действительно вам необходимы для суммирования. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2008, 08:27 |
|
||
|
Получение данных из большой таблицы
|
|||
|---|---|---|---|
|
#18+
Kruchinin Pahan, Даже если одно поле выбрать - все равно индекс не используется. Да и не много толку будет тут от индекса - все равно все данные загружать. Код: plaintext 1. 2. 3. 4. 5. 6. 7. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2008, 09:46 |
|
||
|
Получение данных из большой таблицы
|
|||
|---|---|---|---|
|
#18+
Скрябин ДмитрийKruchinin Pahan, Даже если одно поле выбрать - все равно индекс не используется. Да и не много толку будет тут от индекса - все равно все данные загружать. Значит, действительно нет необходимости. В реальности, иногда сортировка всей таблы ускоряется, если по индексу. Но, в общем-то MasterZiv прав. Данный способ может оказаться самым быстрым. Чтобы много памяти на клиенте не жрать, можно Fetch кусками делать (через курсор). И работать с небольшими блоками. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2008, 09:50 |
|
||
|
Получение данных из большой таблицы
|
|||
|---|---|---|---|
|
#18+
Скрябин Дмитрий wrote: > MasterZiv, в этом случае все данные будут в память загружаться всей > кучей, все 6 гигабайт. А ты можешь как-то обработать данные, не читая их в память ? Ну, давай, телепат ... Думаешь, это оптимальный вариант? Да, 100%. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2008, 11:27 |
|
||
|
Получение данных из большой таблицы
|
|||
|---|---|---|---|
|
#18+
Kruchinin Pahan wrote: > Планировщик решил, что правильнее будет индекс не использовать. > > > Возможно проблема в SELECT * > Перечислите только те поля, которые действительно вам необходимы для > суммирования. А это на скорость не повлияет. Таблица всё равно будет читаться. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2008, 11:28 |
|
||
|
Получение данных из большой таблицы
|
|||
|---|---|---|---|
|
#18+
Скрябин Дмитрий wrote: > db3=> explain select * from internet.trafic_20080901 order by client_id; > QUERY PLAN > ----------------------------------------------------------------------------------- > Sort (cost=*23744033*.*47*..*23944644*.*35* rows=*80244352* width=*43*) > Sort Key: client_id > -> Seq Scan on trafic_20080901 (cost=*0*.*00*..*1552201*.*52* rows=*80244352* width=*43*) > (*3* rows) > > > Планировщик решил, что правильнее будет индекс не использовать. Ой, я это просмотрел. Нет, надо его ЗАСТАВИТЬ использовать индекс и не сортировать данные. Иначе - будет труба. Сортировать такой массив данных очень сложно. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2008, 11:29 |
|
||
|
Получение данных из большой таблицы
|
|||
|---|---|---|---|
|
#18+
Скрябин Дмитрий wrote: > Даже если одно поле выбрать - все равно индекс не используется. Да и не > много толку будет тут от индекса - все равно все данные загружать. Использование индекса даст возможность не сортировать таблицу. Она у тебя большая. А если ты заставишь сканировать индекс, то, поскольку индекс упорядочен, серверу не придётся сортировать таблицу. Оптимизатор вполне оправдано не берёт индекс, потому что сканировать без индекса конечно же быстрее. Но сортировать дольше. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2008, 11:31 |
|
||
|
Получение данных из большой таблицы
|
|||
|---|---|---|---|
|
#18+
MasterZiv Использование индекса даст возможность не сортировать таблицу. Она у тебя большая. А если ты заставишь сканировать индекс, то, поскольку индекс упорядочен, серверу не придётся сортировать таблицу. Оптимизатор вполне оправдано не берёт индекс, потому что сканировать без индекса конечно же быстрее. Но сортировать дольше. Posted via ActualForum NNTP Server 1.4 Согласен. Туплю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2008, 11:59 |
|
||
|
Получение данных из большой таблицы
|
|||
|---|---|---|---|
|
#18+
А еще быстрее, не использовать индекс и не сортировать данные, выполнять full scan, обрабатывать данные кусками. Файлы открывать по необходимости, а закрывать после завершения всех операций. При поступлении очередной записи записывать ее в нужный файловый поток. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2008, 12:12 |
|
||
|
Получение данных из большой таблицы
|
|||
|---|---|---|---|
|
#18+
MySQLCraft wrote: > А еще быстрее, не использовать индекс и не сортировать данные, выполнять > full scan, обрабатывать данные кусками. Файлы открывать по > необходимости, а закрывать после завершения всех операций. При > поступлении очередной записи записывать ее в нужный файловый поток. Я бы так и посоветовал бы, если бы не количество групп: "Из этой таблицы нужно взять трафик для каждого client_id и поместить его в свой файл. client_id имеет около 16000 различных значений." 16000 - многовато. В некоторых ОС даже столько файловых дескрипторов не открыть. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2008, 12:36 |
|
||
|
Получение данных из большой таблицы
|
|||
|---|---|---|---|
|
#18+
MasterZiv Скрябин Дмитрий wrote: > MasterZiv, в этом случае все данные будут в память загружаться всей > кучей, все 6 гигабайт. А ты можешь как-то обработать данные, не читая их в память ? Posted via ActualForum NNTP Server 1.4 Вот, оказывается, могу :) Не читая их разом. Совсем не подумал про курсоры - спасибо Kruchinin Pahan! Так и сделаю. Была трудность как раз в том, чтобы по минимуму нагружать базу и использовать меньше оперативной памяти в процессе работы с этой таблицей. курсоры как раз подходят Открыть 16000 файлов конечно не получится, думаю разбить все данные сначала на 100 файлов (по диапазонам client_id), потом каждый файл еще на 100, тогда в конечном итоге будет в каждом файле не более 100 разных client_id. Там уже каждый файл можно разложить на требуемые файлы. 100 дескрипторов система спокойно потянет :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2008, 13:20 |
|
||
|
Получение данных из большой таблицы
|
|||
|---|---|---|---|
|
#18+
Скрябин ДмитрийMasterZiv, в этом случае все данные будут в память загружаться всей кучей, все 6 гигабайт. Думаешь, это оптимальный вариант? Код: plaintext 1. 2. 3. 4. 5. 6. Планировщик решил, что правильнее будет индекс не использовать.сделайте set enable_seqscan to off; ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2008, 13:40 |
|
||
|
Получение данных из большой таблицы
|
|||
|---|---|---|---|
|
#18+
MasterZiv MySQLCraft wrote: > А еще быстрее, не использовать индекс и не сортировать данные, выполнять > full scan, обрабатывать данные кусками. Файлы открывать по > необходимости, а закрывать после завершения всех операций. При > поступлении очередной записи записывать ее в нужный файловый поток. Я бы так и посоветовал бы, если бы не количество групп: "Из этой таблицы нужно взять трафик для каждого client_id и поместить его в свой файл. client_id имеет около 16000 различных значений." 16000 - многовато. В некоторых ОС даже столько файловых дескрипторов не открыть. Posted via ActualForum NNTP Server 1.4 Буферизовать массивы в оперативной памяти и периодически скидывать на диск, открывая столько файлов, сколько потянет ОС. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2008, 14:24 |
|
||
|
Получение данных из большой таблицы
|
|||
|---|---|---|---|
|
#18+
Но лучше, открывать только один файл, чтобы не было конкуренции между потоками при записи. Короче. Второй поток, получает порции данных от SQL сервера и сортирует их по 16000 массивам. Второй поток обходит по очереди не пустые массивы, забирает оттуда данные и обнуляет текущий массив, открывает соответствующий файл, пишет, закрывает файл. Периодичность обхода зависит от ограничений оперативки и субъективных критериев. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2008, 14:36 |
|
||
|
Получение данных из большой таблицы
|
|||
|---|---|---|---|
|
#18+
очепятка "Короче. Первый поток"... )))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2008, 14:38 |
|
||
|
Получение данных из большой таблицы
|
|||
|---|---|---|---|
|
#18+
Скрябин Дмитрий wrote: > Вот, оказывается, могу :) Не читая их разом. Совсем не подумал про > курсоры - спасибо Kruchinin Pahan! Так и сделаю. Ты думаешь, что курсоры не тянут куски таблицы в память ? Ты ошибаешься, курсор - ровно такой же запрос, как и все остальное. > Открыть 16000 файлов конечно не получится, думаю разбить все данные > сначала на 100 файлов (по диапазонам client_id), потом каждый файл еще > на 100, тогда в конечном итоге будет в каждом файле не более 100 разных > client_id. Там уже каждый файл можно разложить на требуемые файлы. 100 > дескрипторов система спокойно потянет :) Увеличишь только свою работу внесколько раз. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2008, 15:26 |
|
||
|
Получение данных из большой таблицы
|
|||
|---|---|---|---|
|
#18+
MySQLCraft wrote: > Буферизовать массивы в оперативной памяти и периодически скидывать на > диск, открывая столько файлов, сколько потянет ОС. а если не влезет ? Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2008, 15:27 |
|
||
|
Получение данных из большой таблицы
|
|||
|---|---|---|---|
|
#18+
авторТы думаешь, что курсоры не тянут куски таблицы в память ? Ты ошибаешься, курсор - ровно такой же запрос, как и все остальное. Конечно тянут - но не все 6 гиг сразу, а частями. поэтому в единицу времени скрипт требует не так много памяти. MySQLCraft, спасибо, попробую оба варианта и сравню скорость :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2008, 15:54 |
|
||
|
Получение данных из большой таблицы
|
|||
|---|---|---|---|
|
#18+
а SQL-комманду COPY вы не рассматривали? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2008, 17:10 |
|
||
|
Получение данных из большой таблицы
|
|||
|---|---|---|---|
|
#18+
Скрябин Дмитрий wrote: > Конечно тянут - но не все 6 гиг сразу, а частями. поэтому в единицу > времени скрипт требует не так много памяти. Так и запрос тебе все 6 гигов сразу не вытащит. Точно так же кусками и будет подтаскивать. На самом деле курсоры сами используются внутри сервера, когда вы запрос выполняете. Это ровно то же самое. вы бежите fetch-ем по строкам, это и есть курсор. > MySQLCraft, спасибо, попробую оба варианта и сравню скорость :) Бессмысленно пробовать два варианта. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2008, 18:30 |
|
||
|
Получение данных из большой таблицы
|
|||
|---|---|---|---|
|
#18+
как вариант данные в таблицу подгружать и обрабатывать порциями client_id разбить на группы group_id и партицировать эти группы .. или вовсе разнести в разные таблицы (если позволяет устройство загрузки трафика) выгребать вашим 1-м вариантом несколькими потоками (по идее время select должно значительно уменьшиться, количество запросов в единицу времени возрасти) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.10.2008, 00:12 |
|
||
|
Получение данных из большой таблицы
|
|||
|---|---|---|---|
|
#18+
MasterZiv Так и запрос тебе все 6 гигов сразу не вытащит. Точно так же кусками и будет подтаскивать. На самом деле курсоры сами используются внутри сервера, когда вы запрос выполняете. Это ровно то же самое. вы бежите fetch-ем по строкам, это и есть курсор. На самом деле это не так. Точнее не совсем так, о чем нам и говорит первый абзац в разделе "38.7. Cursors" в документации. Я написал 2 тестовых скрипта, первый тянет данные одним запросом, второй - через курсоры. Второй использует в разы меньше памяти. Если интересует - могу выложить текст скриптов, сами убетитесь или опровергните мое утверждение. Sishnikov, COPY TO рассматривал, но не остановился на нем. php копирует команду только в массив. А копирование в файл во-первых, требует прав postgres, во-вторых, это то же, что и дамп таблицы - проще наверно сделать дамп, если решу работать с текстовым файлом. Степан Н., к сожалению, трафик сейчас можно загружать только в одну таблицу :( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.10.2008, 11:34 |
|
||
|
Получение данных из большой таблицы
|
|||
|---|---|---|---|
|
#18+
Скрябин Дмитрий wrote: > На самом деле это не так. Точнее не совсем так, о чем нам и говорит > первый абзац в разделе "38.7. Cursors" в документации. Я написал 2 > тестовых скрипта, первый тянет данные одним запросом, второй - через > курсоры. Второй использует в разы меньше памяти. Если интересует - могу > выложить текст скриптов, сами убетитесь или опровергните мое утверждение. Ну давайте. Я вот не могу представить, почему бы это могло быть так. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.10.2008, 16:35 |
|
||
|
Получение данных из большой таблицы
|
|||
|---|---|---|---|
|
#18+
MasterZiv, тестовыя таблица temp из 3114832 записей. В первом случае выполняем запрос целиком: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. Код: plaintext 1. 2. 3. 4. 5. 6. 7. Второй вариант, загружаем данные в курсоре по 100000 записей: Код: 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. Код: 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. По-моему, результат на лицо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.10.2008, 09:26 |
|
||
|
Получение данных из большой таблицы
|
|||
|---|---|---|---|
|
#18+
Скрябин Дмитрий wrote: > MasterZiv, тестовыя таблица temp из 3114832 записей. > В первом случае выполняем запрос целиком: Это вы не так смотрите. Это вы FETCH тестируете и PHP. PHP я бы вообще исключил бы из эксперимента, простой консолькой работал бы. Ну и в одном случае вы ждёте выполнения запроса до конца, и засасывания всех его результатов в память. А во втором случае - не ждёте до конца, получаете только 100 тыщ записей, ну и памяти меньше, потому что получаете и выбрасываете тут же. Не, в общем, не убедили. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.10.2008, 16:45 |
|
||
|
Получение данных из большой таблицы
|
|||
|---|---|---|---|
|
#18+
MasterZiv, либо вы себе противоречите, либо мы друг друга не поняли. Что касается php, то изначально я сказал, что буду писать на php или python. Теория с командной строкой не канает - нужно проверять в том, в чем будешь работать. Хотя с командной строкой будет так же ;) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.10.2008, 19:36 |
|
||
|
Получение данных из большой таблицы
|
|||
|---|---|---|---|
|
#18+
Скрябин Дмитрий wrote: > MasterZiv, либо вы себе противоречите, либо мы друг друга не поняли. Что > касается php, то изначально я сказал, что буду писать на php или python. Вы можете в этом вашем PHP или питоне (думаю, в питоне точно можно) вы-FETCH-ивать ПО ОДНОЙ строке ? Если сможете, на клиенте вообще практически память заниматься не будет. > Теория с командной строкой не канает - нужно проверять в том, в чем > будешь работать. Хотя с командной строкой будет так же ;) Нужно думать мозгами, а не проверять. Я вам говорю, что эти два способа ничем друг от друга не отличаются. Память жрёт ваш PHP, куда вы запихиваете ВЕСЬ набор данных в одном случае, и 100 тыщ записей в другой. А жрать оно не должно ВООБЩЕ ничего в нормально написанном приложении (для вашей конкретной цели). Возмите выполните в psql тот же запрос, и поглядите сколько он будет сжирать памяти, я думаю, вы не заметите большой разницы. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.10.2008, 22:12 |
|
||
|
Получение данных из большой таблицы
|
|||
|---|---|---|---|
|
#18+
Скрябин Дмитрий wrote: > MasterZiv, либо вы себе противоречите, либо мы друг друга не поняли. А, я понял, почему по вашему мнению я сам себе противоречу. Я вообще про производительность клиента не говорил. Только про серверную. Вы же меня грузите клиентской производительностью. А она тут вообще роли не играет, если всё нормально делать. Производительность суммарная будет определяться производительностью чтения PSQL-ем данных из таблицы и записи вашим клиентом туда, куда вы там записываете (например, диска). Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.10.2008, 22:16 |
|
||
|
Получение данных из большой таблицы
|
|||
|---|---|---|---|
|
#18+
MasterZiv Нужно думать мозгами, а не проверять. Я вам говорю, что эти два способа ничем друг от друга не отличаются. Память жрёт ваш PHP, куда вы запихиваете ВЕСЬ набор данных в одном случае, и 100 тыщ записей в другой. А жрать оно не должно ВООБЩЕ ничего в нормально написанном приложении (для вашей конкретной цели). Возмите выполните в psql тот же запрос, и поглядите сколько он будет сжирать памяти, я думаю, вы не заметите большой разницы. Память жрёт не PHP, а клиентская библиотека libpq. В случае с psql числа будут примерно такими же. И вообще, MasterZiv , уровень понтов в твоих сообщениях значительно превосходит уровень понимания вопроса. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.10.2008, 12:09 |
|
||
|
Получение данных из большой таблицы
|
|||
|---|---|---|---|
|
#18+
MasterZiv, вы бы сначала проверили, а затем уже говорили. psql - это простейшая оболочка, тот же клиент. И она тоже получает все данные за раз. Что касается сервера - он отдает то, что у него попросили. Попросили 100 записей - он отдал 100 записей, попросили все - он отдал всё. Если вы считаете, что запрашивать данные с сервера по одной строке - это правильное решение, то вы, мягко говоря, ошибаетесь. Это не есть "нормально написанное приложение". И не важно, какой язык. хоть си, хоть php. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.10.2008, 14:11 |
|
||
|
Получение данных из большой таблицы
|
|||
|---|---|---|---|
|
#18+
Sad Spirit wrote: > Память жрёт не PHP, а клиентская библиотека libpq. В случае с psql числа > будут примерно такими же. В общем-то разница небольшая. Но я думаю всё же, что это именно PHP. > И вообще, *MasterZiv*, уровень понтов в твоих сообщениях значительно > превосходит уровень понимания вопроса. Да пожалуйста, не хочешь - не слушай. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.10.2008, 20:20 |
|
||
|
Получение данных из большой таблицы
|
|||
|---|---|---|---|
|
#18+
Скрябин Дмитрий wrote: > MasterZiv, вы бы сначала проверили, а затем уже говорили. psql - это > простейшая оболочка, тот же клиент. И она тоже получает все данные за раз. Всё же может быть построчно... > Что касается сервера - он отдает то, что у него попросили. Попросили 100 > записей - он отдал 100 записей, попросили все - он отдал всё. > Если вы считаете, что запрашивать данные с сервера по одной строке - это > правильное решение, то вы, мягко говоря, ошибаетесь. Это не есть Да,правильное. Запрашивать, обрабатывать, и освобождать память под следующие данные. Так именно и работают высокопроизводительные утилиты типа выгзузки данных. Можно обрабатывать также небольшими блоками, но это на самом деле всё равно, обычно API работы с базой данных всё равно работает буферами по N строк, по одной строке никто не дёргает. > "нормально написанное приложение". И не важно, какой язык. хоть си, хоть > php. Ну, PHP-то здесь естественно ни при чём. Там можно было бы делать fetch в курсоре по одной записи (по 10 записей). Или какой-то другой вызов API делать, который не тащит весь набор на клиента. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.10.2008, 20:24 |
|
||
|
Получение данных из большой таблицы
|
|||
|---|---|---|---|
|
#18+
Скрябин Дмитрий wrote: > MasterZiv, вы бы сначала проверили, а затем уже говорили. psql - это > простейшая оболочка, тот же клиент. И она тоже получает все данные за раз. > Что касается сервера - он отдает то, что у него попросили. Попросили 100 Ну, что ж вы мне тут рассказываете ? Вот кусок кода PSQL Код: 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. правда, оно там курсор серверный тоже явно использует. Странно, почему. Ну да ладно, ведь может же по одной строчке. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.10.2008, 21:11 |
|
||
|
|

start [/forum/topic.php?all=1&fid=53&tid=2003953]: |
0ms |
get settings: |
8ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
43ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
74ms |
get tp. blocked users: |
2ms |
| others: | 228ms |
| total: | 388ms |

| 0 / 0 |
