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

Стойност на таблица Конструктор Ограничение за максимален брой редове в Select

Няма съответен твърд кодиран лимит (65 536 * Размерът на мрежовия пакет от 4 KB е 268 MB и дължината на вашия скрипт не е близо до това), въпреки че не е препоръчително да използвате този метод за голямо количество редове.

Грешката, която виждате, се генерира от клиентските инструменти, а не от SQL Server. Ако конструирате SQL низа в динамична SQL компилация, може поне да стартира успешно

DECLARE @SQL NVARCHAR(MAX) = '(100,200,300),
';

SELECT @SQL = 'SELECT * FROM (VALUES ' + REPLICATE(@SQL, 1000000) + '
(100,200,300)) tc (proj_d, period_sid, val)';

SELECT @SQL AS [processing-instruction(x)]
FOR XML PATH('')

SELECT DATALENGTH(@SQL) / 1048576.0 AS [Length in MB] --30.517705917

EXEC(@SQL);

Въпреки че убих горното след ~30 минути време за компилация и все още не беше произвел ред. Литералните стойности трябва да се съхраняват в самия план като таблица с константи и SQL Server изразходва много време опитвайки се да извлека свойства и за тях.

SSMS е 32-битово приложение и хвърля std::bad_alloc изключение при анализиране на пакета

Той се опитва да натисне елемент върху вектор на Token, който е достигнал капацитет и опитът му за преоразмеряване се проваля поради липса на достатъчно голяма съседна област от паметта. Така че изявлението никога не стига дори до сървъра.

Капацитетът на вектора нараства с 50% всеки път (т.е. следвайки последователността тук ). Капацитетът, до който векторът трябва да нарасне, зависи от това как е изграден кодът.

Следното трябва да нарасне от капацитет от 19 на 28.

SELECT * FROM (VALUES (100,200,300),(100,200,300),(100,200,300),(100,200,300),(100,200,300),(100,200,300)) tc (proj_d, period_sid, val)

а следното се нуждае само от размер 2

SELECT * FROM (VALUES (100,200,300),(100,200,300),(100,200,300),(100,200,300),(100,200,300),(100,200,300)) tc (proj_d, period_sid, val)

Следното се нуждае от капацитет от> 63 и <=94.

SELECT *
FROM   (VALUES 
      (100,
       200,
       300),
      (100,
       200,
       300),
      (100,
       200,
       300),
      (100,
       200,
       300),
      (100,
       200,
       300),
      (100,
       200,
       300)
       ) tc (proj_d, period_sid, val) 

За милион реда, оформени като в случай 1, векторният капацитет трябва да нарасне до 3 543 306.

Може да откриете, че някое от следните ще позволи успешен разбор от страна на клиента.

  1. Намалете броя на нов ред.
  2. Рестартиране на SSMS с надеждата, че заявката за голяма непрекъсната памет е успешна, когато има по-малко фрагментиране на адресното пространство.

Въпреки това, дори ако го изпратите успешно на сървъра, това ще доведе само до убиване на сървъра по време на генериране на план за изпълнение, както беше обсъдено по-горе.

Ще бъде много по-добре да използвате съветника за импортиране и експортиране, за да заредите таблицата. Ако трябва да го направите в TSQL, ще откриете, че разбиването му на по-малки партиди и/или използването на друг метод, като раздробяване на XML, ще се представи по-добре от конструкторите с таблична стойност. Следното се изпълнява за 13 секунди на моята машина например (въпреки че ако използвате SSMS, все пак вероятно ще трябва да разделите на множество партиди, вместо да поставите масивен XML низов литерал).

DECLARE @S NVARCHAR(MAX) = '<x proj_d="100" period_sid="200" val="300" />
' ; 

DECLARE @Xml XML = REPLICATE(@S,1000000);

SELECT 
    x.value('@proj_d','int'),
    x.value('@period_sid','int'),
    x.value('@val','int')
FROM @Xml.nodes('/x') c(x)


  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 management studio 2012

  2. връщане на каретка в sql сървър 2012

  3. При каскада за изтриване за таблица за саморефериране

  4. PHP &SQL Server - съкратени имена на полета

  5. Клауза WHERE IS NULL, IS NOT NULL или NO WHERE в зависимост от стойността на параметъра на SQL Server