|
|
|
Какой тип выбрать : numeric vs float
|
|||
|---|---|---|---|
|
#18+
Всем доброго дня Я использую Sybase ASE 12.5.3. Стоит вопрос выбора типа для хранения данных. Аналогичный вопрос я задавал на форуме "Проектирование БД" (http://sql.ru/forum/actualthread.aspx?tid=573046). Вопросы, которые я хочу здесь задать, специфичные для ASE: 1. Прокомментируйте, пож, выдержку ниже. Не очень понятно, что за такая 'performance penalty'. К сожалению, могу привести только этот кусок текста, так как получил его по почте. авторAs of version 2.04, the Sybase DATETIME and MONEY datatypes can be kept in their native formats in both the Sybase::DBlib and Sybase::CTlib modules. In addition, NUMERIC or DECIMAL values can also be kept in their native formats when using the Sybase::CTlib module. This behavior is normally turned off by default, because there is a performance penalty associated with it . It is turned on by using package or database handle specific attributes. 2. Дайте пож ссылку на информацию о неявных преобразованиях типов в ASE. Интересует вопрос, касающийся преобразования числовых констант в операциях сравнения (инструкция where). К примеру, в какой тип будет преобразована константа 10.3, если столбец 'value' имеет тип numeric(5,3): авторselect value from table where value < 10.3 С уважением, Давыдов Виталий ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.07.2008, 14:33 |
|
||
|
Какой тип выбрать : numeric vs float
|
|||
|---|---|---|---|
|
#18+
davydoff wrote: > Я использую Sybase ASE 12.5.3. Стоит вопрос выбора типа для хранения > данных. А какие данные нужно хранить? Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.07.2008, 14:46 |
|
||
|
Какой тип выбрать : numeric vs float
|
|||
|---|---|---|---|
|
#18+
1. Проценты с 2 или 3-мя знаками после запятой: 10.03, 65.01 2. Числа типа numeric(13,2). Пример - 12345678.23 3, Также нужно хранить 3-х значные целые числа. Пример: 123, 456 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.07.2008, 14:52 |
|
||
|
Какой тип выбрать : numeric vs float
|
|||
|---|---|---|---|
|
#18+
davydoff пишет: > 1. Прокомментируйте, пож, выдержку ниже. Не очень понятно, что за такая > 'performance penalty'. К сожалению, могу привести только этот кусок > текста, так как получил его по почте. > > автор > As of version 2.04, the Sybase DATETIME and MONEY datatypes can be kept > in their native formats in both the Sybase::DBlib and Sybase::CTlib > modules. In addition, NUMERIC or DECIMAL values can also be kept in > their native formats when using the Sybase::CTlib module. This behavior > is normally turned off by default, *because there is a performance > penalty associated with it*. It is turned on by using package or > database handle specific attributes. Комментирую: это ерунда. Тут видимо обсуждаются пакеты для Perl-а. Там (как и в любом другом клиенте, использующем CTLib) данные могут быть представлены в виде строк или в виде значений типов DATETIME, MONEY, NUMERIC or DECIMAL. Эти типы не встроены в язык Perl, а являются структурами, поддерживаемыми библиотекой CTLib common client and server library. Поэтому при обращении к операциям этих типов будут вызываться функции этой библиотеки и это потенциально может быть медленнее, чем если бы это была перловая строка, которая встроена в язык и вроде бы должна работать быстрее. Видимо, поэтому в Sybase::CTlib есть два режима работы, когда клиентские переменные используются как строки Perl, либо как native- значения (не все, поскольку типы типа String, int и т.п. будут использовать встроенные типы данных Perl). Почему это все ерунда - потому что у пользователя нет выбора, думаю. Если ему НЕ НУЖНЫ операции с полями данных типа numeric и прочими, то можно использовать строковые представления. Если операции с этими типами данных нужны на клиенте, то делать нечего, придется использовать CTLib. На самом деле язык Perl такой медленный сам по себе, что его уже ничто не спасёт (это наполовину шутка). > 2. Дайте пож ссылку на информацию о неявных преобразованиях типов в ASE. > Интересует вопрос, касающийся преобразования числовых констант в > операциях сравнения (инструкция where). К примеру, в какой тип будет > преобразована константа 10.3, если столбец 'value' имеет тип numeric(5,3): > > автор > select value from table where value < 10.3 Здесь 10.3 имеет тип numeric Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. Немногие знают, что в ASE (в Transact SQL) есть КОНСТАНТЫ типа numeric. А сделано так потому, чтобы до тех пор, пока константа не присвоилась какой-то переменной, не терялась бы ее точность. Также есть константы типа MONEY Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. и константы типа double float Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. Заметьте, что последнее поле имеет тип NUMERIC, а 'f' в конце ошибочно итретпретируется как название выводимого поля. Видимо, это баг в парсере TSQL, хотя и безобидный. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.07.2008, 16:08 |
|
||
|
Какой тип выбрать : numeric vs float
|
|||
|---|---|---|---|
|
#18+
MasterZiv - большое спасибо за ответ! Действительно, числовые константы наподобие тех, что я привел в одном из постов, имеют тип numeric. Что касается CTlib, вроде бы есть также C++ - версия. Ни разу не использовал эту библиотеку, так что мне не очень понятно, что означает native format в C++. Особое представление, к примеру, структура с двумя полями - целая и дробная часть...? В любом случае, проигрыш в производительности при конвертации в C++ - пренебрежимо мал в сравнении со всем остальным, IMHO. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.07.2008, 16:45 |
|
||
|
Какой тип выбрать : numeric vs float
|
|||
|---|---|---|---|
|
#18+
davydoff пишет: > Что касается CTlib, вроде бы есть также C++ - версия. Так только и есть С-версия, другой нету. Только С, а не С++. С++ - нету. Ни разу не > использовал эту библиотеку, так что мне не очень понятно, что означает > native format в C++. Типы данных в том представлении, в котором они храняться в том числе в самом ASE. Особое представление, к примеру, структура с двумя > полями - целая и дробная часть...? Ну, там сложнее немного все, NUMERIC представляется как число, хранимое в 256-ричной системе счисления, но это не важно. В любом случае, проигрыш в > производительности при конвертации в C++ - пренебрежимо мал в сравнении > со всем остальным, IMHO. Да, именно. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.07.2008, 18:14 |
|
||
|
Какой тип выбрать : numeric vs float
|
|||
|---|---|---|---|
|
#18+
Спасибо за уточнение. Добавлю, что также существуют реализации на perl и, вроде бы, ruby. Возможно, что можно найти реализации под другие языки программирования. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2008, 12:44 |
|
||
|
Какой тип выбрать : numeric vs float
|
|||
|---|---|---|---|
|
#18+
davydoff пишет: > Спасибо за уточнение. Добавлю, что также существуют реализации на perl > и, вроде бы, ruby. Возможно, что можно найти реализации под другие языки > программирования. Это не реализации всё. Это - так называемые линки. Модули языка, которые осуществляют вызовы native C кода. А сама реализация - на C, в виде разделяемой библиотеки. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2008, 16:37 |
|
||
|
Какой тип выбрать : numeric vs float
|
|||
|---|---|---|---|
|
#18+
Играюсь сейчас с CT-lib API (на языке C). Тип БД float (8 байт) преобразуется на клиенте в C-тип double, но в случае с numeric используется C-структура: Код: plaintext 1. 2. 3. 4. 5. 6. Пока не очень понятно, как преобразовывать эту структуру. Пытаюсь разобраться с функцией cs_convert. В целом, API содержит минимальный набор функций. С одной стороны это хорошо, но с другой стороны доставляет определенные сложности в разработке. Интересно, есть другие , более простые способы выполнить преобразование без использования ф-и cs_convert? Буду рад, если кто-нибудь приведет простой пример кода преобразования с помощью этой функции. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.07.2008, 16:03 |
|
||
|
Какой тип выбрать : numeric vs float
|
|||
|---|---|---|---|
|
#18+
Оказывается, что sizeof(CS_NUMERIC) = 35. Неужели сервер пересылает на клиент numeric числа, используя 35 байт? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.07.2008, 16:13 |
|
||
|
Какой тип выбрать : numeric vs float
|
|||
|---|---|---|---|
|
#18+
davydoff пишет: > Оказывается, что sizeof(CS_NUMERIC) = 35. Неужели сервер пересылает на > клиент numeric числа, используя 35 байт? Да. Не, конечно самое фиговое - что оно там фиксированной длины, но не все 256-ричные цифры всегда используются. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.07.2008, 17:25 |
|
||
|
Какой тип выбрать : numeric vs float
|
|||
|---|---|---|---|
|
#18+
Мда. Это серьезный аргумент в сторону использования float! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.07.2008, 17:33 |
|
||
|
Какой тип выбрать : numeric vs float
|
|||
|---|---|---|---|
|
#18+
davydoff пишет: > Пока не очень понятно, как преобразовывать эту структуру. Пытаюсь > разобраться с функцией cs_convert. Вот именно, cs_convert-ом. В целом, API содержит минимальный > набор функций. С одной стороны это хорошо, но с другой стороны > доставляет определенные сложности в разработке. Интересно, есть другие , > более простые способы выполнить преобразование без использования ф-и > cs_convert? Нет, нету. В смысле, в API. Если сам напишешь, то будет. Буду рад, если кто-нибудь приведет простой пример кода > преобразования с помощью этой функции. На счёт "простой" - это ты погорячился, там такого не бывает, ну вот "обычный" можно найти. Код: 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. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. В комментарии там попытка перевести в строку самому. Неудачная. Я думал, там BCD, но там не оно, а 256-ричное число. Его бы и можно было бы переверсти самому, но там загвоздка в том, где они помещают десятичную точку, это сложно вычислить. Если бы это знать, то всё было бы ОК. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.07.2008, 17:34 |
|
||
|
Какой тип выбрать : numeric vs float
|
|||
|---|---|---|---|
|
#18+
MasterZiv - большое спасибо за пример. Еще раз убедился, что двигаюсь в правильном направлении. Я пытаюсь сконвертировать double в CS_NUMERIC, но функция cs_convert выдает ошибку. Пока еще не разобрался, в чем дело. Контекст создал и инициализировал. Соединение с БД с созданным контекстом происходит. Команды выполняются, а cs_convert выдает ошибку ( retcode = 0). Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.07.2008, 18:13 |
|
||
|
Какой тип выбрать : numeric vs float
|
|||
|---|---|---|---|
|
#18+
Обнулил структуры перед использованием: Код: plaintext 1. 2. 3. 4. Похоже, сработало. cs_convert завершилась без ошибок. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.07.2008, 18:20 |
|
||
|
Какой тип выбрать : numeric vs float
|
|||
|---|---|---|---|
|
#18+
davydoff пишет: > Мда. Это серьезный аргумент в сторону использования float! Нет, уж извини. Нужна тебе точная арифметика - используй NUMERIC. Это не техническими требованиями определяется, а функциональными. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.07.2008, 12:45 |
|
||
|
Какой тип выбрать : numeric vs float
|
|||
|---|---|---|---|
|
#18+
davydoff пишет: > MasterZiv - большое спасибо за пример. Еще раз убедился, что двигаюсь в > правильном направлении. Я пытаюсь сконвертировать double в CS_NUMERIC, > но функция cs_convert выдает ошибку. Да боюсь, что в неправильном. Double бессмысленно конвертировать в NUMERIC. Потому что DOUBLE - неточный тип данных, а NUMERIC -точный. Я уже не помню, возможно ли вообще такое преобразование в CTLib, если что - можно посмотреть в документации или вызвать функцию cs_canconvert() (или cs_will_convert() ?), но если нельзя, то надо это делать через строку: [fix] DOUBLE => STRING => обрезать до нужного кол-ва знаков => NUMERIC [/fix] > Контекст создал и инициализировал. Соединение с БД с созданным > контекстом происходит. Вот же блин, как тебе плохо-то! Надо бы тебе выслать пример. Хотя кстати примеры есть в стандартной поставке. Ну я могу тоже дать (другой). Но в понедельник. Для cs_convert соединение вовсе не обязательно устанавливать, и без соединения должно работать. Команды выполняются, а cs_convert выдает ошибку ( > retcode = 0). > > double val(100.2345); > CS_NUMERIC num; > CS_INT len(10); > > CS_DATAFMT srcfmt; > srcfmt.datatype = CS_FLOAT_TYPE; > > CS_DATAFMT tgtfmt; > tgtfmt.datatype = CS_NUMERIC_TYPE; > tgtfmt.precision = 10; > tgtfmt.scale = 5; > > CS_RETCODE ret = cs_convert(ctx, &srcfmt, &val, &tgtfmt, &num, &len); > if (ret != CS_SUCCEED) { > printf("RET CODE: %d\n", ret); > EXIT_ON_FAIL("cs_convert is failed"); > } Да, наивный код. Работать кажется не будет. Ладно, до понедельника. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.07.2008, 13:00 |
|
||
|
Какой тип выбрать : numeric vs float
|
|||
|---|---|---|---|
|
#18+
Комментарии интересные, но я не пока не могу согласиться с невозможностью сконвертировать double в numeric. Почитал "Open Client and Open Server Common Libraries Reference Manual" (v. 12.5). Там, в описании ф-и convert, есть таблица "Datatype conversion chart", на основании которой можно сделать вывод о возможности конвертации одного типа, в другой. Конвертация CS_FLOAT в CS_NUMERIC допускается. Обратно - также допускается. Добавлю, что код работает, если добавить "обнуление" структуры (memset). Также не могу согласиться с утверждением о бессмысленности конвертации double в numeric. Бессмысленно - если не установлены правила конвертации. Единственно, что пока непонятно - мой код не работает, если не "обнулить" структуру CS_DATAFMT. Еще раз большое спасибо за полезные комментарии, MasterZiv. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.07.2008, 14:45 |
|
||
|
Какой тип выбрать : numeric vs float
|
|||
|---|---|---|---|
|
#18+
MasterZiv прав. Конвертация из неточного представления числа типа FLOAT/DOUBLE в точный NUMERIC/DECIMAL - нецелесообразна. Даже никакие правила не помогут. Касательно обязательного обнуления струкутры CS_DATAFMT, то во всех примерах указано что структуру после инициализации надо обнулять. Также посмотрел свой код, по конверсии на основе OpenClient, там тоже всегда я ее обнулял после инициализации ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.07.2008, 15:53 |
|
||
|
Какой тип выбрать : numeric vs float
|
|||
|---|---|---|---|
|
#18+
Да, соглашусь, что на стороне клиента нецелесообразно преобразовывать float в numeric, так как клиент (на C++ например) не умеет напрямую работать с numeric в отличие от CS_FLOAT, который автоматически представляется в программе как double. На самом деле, целью моего примера было протестировать обратное преобразование из numeric в float, так как клиент работает в числами double. Если хранить числа в БД в виде numeric, то в клиенте их надо будет преобразовывать в double. Я замерил производительность этого преобразования: 1 сек - 1М преобразований на AMD Opteron 250, CPU 2400MGz. Я считаю, что это не быстрое преобразование, но вклад в общую производительность вряд ли будет существенным. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.07.2008, 16:13 |
|
||
|
Какой тип выбрать : numeric vs float
|
|||
|---|---|---|---|
|
#18+
davydoff пишет: Бессмысленно - если не > установлены правила конвертации. Бессмысленно, на мой взгляд, вообще, по идеологическим соображениям. Вот НИ РАЗУ В ЖИЗНИ мне это ещё не понадобилось. Потому что если данные точные - они точные, а если приблизительные - то приблизительные. Их не зачем скрещивать. Они нигде не пересекаются. Не можете более детально описать, зачем вам это надо ? Единственно, что пока непонятно - мой > код не работает, если не "обнулить" структуру CS_DATAFMT. Ну потому что надо обнулять. Так написано в документации. Пример вам нужен еще ? Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.07.2008, 16:21 |
|
||
|
Какой тип выбрать : numeric vs float
|
|||
|---|---|---|---|
|
#18+
MasterZiv - Я уже согласился, что на стороне клиента преобразовывать тип double в numeric бессмысленно. Что касается обратного преобразования, то смысл есть. Опишу задачу, которая состоит в разработке схемы БД для хранения данных, поступающих извне. Эти данные поставляются с фиксированной точностью. Точность предоставления данных регламентирована и вряд ли будет меняться. Вторая задача - использование этой БД в клиенте. Клиент - аналитическое приложение, которые строит разные модели на основе данных в БД. Алгоритмы расчета используют тип double. Стоит добавить, что этот клиент - не единственный. Возможны другие способы использования этой БД. Моя идея хранить данные в БД в виде numeric и выполнять преобразования на стороне клиента из numeric в double. Примеру буду очень рад. Вышлите мне, пожалуйста, на мой адрес, указанный в профайле (он открыт сейчас). Еще раз спасибо и удачного трудового дня! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.07.2008, 16:38 |
|
||
|
Какой тип выбрать : numeric vs float
|
|||
|---|---|---|---|
|
#18+
davydoff пишет: > так как клиент работает в числами double. Если хранить числа в БД в виде > numeric, то в клиенте их надо будет преобразовывать в double. Я замерил Да нет же, НЕТ ! НЕЛЬЗЯ ТАКОГО ДЕЛАТЬ НИКОГДА ! numeric -точный тип данных. Float, fdouble - приблизительные. Если вы будете между ними преобразовывать, у вас будут нарушения доменной целостности, и > производительность этого преобразования: 1 сек - 1М преобразований на > AMD Opteron 250, CPU 2400MGz. Я считаю, что это не быстрое > преобразование, но вклад в общую производительность вряд ли будет > существенным. Вы, еще раз говорю, не тем занимаетесь. Если у вас есть требование использовать точную арифметику, то это - функциональное требование. А не техническое. Если оно у вас есть, то вам ВЕЗДЕ НУЖНО ИСПОЛЬЗОВАТЬ ИМЕННО NUMERIC-и (ну или аналоги, money, decimal). У вас НЕТ ВЫБОРА. Потому что float-ы - неточные, и точность вашу нарушат. Причем это произойдет, если ХОТЯ БЫ ГДЕ-ТО, либо в БД, либо в клиенте, либо по дороге от первой ко второму или обратно, вы ХОТЯ БЫ ОДИН РАЗ используете неточную арифметику ДАЖЕ ДЛЯ ХРАНЕНИЯ данных, а не только для вычислений. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.07.2008, 16:56 |
|
||
|
Какой тип выбрать : numeric vs float
|
|||
|---|---|---|---|
|
#18+
davydoff пишет: Опишу задачу, которая состоит в разработке схемы БД для > хранения данных, поступающих извне. Вот это - хорошо бы, потому что не понятно, чем вы там страдаете. отчего сыр-бор. Эти данные поставляются с > фиксированной точностью. Точность предоставления данных регламентирована > и вряд ли будет меняться. Вторая задача - использование этой БД в > клиенте. Клиент - аналитическое приложение, которые строит разные модели > на основе данных в БД. Алгоритмы расчета используют тип double. Стоит > добавить, что этот клиент - не единственный. Возможны другие способы > использования этой БД. Моя идея хранить данные в БД в виде numeric и > выполнять преобразования на стороне клиента из numeric в double. Ну, так это еще имеет смысл, может быть. Только тогда не понятно, зачем данные уже в БД хранить в точной арифметике. Ну разве что для других возможных приложений. вы про сами данные-то расскажите, что там хранится-то у вас. Сами данные-то какие ? Хотя бы пример поля типичного, и что оно из себя представляет. > Примеру буду очень рад. Вышлите мне, пожалуйста, на мой адрес, указанный > в профайле (он открыт сейчас). да Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.07.2008, 17:00 |
|
||
|
Какой тип выбрать : numeric vs float
|
|||
|---|---|---|---|
|
#18+
Пример "правильного" приложения, работающего с сервером через CTLib Open Client с использованием получения данных в native-форме, т.е. в такой, как данные хранятся в БД. (альтернативой было бы получение данных в текстовом виде). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.07.2008, 17:11 |
|
||
|
|

start [/forum/topic.php?fid=55&msg=35439872&tid=2011476]: |
0ms |
get settings: |
10ms |
get forum list: |
23ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
177ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
84ms |
get tp. blocked users: |
2ms |
| others: | 236ms |
| total: | 555ms |

| 0 / 0 |
