SQL, 보조 숫자임 표

특정 유형의 sql 쿼리, 보조 표 숫자임 매우 유용할 수 있습니다. 이 때 많은 행뿐만 테이블로 생성할 수 있는 특정 작업을 할 수 있는 사용자 정의 함수 또는 형태로 되돌려줍니다 필요한 행뿐만 각 질의입니다.

이러한 기능을 만들 수 있는 최적의 방법은 무엇입니까?

질문에 대한 의견 (4)
해결책

이젠 아니야. 미안해, 이렇게 늦게 응답하는 등 기존 게시물로의 I& # 39 m, 그래, 나는 가장 인기 있는 오토메이티드 목격하고서야 했다 때문에 (당시 14 개의 다른 방법을 통해 반복 스테 오토메이티드 https://partner. microsoft.) 이 마음이, 흠. 기껏해야 성능 도전했다.

첫째, 14 개의 다른 솔루션뀉뀉뀉뀉 정상입니다 있었어요새롭게 다른 만드는 방법을 사용한 기사 한 표 즉석에서 이 글에서 지적한 대로 탤리를 번호 / 하지만, 또한 매우 중요한 쿼트에 a # 39 의 there& 스레드할 들었다.

&gt. &quot 대한 제안, 효율성 및 &gt. 성능 종종 주관적인 것이다. &gt. 어떻게 기술입니까 질의입니다 상관없이 &gt. 사용하는 실제 구현 &gt. 의 효율성을 결합할지 질의입니다. &gt. 따라서 의존하지 않고 &gt. 바이어스됨 지침, 것이 중요합니다 &gt. 쿼리하고 테스트하려면 확인할 수 있는 &gt. 어느쪽이야 향상합니다 better.&quot.

아이러니하게도 이 많이 들어 있으며, 그 주관적인 명령문입니다 &quot 바이어스됨 guidelines&quot. 재귀 스테 &quot 등 여러 efficiently&quo , , 열거합니다 생성할 수 있으며, 이는 꽤 효과적인 방법을 사용하여 및 &quot , * from a while 루프를 통해 글을 이치크 Ben-Gen&quot 뉴스그룹 (I& 게시하기를 비교를 위해, 그는 그냥 # 39 m 합니다 어떤 목적). 월요일 c& # 39, 여러분. 그냥 좋은 이름을 거론하며 Itzik& # 39 의 일부) 를 유발할 수 있는 실제 사용 케이블링의 진흙땅 끔찍한 메서드입니다. 저자는 practice what %hskb), 그는 설교 및 성능 테스트를 할 때는 먼저 잘못된 명령문입니다 특히 침묵이군 터무니없이 작은 어떻게해야합니다 등 모든 스칼리브릴리티.

실제로 어떤 생각을 하고 있는 몇 가지 테스트 코드를 만들기 전에 모든 사람을, 아니,, 주관적 청구용 의심하였더라 높여줍니까 &quot likes&quot here& # 39 의 일부 코드를 통해 자신의 테스트 할 수 있습니다. # 39 에서 설치 및 실행, re you& 프로필러 스피드 대한 테스트를 위한 체크아웃합니다 구하겠죠 just do a # 39 &quot Search& n& # 39, Replace";; 1 000 000 단축시킵니다 수 &quot favorite"; 번호를 참조).


--===== Test for 1000000 rows ==================================
GO
--===== Traditional RECURSIVE CTE method
   WITH Tally (N) AS 
        ( 
         SELECT 1 UNION ALL 
         SELECT 1 + N FROM Tally WHERE N < 1000000 
        ) 
 SELECT N 
   INTO #Tally1 
   FROM Tally 
 OPTION (MAXRECURSION 0);
GO
--===== Traditional WHILE LOOP method
 CREATE TABLE #Tally2 (N INT);
    SET NOCOUNT ON;
DECLARE @Index INT;
    SET @Index = 1;
  WHILE @Index 
해설 (2)

대신 테이블 사용하는 것이 가장 적합한 함수는 함수. 기능 추가 CPU 가 사용하는 데이터 값이 반환될 경우 만듭다 로드, 특히 값이 반환될 빽이라는 매우 큰 약점이다.

해설 (4)

이 문서 에 논의를 통해 14 개의 다른 해결책을 각. 중요한 점은.

&gt. 이에 대해 효율성 및 제안 &gt. 성능 종종 주관적인 것이다. &gt. 어떻게 기술입니까 질의입니다 상관없이 &gt. 사용하는 실제 구현 &gt. 의 효율성을 결합할지 질의입니다. &gt. 따라서 의존하지 않고 &gt. 바이어스됨 지침, 것이 중요합니다 &gt. 쿼리하고 테스트하려면 확인할 수 있는 &gt. 어느쪽이야 향상합니다 좋습니다.

개인적으로 좋아했잖아:

WITH Nbrs ( n ) AS (
    SELECT 1 UNION ALL
    SELECT 1 + n FROM Nbrs WHERE n < 500 )
SELECT n FROM Nbrs
OPTION ( MAXRECURSION 500 )
해설 (1)

이 관점은 int '초고속' 에 모든 양수 값.

CREATE VIEW dbo.Numbers
WITH SCHEMABINDING
AS
    WITH Int1(z) AS (SELECT 0 UNION ALL SELECT 0)
    , Int2(z) AS (SELECT 0 FROM Int1 a CROSS JOIN Int1 b)
    , Int4(z) AS (SELECT 0 FROM Int2 a CROSS JOIN Int2 b)
    , Int8(z) AS (SELECT 0 FROM Int4 a CROSS JOIN Int4 b)
    , Int16(z) AS (SELECT 0 FROM Int8 a CROSS JOIN Int8 b)
    , Int32(z) AS (SELECT TOP 2147483647 0 FROM Int16 a CROSS JOIN Int16 b)
    SELECT ROW_NUMBER() OVER (ORDER BY z) AS n
    FROM Int32
GO
해설 (4)

Sql server 2016년 을 사용하여 테이블을 생성하는 데 사용할 수 있습니다 '+' 숫자 '오픈제슨':

-- range from 0 to @max - 1
DECLARE @max INT = 40000;

SELECT rn = CAST([key] AS INT) 
FROM OPENJSON(CONCAT('[1', REPLICATE(CAST(',1' AS VARCHAR(MAX)),@max-1),']'));

&lt, kbd&gt, ['리베디모'] (https://data.stackexchange.com/stackoverflow/query/481961) &lt /kbd>;

&lt hr>; Idea 에서 발췌 [어떻게 사용할 수 있는 일련의 번호를 오픈제슨 발령합니다?] (https://blogs.msdn.microsoft.com/sqlserverstorageengine/2015/11/03/generate-serie-of-numbers-in-sql-server-2016-using-openjson/)

해설 (2)

편집: # 39 의 주석문입니다 Conrad& 볼 수 있습니다.

39 의 제프 Moden& 오토메이티드 아주 좋다. 하지만 내가 찾을 수 있는 방법을 않으면 실패할 Postgres 작업자쪽에서 이치크 분리하십시오 E32 행일.

내가 조금 빠름 postgres (40ms vs 100ms) 는 here 에 다른 방법으로 postgres 맞게 적용되었다.

WITH 
    E00 (N) AS ( 
        SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL 
        SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 ),
    E01 (N) AS (SELECT a.N FROM E00 a CROSS JOIN E00 b),
    E02 (N) AS (SELECT a.N FROM E01 a CROSS JOIN E01 b ),
    E03 (N) AS (SELECT a.N FROM E02 a CROSS JOIN E02 b 
        LIMIT 11000  -- end record  11,000 good for 30 yrs dates
    ), -- max is 100,000,000, starts slowing e.g. 1 million 1.5 secs, 2 mil 2.5 secs, 3 mill 4 secs
    Tally (N) as (SELECT row_number() OVER (ORDER BY a.N) FROM E03 a)

SELECT N
FROM Tally

As I am SQL Server 의 세계, 더 나은 방법으로 숨길까요 Postgres 가질 수 있는 테이블을 누락했습니다 탤리를 있는 플랫폼. 정수 ()? 시퀀스 ()?

해설 (7)

나중에, & # 39 와 같은 I& 여전히 큰 기여를 약간 다른 # 39 traditional& # 39;;; d 스테 (언약보다는 내려받습니다 볼륨입니다 터치 베이스 표를 행):

--===== Hans CROSS JOINED CTE method
WITH Numbers_CTE (Digit)
AS
(SELECT 0 UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9)
SELECT HundredThousand.Digit * 100000 + TenThousand.Digit * 10000 + Thousand.Digit * 1000 + Hundred.Digit * 100 + Ten.Digit * 10 + One.Digit AS Number
INTO #Tally5
FROM Numbers_CTE AS One CROSS JOIN Numbers_CTE AS Ten CROSS JOIN Numbers_CTE AS Hundred CROSS JOIN Numbers_CTE AS Thousand CROSS JOIN Numbers_CTE AS TenThousand CROSS JOIN Numbers_CTE AS HundredThousand

39 의 스테 않은 것이 그 후 이 스테 향상합니다 더 판독합니다 Itzik& 전통표기 스테.

  • 그러나 다음 다른 queries.* 일관되게 향상합니다 덜 쓰기 아시다시피 훨씬 비싼 어졌다면 판독합니다 일관성 있는 쓰기뿐만 적지 않다.

이 기간 따라 수에 따라 크게 코어 (맥스도프) 이지만, on my 8core 지속적으로 감소 (기간 (ms) 가 빨리 다음 다른 질의입니다.

나는 사용:

Microsoft SQL Server 2012 - 11.0.5058.0 (X64) 
May 14 2014 18:34:29 
Copyright (c) Microsoft Corporation
Enterprise Edition (64-bit) on Windows NT 6.3  (Build 9600: )

windows Server 2012년 R2 에, 32 GB, 제온® X3450 @2.67Ghz, 4 개의 httechnology 활성화되었습니다.

해설 (0)