복붙노트

[SQL] 나는 하나 개의 SQL 쿼리의 SQL 서버 수 () 행을받을 수 있나요?

SQL

나는 하나 개의 SQL 쿼리의 SQL 서버 수 () 행을받을 수 있나요?

그것은 가능하다 - 나는 결과와 일부 쿼리의 위에 n 행의 총 수를 좀하고 싶습니다 하나 개의 문장에서?

나는 같은 결과를 기대할 수 :

count(..) column1        column2
125         some_value   some_value
125         some_value   some_value

사전에 감사합니다!

해결법

  1. ==============================

    1.이 같이 :

    이 같이 :

    SELECT TOP 100 --optional
        MC.Cnt, M.Column1, M.Column2
    FROM
        myTable M
        CROSS JOIN
        (SELECT COUNT(*) AS Cnt FROM myTable) MC
    

    편집 : downvote 및 COUNT / OVER 대답 후. 내 두 테이블에 비교

    당신은 절하여 가입 내 CROSS 사이에 큰 차이 / 단순 집계하고 COUNT / 빈 ORDER를 볼 수 있습니다

    SELECT COUNT(*) OVER() AS C, key1col, key2col
    FROM myTable
    
    (24717 row(s) affected)
    
    Table 'Worktable'. Scan count 3, logical reads 49865, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
    Table 'myTable'. Scan count 1, logical reads 77, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
    
    StmtText
      |--Nested Loops(Inner Join)
           |--Table Spool
           |    |--Segment
           |         |--Index Scan(OBJECT:([MyDB].[dbo].[myTable].[IX_useful]))
           |--Nested Loops(Inner Join, WHERE:((1)))
                |--Compute Scalar(DEFINE:([Expr1003]=CONVERT_IMPLICIT(int,[Expr1005],0)))
                |    |--Stream Aggregate(DEFINE:([Expr1005]=Count(*)))
                |         |--Table Spool
                |--Table Spool
    
    SELECT
        MC.Cnt, M.key1col, M.key2col
    FROM
        myTable M
        CROSS JOIN
        (SELECT COUNT(*) AS Cnt FROM myTable) MC
    
    (24717 row(s) affected)
    
    Table 'myTable'. Scan count 2, logical reads 154, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
    
    
    StmtText
      |--Nested Loops(Inner Join)
           |--Compute Scalar(DEFINE:([Expr1005]=CONVERT_IMPLICIT(int,[Expr1009],0)))
           |    |--Stream Aggregate(DEFINE:([Expr1009]=Count(*)))
           |         |--Index Scan(OBJECT:([MyDB].[dbo].[myTable].[IX_useful]))
           |--Index Scan(OBJECT:([MyDB].[dbo].[myTable].[IX_useful] AS [M]))
    

    나는 570k 행이 테이블에이 작업을 반복하고 여기 IO입니다했습니다

    Table 'Worktable'. Scan count 3, logical reads 1535456, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
    Table 'myTable'. Scan count 1, logical reads 2929, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
    
    
    Table 'myTable'. Scan count 34, logical reads 6438, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
    
  2. ==============================

    2.이건 어떤가요

    이건 어떤가요

    SELECT COUNT(*) OVER() AS C, COLUMN1, COLUMN2
    FROM TABLE  
    

    에 관한 CROSS 쿼리를 가입 무거운의 INSERT / DELETE 환경에서, 십자가는 잘못된 행 수를 반환합니다 가입 할 수 있습니다.

    다중 연결에서이 시도 연결 1

    set nocount on;
    drop table dbo.test_table;
    GO
    create table dbo.test_table
    (
        id_field uniqueidentifier not null default(newid()),
        filler char(2000) not null default('a')
    );
    GO
    create unique clustered index idx_id_fld on dbo.test_table(id_field);
    GO
    while 1 = 1
    insert into dbo.test_table default values;
    

    연결 2

    select T2.cnt, T1.id_field, T1.filler
    from dbo.test_table T1
    cross join (select COUNT(*) as cnt from dbo.test_table) T2
    
    select T2.cnt, T1.id_field, T1.filler
    from dbo.test_table T1
    cross join (select COUNT(*) as cnt from dbo.test_table) T2
    
    select T2.cnt, T1.id_field, T1.filler
    from dbo.test_table T1
    cross join (select COUNT(*) as cnt from dbo.test_table) T2
    

    마다 레코드 (@@ ROWCOUNT)의 카운트 T2.cnt 다릅니다

    COUNT의 경우에 (*)는 OVER (), 단일 테이블 검색이 있고 @@ ROWCOUNT 항상 T2.cnt와 동일

    쿼리 계획에 대해서 - SQL 2005 SP3는 SQL 2008 R2보다 COUNT을 (*) OVER () 일을 훨씬 약한 것으로 보인다. 그 위에, 그것은 잘못 쿼리 비용 (I는 서브 쿼리는 전체 쿼리의 100 % 이상을 요할 수 있었다 생각하지 않았다)보고합니다.

    시나리오의 많은으로, COUNT의 비용 (*) 십자가의 OVER ()는 50 ~ 75 % 사이가 가입

    십자가에 대한 최상의 시나리오는에 카운트를 할 수있는 매우 좁은 인덱스가 있다면 것이다 가입 할 수 있습니다. 그 방법은 데이터 + 개수에 대한 인덱스 스캔에 대한 클러스터 된 인덱스 스캔이있을 것이다.

    언제나처럼, 그것은 측정, 측정, 측정을하고있는 거 행복에 살 수있는 타협으로 이동하는 것이 가장 좋습니다.

  3. ==============================

    3.당신은 CROSS 가입 및 CTE이 작업을 수행 할 수 있지만, 그것은 매우 효율적이 아니다 :

    당신은 CROSS 가입 및 CTE이 작업을 수행 할 수 있지만, 그것은 매우 효율적이 아니다 :

    WITH Rows_CTE AS
    (
        SELECT Column1, Column2
        FROM Table
        WHERE (...)
    )
    SELECT c.Cnt, r.Column1, r.Column2
    FROM Rows_CTE r
    CROSS JOIN (SELECT COUNT(*) AS Cnt FROM Rows_CTE) c
    

    더 좋은 방법은 당신이 COMPUTE를 사용하여 할 수있는 단일 쿼리하지만 여러 결과 집합을 사용하는 것입니다 원하는 것을 얻을 생각 :

    SELECT Column1, Column2
    FROM Table
    WHERE (...)
    COMPUTE COUNT([Column1])
    
  4. ==============================

    4.이 쿼리에 대한 시도해 :

    이 쿼리에 대한 시도해 :

    select ColumnId,Descr,(select COUNT(*) from ColumnSetUp)as c
    from ColumnSetUp
    group by ColumnId,Descr
    
  5. from https://stackoverflow.com/questions/2798094/can-i-get-count-and-rows-from-one-sql-query-in-sql-server by cc-by-sa and MIT license