По чисто астетическим причинам я всегда использовал первый столбец таблицы в качестве столбца (столбцов) первичного ключа. После этого я не позаботился о добавлении столбцов заказа в таблицу. Это неправильно?
Есть ли преимущество в производительности, если разместить целые столбцы в таблице перед текстовыми или двоичными столбцами? Или, может быть, сначала индексируются столбцы?
Хотя текущая база данных, с которой я работаю, - это MySQL, ответы на другие базы данных были бы полезны.
Собственно, на самом деле горячий нагрузки, это может иметь значительное влияние. Если вы посмотрите на Анатомия записи вы увидите, что столбцы следуют за заголовком записи, сначала за фиксированным столбцом следуют столбцы переменной длины. Таким образом, всякий раз, когда осуществляется доступ к столбцу, сначала необходимо получить доступ к заголовку записи, и этот доступ почти всегда отсутствует кэш L2. Любой последующий доступ к той же строке кэша (64 байта) будет попадать в кэш L2 почти в 100% случаев. Учитывая, что разница в циклах ЦП между промахом в кэше L2 и попаданием в него составляет примерно 2 порядка, вы получите довольно большой прирост производительности, если расположите часто используемые столбцы рядом с заголовком записи. Повышение сквозной производительности не будет где-то на 2 порядка, но для определенных нагрузок OLTP в целом может составить до 5-10%. Для аналитических нагрузок стоимость ввода-вывода превышает все остальное, и вы, вероятно, не сможете измерить разницу.
Эта логика применяется к каждый индекс индивидуально, но для индексов вы должны учитывать, что порядок объявления индекса является фактическим порядком ключа, поэтому у вас не так много места для изменений.
Это неправильно?
Нет, я делаю то же самое - в основном потому, что таблица всегда начинается с PK.
Есть ли преимущество в производительности, если разместить целые столбцы в таблице перед текстовыми или двоичными столбцами? Или, может быть, сначала индексируются столбцы?
Не на SQL Server. Если это на MySQL, это было бы довольно серьезным провалом, если только накладные расходы не ДЕЙСТВИТЕЛЬНО малы. Индексы живут отдельно от таблиц. В течение срока службы базы данных индексированные столбцы и даже существующие столбцы могут изменяться.
Я бы сказал, что на SQL Server это не имеет значения. SQL Server читает целые страницы, и я не уверен, что обработка для перехода к 3-му столбцу на странице больше, чем 2-й или 5-й или что-то еще.
Не имеет значения для таблицы, но имеет значение для индекса. Первый столбец в индексе должен быть в предложении WHERE, чтобы индекс использовался.