|
|
|
Неколько вопросов по типам данных.
|
|||
|---|---|---|---|
|
#18+
Здравствуйте. Помогите разобраться по некоторым вопросам. 1) Есть параметр, который может принимать 2 положения. Например ТОП товар. Товар может быть ТОПом или нет. Для этого напрашивается тип данных Bit. Можно также использовать TinyInt. Первое весит 1 бит, второе 1 байт. Над вторым можно совершать арифметические операции, над первым нет. Второе можно расширить, если например введут признак например ПремиуиТОП и нужно будет что бы столбец принимал одно из трех значений. Вопрос: Сильно ли будет заметно различие по скорости работы базы данных использование Bit или TinyInt в таких случаях если в базе таблицы с товарами по 10-30 млн данных? 2) Есть товары. Для ключа использую тип данных Int. Вес ячейки 4 байта. Как повлияет на производительность БД если вместо Int будет использоваться Char, Varchar, Nchar, Nvarchar? 1 символ в Char весит 1 байт. Соответственно если тип данных я укажу Char(4) то каждое значение будет весить по 4 байта? Даже если введу единицу? Если ввести в Varchar(4) единицу, она будет весить 4 байта или 1? Как повлияет на скорость работы БД использование Int или Varchar, если тип данных используется для обозначения шестизначного кода? Получается идет сравнение Int и Varchar(6). Как повлияет на скорость работы БД использование Int или Varchar, если тип данных используется для обозначения трехзначного кода? Получается идет сравнение Int и Varchar(3). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.04.2014, 11:47 |
|
||
|
Неколько вопросов по типам данных.
|
|||
|---|---|---|---|
|
#18+
3) Как повлияет на производительность БД использование в качестве ключа типа данных Int в сравнении c Uniqueidentifier? В базе данных около 1ТБ данных. Выполняются различные Selectы. Таблицы по 10-100 млн данных. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.04.2014, 11:51 |
|
||
|
Неколько вопросов по типам данных.
|
|||
|---|---|---|---|
|
#18+
4) Вообще справедливо ли предложение: Чем меньше вес данных, тем быстрее будут происходить вычисления над ними? Или современным компьютерам без разницы 1 байт весит данное или 8? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.04.2014, 12:00 |
|
||
|
Неколько вопросов по типам данных.
|
|||
|---|---|---|---|
|
#18+
Im_Max, "пол-зёрнышка в день - мало, 183 в год - много" (с) м/ф "Дюймовочка". Встречный вопрос: это реальные проблемы или вопросы от преподавателя? :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.04.2014, 12:19 |
|
||
|
Неколько вопросов по типам данных.
|
|||
|---|---|---|---|
|
#18+
Im_Max, Начну не по-порядку: 2. моя практика показала, что разницы между идентификатором целочисленным и varchar - практически нет по производительности. При этом если идентификаторы большие - то еще и можно получить профит в хранении данных, т.к. [/b]varchar[/b] использует только то количество байт, которое необходимо для хранения данных. Т.е. двузначное число займет два байта, в то время, как тоже самое число в INT все равно 4 байта. Но с точки зрения производительности выборок - прогонял оба варианта, никакой ощутимой разницы не заметил. НО! Необходимо учитывать, что INT - "это не только ценный мех" - как минимум это гарантия того, что данные содержат исключительно цифры/это возможность использования инкремента средствами сервера. Так же сортировка по INT и по varchar - это две разные вещи (первая: "1,2,19" во втором случае "1,19,2"). Не знаю нужно ли это вам в ваших кейсах, но сталкивался с такой проблемой - идентификатор varchar а нужна сортировка по возрастанию => потребовалось преобразование в INT, т.к. в данных никто маской не озаботился. Соответственно, мое мнение - под идентификаторы более приемлемо пользовать именно INT. Меньше будет проблем с верификацией и т.п. 1. Имхо заложите TinyInt если есть перспектива роста. Null никто не отменял. TinyInt - позволит в том числе комбинировать различные признаки (битовой маской) при необходимости. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.04.2014, 12:30 |
|
||
|
Неколько вопросов по типам данных.
|
|||
|---|---|---|---|
|
#18+
Первое весит 1 бит , второе 1 байт.1. Только в случае, когда их есть 8полей (по биту на поле). И то все равно не нужно будет сначала выделить бит из этого байта. Строчные типы будут выполняться медленее числовых. Хотя бы потому, что у строк есть понятие сортировка согласно своей кодовой страницы. А Варчары вообще хранятся в отдельной структуре, а не теле записи (в теле ссылка на эту структуру). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.04.2014, 12:31 |
|
||
|
Неколько вопросов по типам данных.
|
|||
|---|---|---|---|
|
#18+
Реальные, это для меня. Есть базы данных на сервере. У всех данных есть Uniqueidentifier. У спецификаций, у товаров, у магазинов, договоров и т.д. Так же параллельно есть числовые кода. Я выполняю сначала преобразование данных. (В заказах у Пепси код 111, в заказах 489657, в договорах 7891cfc3-8e42-475e-a854-0019253f8510, я привожу все данные к одним кодам) А затем создаю отчетность из этих данных. Например есть список магазинов. Он обозначается либо 36-ти значным Uniqueidentifier либо Nvarchar(100). Но это числа от 1 до 600. Можно преобразовать в SmallInt, так как встряли подразделений будет больше 32000. За счет это я хочу увеличить скорость обработки запросов. Вот и интересно, приведет ли это к увеличению быстродействия. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.04.2014, 12:33 |
|
||
|
Неколько вопросов по типам данных.
|
|||
|---|---|---|---|
|
#18+
Im_Max, 1. Bit от tinyint по скорости не будет отличаться никак. 2,3 - Int и Varchar, Int и UID - несколько лет назад афаир прям на этом форуме кто-то выкладывал тесты. Вкратце - выигрыш у Int есть, но небольшой (единицы процентов). И это платформозависимо, так что для полной уверенности лучше померяйте сами. Но в целом Вы зря имхо заморачиваетесь на такой оптимизации, тормоза в 99% случаются не из-за этого. Что важно - ВСЕГДА первичный ключ и соответствующие внешние делать одного типа, Int так Int, UID так UID. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.04.2014, 12:40 |
|
||
|
Неколько вопросов по типам данных.
|
|||
|---|---|---|---|
|
#18+
Im_Max4) Вообще справедливо ли предложение: Чем меньше вес данных, тем быстрее будут происходить вычисления над ними? Правильно говорить не "вес", а "объём". Это утверждение в целом не справедливо, поскольку скорость обработки зависит не только от объёма данных. Есть даже раздел в информатике и теории алгоритмов: "Теория сложности вычислений". 1) скорость обработки также зависит от алгоритмов обработки (вычислений); 2) скорость обработки также зависит от аппаратных и программных средств, реализующих алгоритм обработки; 3) при одинаковом алгоритме b]обычно[/b], но не всегда!, чем меньше объём обрабатываемых данных, тем быстрее завершается выполнение этого алгоритма над данными. Бытовой пример: 1) бытовая мясорубка у меня дома выдавливает за один оборот ручки максимум 15 граммов мяса; 2) кроме того, для любой порции мяса нужно 2 оборота, пока мясо от раструба дойдёт до ножа. Порция 1) 45 граммов. понадобятся 2 + 3 = 5 оборотов. Порция 2) 5 граммов. понадобятся 2 + 1 = 3 оборота. (ура) Порция 3) 15 граммов. понадобятся 2 + 1 = 3 оборота (странно?!:) Im_MaxИли современным компьютерам без разницы 1 байт весит данное или 8? Современным компьютерам пока всё без разницы, разницу замечают пользователи. Данное утверждение в целом неверно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.04.2014, 12:45 |
|
||
|
Неколько вопросов по типам данных.
|
|||
|---|---|---|---|
|
#18+
Кот МатроскинIm_Max, ... Но в целом Вы зря имхо заморачиваетесь на такой оптимизации, тормоза в 99% случаются не из-за этого. ... О! Вопрос таки практический, пропустил первый ответ от ТС :). +100500 к Матроскину. Если вопрос в оптимизации конкретной работающей системы, то нужно идти с практической стороны: 1) какой конкретно функционал "тормозит" больше всего (опередлится с критериями, организовать замеры); 2) в чём его узкое место; 3) как его можно устранить; 4) устранить; 5) проверить, что помогло; 6) подумать, где ещё могут быть схожие узкие места, проверить функционал, при необходимости устранить и в этих местах; 6) удовлетворены ли юзеры? если нет, на шаг (1). К замечаниям выше дополню к перечню потенциальных узких мест: - места сравнения Int с [x]Char, где приходится организовывать преобразования для приведения к одному типу данных. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.04.2014, 13:00 |
|
||
|
Неколько вопросов по типам данных.
|
|||
|---|---|---|---|
|
#18+
Всем большое спасибо. Просто поставщик ПО выбрал тип данных Nvarchar из-за того что он предоставляет это ПО разным компаниям. И каждый может по разному присваивать кода. У нас просто используются только цифры. Думал что перейду на Int и будет мне счастье. В итоге прироста производительности не получу, только бонус в виде свободного места. Плюс с числами легче работать, это к вопросу про упорядочивание. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.04.2014, 13:03 |
|
||
|
Неколько вопросов по типам данных.
|
|||
|---|---|---|---|
|
#18+
Имхо, первичные ключи должны быть суррогатными и присваиваться "внутри" системы ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.04.2014, 13:07 |
|
||
|
Неколько вопросов по типам данных.
|
|||
|---|---|---|---|
|
#18+
NafИмхо, первичные ключи должны быть суррогатными и присваиваться "внутри" системы +1 Im_Max, проверь, может ты где-то провтыкал суррогатные ключи в таблицах поставщика ПО? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.04.2014, 14:53 |
|
||
|
Неколько вопросов по типам данных.
|
|||
|---|---|---|---|
|
#18+
Im_Max3) Как повлияет на производительность БД использование в качестве ключа типа данных Int в сравнении c Uniqueidentifier? В базе данных около 1ТБ данных. Выполняются различные Selectы. Таблицы по 10-100 млн данных. Uniqueidentifier не монотонно возрастающий - это сильно плохо для индексов. А для кластреного вообще убийственно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.04.2014, 15:36 |
|
||
|
Неколько вопросов по типам данных.
|
|||
|---|---|---|---|
|
#18+
Im_Max4) Вообще справедливо ли предложение: Чем меньше вес данных, тем быстрее будут происходить вычисления над ними? Или современным компьютерам без разницы 1 байт весит данное или 8? вычисления пофиг - узкое место - чтения с диска. Меньше места занимает - меньше чтений, уже плюс ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.04.2014, 15:37 |
|
||
|
Неколько вопросов по типам данных.
|
|||
|---|---|---|---|
|
#18+
Ivan Durak Меньше места занимает - меньше чтений, уже плюс Добавлю меньше места занимает в памяти, меньше места занимает в логе и т.д. Я встречался с проблемой в SQL Server при использовании char в качестве идентификатора - разработчик этого не осознавал и делал запрос типа select * from mytable where mykey=123456789 А сервер нет чтобы вернуть ошибку, проводил неявное преобразование типов и делал nonclustered index scan вместо index seek. Ошибку исправили на select * from mytable where mykey='123456789' но осадочек остался ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.04.2014, 17:36 |
|
||
|
Неколько вопросов по типам данных.
|
|||
|---|---|---|---|
|
#18+
SERG1257Ошибку исправили на select * from mytable where mykey='123456789' но осадочек осталсяа Оракл что делает? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.04.2014, 17:41 |
|
||
|
Неколько вопросов по типам данных.
|
|||
|---|---|---|---|
|
#18+
NvarcharУжос. Там могут быть уникодные значения ключей ????? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.04.2014, 17:48 |
|
||
|
Неколько вопросов по типам данных.
|
|||
|---|---|---|---|
|
#18+
1) Есть параметр, который может принимать 2 положения. Например ТОП товар. Товар может быть ТОПом или нет. Для этого напрашивается тип данных Bit. Можно также использовать TinyInt. Первое весит 1 бит, второе 1 байт. Над вторым можно совершать арифметические операции, над первым нет. Второе можно расширить, если например введут признак например ПремиуиТОП и нужно будет что бы столбец принимал одно из трех значений. Вопрос: Сильно ли будет заметно различие по скорости работы базы данных использование Bit или TinyInt в таких случаях если в базе таблицы с товарами по 10-30 млн данных? Различий в скорости скорее всего не будет вообще. bit всё равно будет скорее всего занимать один байт хранения (только если несколько битовых полей у тебя будет в таблице, тогда 2, 3 и т.д до 8 полей смогут занять только один байт). Но надо использовать бит. Или boolean или его аналоги. 2) Есть товары. Для ключа использую тип данных Int. Вес ячейки 4 байта. Как повлияет на производительность БД если вместо Int будет использоваться Char, Varchar, Nchar, Nvarchar? 1 символ в Char весит 1 байт. Соответственно если тип данных я укажу Char(4) то каждое значение будет весить по 4 байта? Никак практически. Длины не будут значительно различаться. Значительно -- это на один или несколько порядков. Даже если введу единицу? Если ввести в Varchar(4) единицу, она будет весить 4 байта или 1? Как повлияет на скорость работы БД использование Int или Varchar, если тип данных используется для обозначения шестизначного кода? Получается идет сравнение Int и Varchar(6). Ты не там ищешь поводы для борьбы за производительность. При проектировании БД о производительности вообще думать не нужно. А о доменной целостности поля. Если это бит, булева величина -- надо брать бит. Если это символьный код -- надо брать char/varchar. Если это идентификатор-число -- брать int/long. Если дата -- дату. Время -- время. И так далее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.04.2014, 17:49 |
|
||
|
Неколько вопросов по типам данных.
|
|||
|---|---|---|---|
|
#18+
Im_Max4) Вообще справедливо ли предложение: Чем меньше вес данных, тем быстрее будут происходить вычисления над ними? Или современным компьютерам без разницы 1 байт весит данное или 8? Справедливо. Но тебе надо при этом разницу в длине данных иметь существенную. int/GUID -- разница в 2 или 4 раза только лишь. Т.е. в твоём случае разницу ты можешь и заметить, но она не будет такой уж существенной. Тип данных надо выбирать исходя из требований к ПО. Нужна глобальная уникальность -- GUID. Не нужна --- int. Естественно, тип данных должен быть минимально большим для представления данного поля. Но это не из соображений производительности, а просто из соображений экономии места и здравой логики. P.S. Кстати, вот: http://www.sql.ru/forum/1019530/chislovoy-id-ili-guid ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.04.2014, 17:55 |
|
||
|
Неколько вопросов по типам данных.
|
|||
|---|---|---|---|
|
#18+
Ivan DurakIm_Max3) Как повлияет на производительность БД использование в качестве ключа типа данных Int в сравнении c Uniqueidentifier? В базе данных около 1ТБ данных. Выполняются различные Selectы. Таблицы по 10-100 млн данных. Uniqueidentifier не монотонно возрастающий - это сильно плохо для индексов. А для кластреного вообще убийственно. Тип данных Uniqueidentifier не может быть или не быть мототонно возрастающим. Не монотонно возрастающей может быть функция, вызывающая определенный API операционки - но это несколько другой вопрос, к типу данных имеющий косвенное отношение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.04.2014, 17:59 |
|
||
|
Неколько вопросов по типам данных.
|
|||
|---|---|---|---|
|
#18+
Ivan DurakUniqueidentifier не монотонно возрастающий - это сильно плохо для индексов. А для кластреного вообще убийственно. Почему? Просто я не знаю, что мне лучше использовать для суррогатного ключа: Uniqueidentifier или SEQUENCE? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.04.2014, 23:12 |
|
||
|
Неколько вопросов по типам данных.
|
|||
|---|---|---|---|
|
#18+
Im_Max1) Есть параметр, который может принимать 2 положения. Например ТОП товар. Товар может быть ТОПом или нет. Для этого напрашивается тип данных Bit. Можно также использовать TinyInt. Первое весит 1 бит, второе 1 байт. Никогда не понимал людей "экономящих" на битах Не приходило в голову, что на диске 1 бит будет хранится как 1 байт как минимум? А про выравнивание памяти слышали? В оперативной памяти даже байт будет хранится как 4 байта. Ну и где выигрыш? PS Сейчас работаю с базой живущей с 2009 года. Тогда разработчики тоже "экономили", некоторые справочники(их ID) имеют размер TyniInt. И уже переросли свой размер. Могу сказать, что это знатный гемморой - во всех SP искать поле и менять тип. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.04.2014, 01:22 |
|
||
|
Неколько вопросов по типам данных.
|
|||
|---|---|---|---|
|
#18+
[offtopic] NetObserver Могу сказать, что это знатный гемморой - во всех SP искать поле и менять типВ свое время занимаясь тем же, я нашел http://www.red-gate.com/products/sql-development/sql-search/ [/offtopic] ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.04.2014, 01:36 |
|
||
|
Неколько вопросов по типам данных.
|
|||
|---|---|---|---|
|
#18+
Im_MaxЗдравствуйте. Помогите разобраться по некоторым вопросам. 1) Есть параметр, который может принимать 2 положения. Например ТОП товар. Товар может быть ТОПом или нет. Для этого напрашивается тип данных Bit. Можно также использовать TinyInt. Первое весит 1 бит, второе 1 байт. Над вторым можно совершать арифметические операции, над первым нет. Второе можно расширить, если например введут признак например ПремиуиТОП и нужно будет что бы столбец принимал одно из трех значений. Вопрос: Сильно ли будет заметно различие по скорости работы базы данных использование Bit или TinyInt в таких случаях если в базе таблицы с товарами по 10-30 млн данных? 2) Есть товары. Для ключа использую тип данных Int. Вес ячейки 4 байта. Как повлияет на производительность БД если вместо Int будет использоваться Char, Varchar, Nchar, Nvarchar? 1 символ в Char весит 1 байт. Соответственно если тип данных я укажу Char(4) то каждое значение будет весить по 4 байта? Даже если введу единицу? Если ввести в Varchar(4) единицу, она будет весить 4 байта или 1? Как повлияет на скорость работы БД использование Int или Varchar, если тип данных используется для обозначения шестизначного кода? Получается идет сравнение Int и Varchar(6). Как повлияет на скорость работы БД использование Int или Varchar, если тип данных используется для обозначения трехзначного кода? Получается идет сравнение Int и Varchar(3). 1. Индекс по полю типа бит вещь очень неизбирательная, поэтому при выборке сканировать придется всю таблицу. Возможно, более удачный вариант завести отдельную таблицу что-то вроде Top(GoodsID int PK), в которую складывать идентификаторы топовых товаров, если их не очень много, зависит от нескольких причин. С потолка можно сказать про не более 30%, зависит от количества операций чтения данных. 2. Символьные данные при сравнении в операциях поиска и фильтрации обычно используют правила сортировки, что в целом эти операции замедляет. Кроме того, строки, как правило, разной длины, что тоже сказывается на сравнении из-за способа хранения, так как фиксированое поле и переменное хранятся по-разному, обычно это описывается в документации к серверу. Лучше хранить в фиксированом, но тогда может быть неоптимальный объём хранения таковых данных. Поэтому, если уж решили использовать, то при многих оперциях полезно указывать опцией, что при сравнение использовать бинарную сортировку. А вообще правильно сказали выше, тип поля должен зависеть не от того, что меньше, а от того, каким он должен быть. Если в качестве кода использутся только цифры, то разумно использовать целочисленный тип, если же могут быть любые другие символы, то символьный, а если ещё и диапазон символов превышает ASCII, то от Unicode никуда не денешься. В общем, нюансов много. В любом случае, типы должны совпадать, чтобы серверу не приходилось "на лету" выполнять конвертацию данных, это, как правило, катастрофически сказывается на производительности. Есть очень неплохая книга для практиков, рекомендуется к прочтению. Авторы сделали много разных интересных экспериментов на ряде самых известных RDBMS. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.04.2014, 02:43 |
|
||
|
|

start [/forum/topic.php?fid=32&msg=38608284&tid=1540909]: |
0ms |
get settings: |
9ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
154ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
64ms |
get tp. blocked users: |
1ms |
| others: | 14ms |
| total: | 273ms |

| 0 / 0 |

Извините, этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
... ля, ля, ля ...