[SQL] 나는 하나 개의 SQL 쿼리의 SQL 서버 수 () 행을받을 수 있나요?
SQL나는 하나 개의 SQL 쿼리의 SQL 서버 수 () 행을받을 수 있나요?
그것은 가능하다 - 나는 결과와 일부 쿼리의 위에 n 행의 총 수를 좀하고 싶습니다 하나 개의 문장에서?
나는 같은 결과를 기대할 수 :
count(..) column1 column2
125 some_value some_value
125 some_value some_value
사전에 감사합니다!
해결법
-
==============================
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.이건 어떤가요
이건 어떤가요
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.당신은 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.이 쿼리에 대한 시도해 :
이 쿼리에 대한 시도해 :
select ColumnId,Descr,(select COUNT(*) from ColumnSetUp)as c from ColumnSetUp group by ColumnId,Descr
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
'SQL' 카테고리의 다른 글
[SQL] 메모리 2005 / SQL C #에서 BLOB 데이터를 읽을 수있는 효과적인 방법 (0) | 2020.06.16 |
---|---|
[SQL] PHP / MySQL을 매김 (0) | 2020.06.16 |
[SQL] 행 집합은 뒤로 스크롤을 지원하지 않습니다 (0) | 2020.06.16 |
[SQL] SQL 주입으로부터 보호 (0) | 2020.06.16 |
[SQL] Class.forName을 (JDBC_DRIVER)는 더 이상 필요하지? (0) | 2020.06.16 |