Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

има ли предимство varchar(500) пред varchar(8000)?

Един пример, в който това може да направи разлика, е, че може да предотврати оптимизация на производителността, която избягва добавянето на информация за версиите на редове към таблици с последващи задействания.

Това е разгледано от Пол Уайт тук

Действителният размер на съхраняваните данни е без значение – важен е потенциалният размер.

По същия начин, ако се използват оптимизирани за памет таблици от 2016 г., е възможно да се използват LOB колони или комбинации от ширини на колони, които потенциално биха могли да надхвърлят ограничението на редовете, но с наказание.

(Макс.) колоните винаги се съхраняват извън ред. За други колони, ако размерът на реда с данни в дефиницията на таблицата може да надвишава 8060 байта, SQL Server избутва най-голямата колона(и) с променлива дължина извън реда. Отново, това не зависи от количеството данни, които съхранявате там.

Това може да има голям отрицателен ефект върху консумацията на памет и производителността

Друг случай, при който прекомерното деклариране на ширините на колоните може да има голяма разлика, е дали таблицата някога ще бъде обработена с помощта на SSIS. Паметта, разпределена за колони с променлива дължина (не BLOB), е фиксирана за всеки ред в дървото на изпълнение и е според декларираната максимална дължина на колоните, което може да доведе до неефективно използване на буферите на паметта (пример). Въпреки че разработчикът на SSIS пакет може да декларира по-малък размер на колоната от източника, този анализ е най-добре да се направи предварително и да се приложи там.

Обратно в самия двигател на SQL Server подобен случай е, че при изчисляване на предоставената памет за разпределяне за SORT операции SQL Server приема, че varchar(x) колоните средно ще консумират x/2 байтове.

Ако повечето от вашия varchar колоните са по-пълни от това, което може да доведе до sort операции се прехвърлят към tempdb .

Във вашия случай, ако вашият varchar колоните са декларирани като 8000 байтове, но всъщност имат съдържание, много по-малко от това на вашата заявка ще бъде разпределена памет, която не изисква, което очевидно е неефективно и може да доведе до изчакване за предоставяне на памет.

Това е обхванато в част 2 от SQL Workshops Webcast 1, която можете да изтеглите от тук или вижте по-долу.

use tempdb;

CREATE TABLE T(
id INT IDENTITY(1,1) PRIMARY KEY,
number int,
name8000 VARCHAR(8000),
name500 VARCHAR(500))

INSERT INTO  T 
(number,name8000,name500)
SELECT number, name, name /*<--Same contents in both cols*/
FROM master..spt_values

SELECT id,name500
FROM T
ORDER BY number

SELECT id,name8000
FROM T
ORDER BY number



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL Server v.Next :STRING_AGG производителност, част 2

  2. Създаване на многоетапна задача за агент на SQL Server (T-SQL)

  3. Всичко, което трябва да знаете за SQL Server JOINS

  4. Какъв е най-добрият начин да се справите с DBNull

  5. Извличане на дефиниция на колона за набор от резултати от запомнени процедури