Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

czy istnieje przewaga varchar(500) nad varchar(8000)?

Jednym z przykładów, w których może to mieć znaczenie, jest to, że może uniemożliwić optymalizację wydajności, która pozwala uniknąć dodawania informacji o wersji wierszy do tabel z wyzwalaczami after.

Omówił to tutaj Paul White

Rzeczywisty rozmiar przechowywanych danych jest nieistotny – liczy się potencjalny rozmiar.

Podobnie, jeśli używasz tabel zoptymalizowanych pod kątem pamięci od 2016 r., możliwe było użycie kolumn LOB lub kombinacji szerokości kolumn, które potencjalnie mogłyby przekroczyć limit wrzutów, ale z karą.

(Maksymalnie) kolumny są zawsze przechowywane poza wierszem. W przypadku innych kolumn, jeśli rozmiar wiersza danych w definicji tabeli może przekroczyć 8060 bajtów, SQL Server wypycha największe kolumny o zmiennej długości poza wiersz. Ponownie, nie zależy to od ilości danych, które tam przechowujesz.

Może to mieć duży negatywny wpływ na zużycie pamięci i wydajność

Innym przypadkiem, w którym nadmierne deklarowanie szerokości kolumn może mieć duże znaczenie, jest to, czy tabela będzie kiedykolwiek przetwarzana przy użyciu usług SSIS. Pamięć przydzielona dla kolumn o zmiennej długości (nie typu BLOB) jest stała dla każdego wiersza w drzewie wykonania i odpowiada zadeklarowanej maksymalnej długości kolumn, co może prowadzić do nieefektywnego wykorzystania buforów pamięci (przykład). Podczas gdy deweloper pakietu SSIS może zadeklarować mniejszy rozmiar kolumny niż źródło, tę analizę najlepiej przeprowadzić z góry i tam egzekwować.

W przypadku samego silnika SQL Server podobny przypadek jest taki, że podczas obliczania przyznanej pamięci do przydzielenia dla SORT operacje SQL Server zakłada, że ​​varchar(x) kolumny będą zużywać średnio x/2 bajtów.

Jeśli większość twojego varchar kolumny są pełniejsze niż może to prowadzić do sort operacje rozlewają się do tempdb .

W Twoim przypadku, jeśli Twój varchar kolumny są zadeklarowane jako 8000 bajtów, ale w rzeczywistości mają zawartość znacznie mniejszą niż ta, na którą twoje zapytanie zostanie przydzielone pamięci, której nie wymaga, co jest oczywiście nieefektywne i może prowadzić do oczekiwania na przyznanie pamięci.

Zostało to omówione w części 2 programu SQL Workshops Webcast 1, który można pobrać stąd lub poniżej.

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. In-Memory OLTP:Co nowego w SQL Server 2016

  2. Błąd JDBC programu SQL Server w języku Java 8:sterownik nie może nawiązać bezpiecznego połączenia z programem SQL Server przy użyciu szyfrowania Secure Sockets Layer (SSL)

  3. Tabele SQL Server:jaka jest różnica między @, # i ##?

  4. W SQL Server, jak mogę zablokować pojedynczy wiersz w sposób podobny do Oracle SELECT FOR UPDATE WAIT?

  5. Optymistyczna współbieżność:IsConcurrencyToken i RowVersion