Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
SQL
|
|||
|---|---|---|---|
|
#18+
Вопросег... Пример: Хочу содержать у себя в одной таблице SQL все номера паспортов скажем Kитая. Тоесть миллиард строк в таблице. Проблема в том что если сделать один ключь то сделать SELECT на такую таблицу возьмет много времени. После некоторых тестов понятно что делить такую таблицу на пре ключи тоже не поможет потому что седеешь пока ждешь ответа, я решил создать много маленьких, относительно, таблиц. Скажем каждая таблица будет включать в себя номера с одним и тем же началом номера пасспорта. Ну например первые 2 цифры. Внимание Вопрос: Как создать класс или схему классов так чтоб INSERT/SELECT делали через один класс а он там уже решал куда писать или откуда читать. Спасибо! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.06.2010, 16:23 |
|
||
|
SQL
|
|||
|---|---|---|---|
|
#18+
что то странно если вы делаете большую таблицу и делаете индекс по полю по которому делаете запросы, например номер паспорта то запрос должен выполнятся очень быстро, независимо от количества строк, конечно если запрос на полное соответствие может вы покажите класс вашей таблицы, и запрос который у вас долго выполняется, а мы подскажем что не так ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.06.2010, 16:31 |
|
||
|
SQL
|
|||
|---|---|---|---|
|
#18+
А создайте глобальку, например ^PASSP(Nomer)=ВСЁ_ЧТО_ЗНАЕТЕ_ПРО_ЧЕЛОВЕЧКА и тогда, уверяю Вас, поиск номера не зависит от количества миллиардов записей ;) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.06.2010, 17:01 |
|
||
|
SQL
|
|||
|---|---|---|---|
|
#18+
DAiMorчто то странно если вы делаете большую таблицу и делаете индекс по полю по которому делаете запросы, например номер паспорта то запрос должен выполнятся очень быстро, независимо от количества строк, конечно если запрос на полное соответствие может вы покажите класс вашей таблицы, и запрос который у вас долго выполняется, а мы подскажем что не так Дело в том что ето все в теории. Мои тесты были сделаны на Globals а не на таблицах SQL. Наверно вы соглситесь что если $D долго в Globals то SELECT в SQL точно меньше не будет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.06.2010, 17:19 |
|
||
|
SQL
|
|||
|---|---|---|---|
|
#18+
Sergo GromovА создайте глобальку, например ^PASSP(Nomer)=ВСЁ_ЧТО_ЗНАЕТЕ_ПРО_ЧЕЛОВЕЧКА и тогда, уверяю Вас, поиск номера не зависит от количества миллиардов записей ;) Проблема в том что бегаю я не по порядку. Вот что приводит к такой задержке. Кстати по моему мнению то что Cache пишут что это не важно сколько глобалька весит, Время получения отдельной строки не изменится, это не правда. Проверено на своей базе данных. 500 с лишним гига все-таки.. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.06.2010, 17:25 |
|
||
|
SQL
|
|||
|---|---|---|---|
|
#18+
а тут вы уже сами себе противоречите то вы говорите про SQL, а потом вы оказывается его даже и не касались сами по глобалам шныряете, и еще неизвестно каким способом, в данном случаем могу сказать только то что алгоритм поиска у вас неудачный. Приведите пример вашего хранения и алгоритм поиска. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.06.2010, 17:31 |
|
||
|
SQL
|
|||
|---|---|---|---|
|
#18+
Alex Bizi Дело в том что ето все в теории. Мои тесты были сделаны на Globals а не на таблицах SQL. Наверно вы соглситесь что если $D долго в Globals то SELECT в SQL точно меньше не будет. $D это проверка на существование данных а select это запрос на получение данных что между ними общего не пойму, и что значит $D долго ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.06.2010, 17:34 |
|
||
|
SQL
|
|||
|---|---|---|---|
|
#18+
Давайте без фанатизма ! Есть вариант помочь с выборкой - говорите,я могу рассказать свой вариант, без сиквельного синтаксиса ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.06.2010, 17:36 |
|
||
|
SQL
|
|||
|---|---|---|---|
|
#18+
DAiMorа тут вы уже сами себе противоречите то вы говорите про SQL, а потом вы оказывается его даже и не касались сами по глобалам шныряете, и еще неизвестно каким способом, в данном случаем могу сказать только то что алгоритм поиска у вас неудачный. Приведите пример вашего хранения и алгоритм поиска. Вот пример... Так хранятся данные: ^Глобал(Пасспорт)=Данные человека. От Министерства внутренних дел я получаю каждий день файл с людьми которые изменили что-то в своих данных. Тупо бегу по файлу и изменяю данные каждого человека у себя в базе данных. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.06.2010, 17:38 |
|
||
|
SQL
|
|||
|---|---|---|---|
|
#18+
Alex Bizi, Я хочу напомнить вопрос: Как создать класс или схему классов так чтоб INSERT/SELECT делали через один класс а он там уже решал куда писать или откуда читать. У ковото есть ответ? Еше раз спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.06.2010, 17:44 |
|
||
|
SQL
|
|||
|---|---|---|---|
|
#18+
Alex BiziDAiMorа тут вы уже сами себе противоречите то вы говорите про SQL, а потом вы оказывается его даже и не касались сами по глобалам шныряете, и еще неизвестно каким способом, в данном случаем могу сказать только то что алгоритм поиска у вас неудачный. Приведите пример вашего хранения и алгоритм поиска. Вот пример... Так хранятся данные: ^Глобал(Пасспорт)=Данные человека. От Министерства внутренних дел я получаю каждий день файл с людьми которые изменили что-то в своих данных. Тупо бегу по файлу и изменяю данные каждого человека у себя в базе данных. S A=^Глобал(Пасспорт) МОДИФИЦИРУЕМ ПЕРЕМЕННУЮ S ^Глобал(Пасспорт)=A ВСЁ - И НЕ НАДО БЕГАТЬ ПО ГЛОБАЛУ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.06.2010, 17:50 |
|
||
|
SQL
|
|||
|---|---|---|---|
|
#18+
Sergo GromovAlex BiziDAiMorа тут вы уже сами себе противоречите то вы говорите про SQL, а потом вы оказывается его даже и не касались сами по глобалам шныряете, и еще неизвестно каким способом, в данном случаем могу сказать только то что алгоритм поиска у вас неудачный. Приведите пример вашего хранения и алгоритм поиска. Вот пример... Так хранятся данные: ^Глобал(Пасспорт)=Данные человека. От Министерства внутренних дел я получаю каждий день файл с людьми которые изменили что-то в своих данных. Тупо бегу по файлу и изменяю данные каждого человека у себя в базе данных. S A=^Глобал(Пасспорт) МОДИФИЦИРУЕМ ПЕРЕМЕННУЮ S ^Глобал(Пасспорт)=A ВСЁ - И НЕ НАДО БЕГАТЬ ПО ГЛОБАЛУ Так то оно Так, но это медленно на больших количествах данных. Если я разделю свою базу пасспортов на: Глобал1(Пасспорт) Глобал2(Пасспорт) Глобал3(Пасспорт) ... по какой-то логике, Будет быстрее, если данных очень много. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.06.2010, 17:56 |
|
||
|
SQL
|
|||
|---|---|---|---|
|
#18+
кто сказал что так будет медленно ????? так или иначе - запись лежит на винте. структура М-глобала работает через блоки указателей, которые как раз строятся через несколько уровней. аналогия предложенного разделения на разные глобалы. нет разделения на глобалы - нет лишнего программного менингита. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.06.2010, 18:03 |
|
||
|
SQL
|
|||
|---|---|---|---|
|
#18+
Sergo Gromovкто сказал что так будет медленно ????? так или иначе - запись лежит на винте. структура М-глобала работает через блоки указателей, которые как раз строятся через несколько уровней. аналогия предложенного разделения на разные глобалы. нет разделения на глобалы - нет лишнего программного менингита. Могу ли я по аналогии на ваши слова считать что если я сделаю Х таблиц или Одну таблицу с первичным ключем то ничего не изменится в смысле времени? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.06.2010, 18:10 |
|
||
|
SQL
|
|||
|---|---|---|---|
|
#18+
Ко всему вышесказанному мною. Данные, лежащие в индексе глобала, нет смысла искать перебором, пользуйте эти данные как индекс через $O $G $D. Другое дело данные в области значений, для ускорения поиска по таким данным или тупой перебор всех записей или создание индекса по значению. Это нижний уровень работы с данными. А какой механизм создаст индекс - программер вручную или организация индекса в таблице для SELECT - тут как удобнее клавиши тыцкать :) Итого: тратим время при создании - выигрываем при поиске, и наоборот ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.06.2010, 18:13 |
|
||
|
SQL
|
|||
|---|---|---|---|
|
#18+
Sergo GromovКо всему вышесказанному мною. Данные, лежащие в индексе глобала, нет смысла искать перебором, пользуйте эти данные как индекс через $O $G $D. Другое дело данные в области значений, для ускорения поиска по таким данным или тупой перебор всех записей или создание индекса по значению. Это нижний уровень работы с данными. А какой механизм создаст индекс - программер вручную или организация индекса в таблице для SELECT - тут как удобнее клавиши тыцкать :) Итого: тратим время при создании - выигрываем при поиске, и наоборот Спасибо за ваше мнение ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.06.2010, 18:16 |
|
||
|
SQL
|
|||
|---|---|---|---|
|
#18+
Alex BiziSergo Gromovкто сказал что так будет медленно ????? так или иначе - запись лежит на винте. структура М-глобала работает через блоки указателей, которые как раз строятся через несколько уровней. аналогия предложенного разделения на разные глобалы. нет разделения на глобалы - нет лишнего программного менингита. Могу ли я по аналогии на ваши слова считать что если я сделаю Х таблиц или Одну таблицу с первичным ключем то ничего не изменится в смысле времени? я "по-еврейски" ... имеем глобал ^A он хранится в зависимости от количества индексов с использованием одного или более уровней указателей, а именно опишу два уровня в первом уровне ссылки на ^A("A****") ^A("B****") ^A("C****") ..... ^A("Y****") ^A("Z****") в свою очередь отдельный указатель ^A("A****") ссылается на массив таких: ^A("AA****") ^A("AB****") ^A("AC****") .... ^A("AZ****") если М-система не видит необходимости создавать следующий уровень указателей - второй уровень ссылается сразу на РЕАЛЬНЫЕ индексы, которые прямо привязаны к данным То есть, получение данных наперёд известного индекса проходит поиском блока указателей первого уровня (один из 32), от него - второго уровня (один из 32) и т.д. то есть дерево. Последний поинтер указывает максимум на 32 РЕАЛЬНЫХ индекса, и таковой выбор идёт на уровне М-системы. Результат SELECT-a оперирует данными из того же глобала через эти же поинтеры только на высшем уровне :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.06.2010, 18:21 |
|
||
|
SQL
|
|||
|---|---|---|---|
|
#18+
это медленно на больших количествах данныхЭто может быть, т.к. у большого (>100Гб) глобала может быть 4 (и более) уровней индекса в B*-дереве (точнее можно посмотреть утилитой ^Integrity - если хватит терпения :), а значит, операции выборки / вставки затрагивают бОльшее количество индексных блоков. Но вам правильно говорят: с увеличением кол-ва глобалов ситуация может лишь ухудшится. ИМХО, стоит пойти другим путем: - По возможности увеличить кэш глобалов, чтобы его хватало хотя бы для индексных блоков + какого-то кол-ва блоков данных. Тогда будут повторно использоваться индексные блоки, сохраненные в кэше, и несколько уменьшится кол-во физического i/o. Это, так сказать, экстенсивный путь. Может дать ускорение на 10-15%. - Журналирование не худо бы отключить на время массированной записи в БД. Еще 20-25%. Но если используется "тень", то это не вариант. - Пересмотреть алгоритм. Отсортированы ли записи во входном файле? Если нет, то не лучше ли сначала перегрузить файл во временный глобал (e.g. ^CacheTempPassp) с целью сортировки, а потом уже модифицировать БД, идя $Orderom по ^CacheTempPassp. Это может дать дополнительный прирост в скорости за счет лучшего использования кэша. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.06.2010, 19:02 |
|
||
|
SQL
|
|||
|---|---|---|---|
|
#18+
Alexey Maslov, Спасибо за идеи. Мне тут идею на счет BitMap Indexing подкинули еше... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.06.2010, 19:18 |
|
||
|
SQL
|
|||
|---|---|---|---|
|
#18+
Я честно говоря, не вижу проблемы да, с увеличением числа записей увеличится время доступа. Но не в разы, а значительно меньше. Структура таблицы (как я вижу) - очень простая. И честно говоря, я не верю, что отказ от таблиц и переход на глобалы вам поможет. Не поможет, будет только тяжелее с этим работать, в частности добавлять новые индексы. Кстати индексы должны быть выбраны так, чтобы выборка не ходила по ненужным данным. Это что касается выборки. А по поводу заливки данных - там еще были $SORTBEGIN и $SORTEND Вроде как они отключают немедленную запись данных в базу и включают сортировку в памяти. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.06.2010, 20:46 |
|
||
|
SQL
|
|||
|---|---|---|---|
|
#18+
Блок А.Н.... да, с увеличением числа записей увеличится время доступа. Но не в разы, а значительно меньше... Как правильно заметил Alexey Maslov: Alexey Maslov- По возможности увеличить кэш глобалов, чтобы его хватало хотя бы для индексных блоков + какого-то кол-ва блоков данных. Тогда будут повторно использоваться индексные блоки, сохраненные в кэше, и несколько уменьшится кол-во физического i/o. Это, так сказать, экстенсивный путь. Может дать ускорение на 10-15%. Я наблюдал ситуацию, когда с увеличением объема базы производительность катастрофически упала. Помог только переход на другую платформу (c Win32 на Sun solaris), что как раз позволило увеличить кэш глобалов. Падение производительности произошло как раз из-за того, что в кэш перестали помещаться индексные блоки. После смены платформы производительность возросла чуть ли не на порядок. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2010, 10:10 |
|
||
|
SQL
|
|||
|---|---|---|---|
|
#18+
Блок А.Н.А по поводу заливки данных - там еще были $SORTBEGIN и $SORTENDЕсли я правильно понял ТС, нужна корректировка записей таблицы, а не чистая заливка. MaWrПосле смены платформы производительность возросла чуть ли не на порядок.Очень интересно! Дополнительный эффект мог дать переход на более мощную серверную платформу + некоторые нюансы Solaris. Alex BiziМне тут идею на счет BitMap Indexing подкинули ешеВо-первых, BitMap Indexing не применим к IdKey. Во-вторых, его использование при индексировании полей с малой повторяемостью значений не дает большого эффекта. В Вашем случае, ИМХО, определенный выигрыш можно получить засчет дополнительного сжатия ключа (Nomer). Это ведь последовательность букв и цифр, не так ли? Значит, путем нехитрых преобразований можно упаковать его в меньшее кол-во байт, что уменьшит объем индекса глобала, а значит, и кол-во индексных блоков. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2010, 11:15 |
|
||
|
SQL
|
|||
|---|---|---|---|
|
#18+
И все-таки не понимаю я проблемы Миллиард это конечно много, но у нас есть таблицы с 500 000 000 записей, причем она связана с таблице в 430 000 000, и та соотвественно еще с другими, там паутина связей. И все это крутится динамически, живет и ворочается довольно шустро (лаг в секунду вызывает кучу вопросов - почему так медленно). Правда там сервер стоит нормальный Но вы же тоже не на персоналке крутите? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2010, 12:46 |
|
||
|
SQL
|
|||
|---|---|---|---|
|
#18+
Alexey Maslov MaWrПосле смены платформы производительность возросла чуть ли не на порядок.Очень интересно! Дополнительный эффект мог дать переход на более мощную серверную платформу + некоторые нюансы Solaris. Да, платформа тоже немаловажна. Например время создания процесса в ОС на Solaris-е значительно меньше, а архитектура приложения такая, что коннекта постоянного нет (и JOB-процессы в win полноценно не работают). Но и увеличение кэша глобалов с 1,6 до 44 Гб сыграло не последнюю роль. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2010, 12:32 |
|
||
|
|

start [/forum/topic.php?fid=39&msg=36699022&tid=1558028]: |
0ms |
get settings: |
9ms |
get forum list: |
14ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
66ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
64ms |
get tp. blocked users: |
1ms |
| others: | 231ms |
| total: | 403ms |

| 0 / 0 |
