복붙노트

[SQL] 최적의 SQL 방법은 무엇입니까 : SELECT 문 다음 행의 수를 필요하십니까?

SQL

최적의 SQL 방법은 무엇입니까 : SELECT 문 다음 행의 수를 필요하십니까?

나는 하나의 테이블에서 열을 (어떤 조인)을 선택하려고 해요 그리고 내가 행을 검색하기 시작 이상적 전에, 행 수의 수를해야합니다. 나는 정보 I 필요를 제공하는 두 가지 방법에왔다.

접근 1 :

SELECT COUNT( my_table.my_col ) AS row_count
  FROM my_table
 WHERE my_table.foo = 'bar'

그때

SELECT my_table.my_col
  FROM my_table
 WHERE my_table.foo = 'bar'

또는 2에 접근

SELECT my_table.my_col, ( SELECT COUNT ( my_table.my_col )
                            FROM my_table
                           WHERE my_table.foo = 'bar' ) AS row_count
  FROM my_table
 WHERE my_table.foo = 'bar'

내 SQL 드라이버 (SQL 네이티브 클라이언트 9.0) 나 SELECT 문에 대해 SQLRowCount을 사용하는 것을 허용하지 않기 때문에 나는이 일을하고있다하지만 난 그것에 정보를 할당하기 전에 배열을 할당하기 위해 내 결과에서 행의 수를 알아야합니다. 동적으로 할당 된 용기의 사용은 내 프로그램이 지역에서 불행히도, 옵션이다.

나는 다음과 같은 시나리오가 발생할 수 있다고 우려하고있다 :

접근이이 문제를 금지합니까?

또한, 두 윌 하나는 빠를 접근? 어느 그렇다면?

마지막으로 고려해야하는 더 나은 방법이있다 (위해 SQLRowCount를 사용하여 SELECT 결과의 행 수를 반환하는 드라이버를 지시하는 아마 방법은?)

질문하는 사람들을 위해, 나는 상기 SQL 드라이버 네이티브 C ++를 사용하고 있습니다 (Microsoft에서 제공했습니다.)

해결법

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

    1.COUNT (*)와 실제 쿼리가 일관성있는 결과를 얻을 수 있다고 100 % 확신 할 수있는 두 가지 방법이 있습니다 :

    COUNT (*)와 실제 쿼리가 일관성있는 결과를 얻을 수 있다고 100 % 확신 할 수있는 두 가지 방법이 있습니다 :

    다른 격리 수준이 다른 클라이언트에 의해 만들어진 새 행이 현재의 트랜잭션 (transaction)에 표시 될 수 있기 때문에 이러한 격리 수준 중 하나를 사용하는 것이 중요합니다. 자세한 내용은 SET 트랜잭션 격리에 MSDN 문서를 참조하십시오.

  2. ==============================

    2.당신은 SQL Server를 사용하는 경우, 쿼리 후에는 @@의 RowCount 기능을 선택할 수 있습니다 (또는 결과 세트가있을 경우 20 억 개 이상의 행이 RowCount_Big () 함수를 사용). 이것은 삽입 / 업데이트 / 삭제 문에 의해 영향을받는 행의 이전 문 또는 번호로 선택된 행의 수를 반환합니다.

    당신은 SQL Server를 사용하는 경우, 쿼리 후에는 @@의 RowCount 기능을 선택할 수 있습니다 (또는 결과 세트가있을 경우 20 억 개 이상의 행이 RowCount_Big () 함수를 사용). 이것은 삽입 / 업데이트 / 삭제 문에 의해 영향을받는 행의 이전 문 또는 번호로 선택된 행의 수를 반환합니다.

    SELECT my_table.my_col
      FROM my_table
     WHERE my_table.foo = 'bar'
    
    SELECT @@Rowcount
    

    당신이 결과에 포함 카운트가 2에 접근 유사한 전송 행하고자하는 경우 또는, 오버 절을 사용할 수 있습니다.

    SELECT my_table.my_col,
        count(*) OVER(PARTITION BY my_table.foo) AS 'Count'
      FROM my_table
     WHERE my_table.foo = 'bar'
    

    오버 절을 사용하여 행 수를 얻을 수있는 하위 쿼리를 사용하는 것보다 훨씬 더 나은 성능을 제공합니다. 최고의 성능을 갖게됩니다 @@의 RowCount를 사용하면 선택 @@의 RowCount 문에 대한 모든 쿼리 비용이있을 수 없기 때문에

    코멘트에 응답 업데이트 : 내가 준 예는 파티션의 행 #을 줄 것이다 - "my_table.foo BY 파티션"에 의해이 경우 정의. 각 행의 열 값 my_table.foo의 값이 동일한 행 #이다. 귀하의 예제 쿼리에서 ( "my_table.foo의 = '바'", 결과 집합의 모든 행이 my_table.foo 같은 값을가집니다 따라서 열의 값은 모든 행과 동일한에 대해 동일합니다 절을 가지고 있기 때문에 이 경우) 쿼리의 행 이것을 #.

    다음은 결과 집합의 행의 총 # 각 행의 열을 포함하는 방법의 더 나은 / 간단한 예입니다. 간단히 By 절 선택 파티션을 제거합니다.

    SELECT my_table.my_col, count(*) OVER() AS 'Count'
      FROM my_table
     WHERE my_table.foo = 'bar'
    
  3. ==============================

    3.접근이 항상 결과 세트를 일치하는 수를 반환합니다.

    접근이 항상 결과 세트를 일치하는 수를 반환합니다.

    나는 당신의 계산에 조건이 데이터 세트에 대한 조건과 일치하는지 당신이 보증에,하지만 당신의 외부 쿼리에 하위 쿼리를 연결하는 것이 좋습니다.

    SELECT 
      mt.my_row,
     (SELECT COUNT(mt2.my_row) FROM my_table mt2 WHERE mt2.foo = mt.foo) as cnt
    FROM my_table mt
    WHERE mt.foo = 'bar';
    
  4. ==============================

    4.당신은 조건이 결과의 질의와 검색의 실행 이후 몇 밀리 초 단위로 변경 될 수 있습니다 충족 행의 수를 걱정하는 경우, 당신은 / 트랜잭션 내부 쿼리를 실행해야합니다 수 :

    당신은 조건이 결과의 질의와 검색의 실행 이후 몇 밀리 초 단위로 변경 될 수 있습니다 충족 행의 수를 걱정하는 경우, 당신은 / 트랜잭션 내부 쿼리를 실행해야합니다 수 :

    BEGIN TRAN bogus
    
    SELECT COUNT( my_table.my_col ) AS row_count
    FROM my_table
    WHERE my_table.foo = 'bar'
    
    SELECT my_table.my_col
    FROM my_table
    WHERE my_table.foo = 'bar'
    ROLLBACK TRAN bogus
    

    이것은 항상 정확한 값을 반환합니다.

    또한 당신은 SQL Server를 사용하는 경우, 당신은 마지막 문에 의해 영향을받는 행의 수를 얻기 위해 @@ ROWCOUNT를 사용하여, 당신은 완전히 모든 것을 반환 할 수 있도록 임시 테이블이나 테이블 변수에 실제 쿼리의 출력을 리디렉션하고, 어떤 거래의 필요 :

    DECLARE @dummy INT
    
    SELECT my_table.my_col
    INTO #temp_table
    FROM my_table
    WHERE my_table.foo = 'bar'
    
    SET @dummy=@@ROWCOUNT
    SELECT @dummy, * FROM #temp_table
    
  5. ==============================

    5.여기에 몇 가지 아이디어가 있습니다 :

    여기에 몇 가지 아이디어가 있습니다 :

  6. ==============================

    6.당신은 정말 처음으로 임시 테이블로 행을 선택하지 왜 행 수는, 선택 수와 SELECT 문을 사이에 변경됩니다 걱정하는 경우? 그런 식으로, 당신은 동기화 될 것입니다 알고있다.

    당신은 정말 처음으로 임시 테이블로 행을 선택하지 왜 행 수는, 선택 수와 SELECT 문을 사이에 변경됩니다 걱정하는 경우? 그런 식으로, 당신은 동기화 될 것입니다 알고있다.

  7. ==============================

    7.왜 당신은 벡터에 결과를 넣지 마십시오? 그 방법은 손 전에 크기를 알아야 할 필요가 없습니다.

    왜 당신은 벡터에 결과를 넣지 마십시오? 그 방법은 손 전에 크기를 알아야 할 필요가 없습니다.

  8. ==============================

    8.이 유형의 데이터를 처리하기위한 더 나은 패턴에 대해 생각 할 수 있습니다.

    이 유형의 데이터를 처리하기위한 더 나은 패턴에 대해 생각 할 수 있습니다.

    쿼리가 행을 반환하기 전에 반환 얼마나 많은 행 답이 변경 될 수 있으므로 어떤 자기 prespecting SQL 드라이버는 당신을 말할 것이다 (당신이 자신의 문제를 야기 트랜잭션을 사용하지 않는 한.)

    행의 수는 변경되지 않습니다 - ACID 및 SQL에 대한 구글.

  9. ==============================

    9.

    IF (@@ROWCOUNT > 0)
    BEGIN
    SELECT my_table.my_col
      FROM my_table
     WHERE my_table.foo = 'bar'
    END
    
  10. ==============================

    10.문제는이 질문에 대한 구글에서 최고의 결과이기 때문에 그냥이를 추가 할 수 있습니다. sqlite가 나는 행 개수를 얻기 위해 이것을 사용했다.

    문제는이 질문에 대한 구글에서 최고의 결과이기 때문에 그냥이를 추가 할 수 있습니다. sqlite가 나는 행 개수를 얻기 위해 이것을 사용했다.

    WITH temptable AS
      (SELECT one,two
       FROM
         (SELECT one, two
          FROM table3
          WHERE dimension=0
          UNION ALL SELECT one, two
          FROM table2
          WHERE dimension=0
          UNION ALL SELECT one, two
          FROM table1
          WHERE dimension=0)
       ORDER BY date DESC)
    SELECT *
    FROM temptable
    LEFT JOIN
      (SELECT count(*)/7 AS cnt,
                            0 AS bonus
       FROM temptable) counter
    WHERE 0 = counter.bonus
    
  11. from https://stackoverflow.com/questions/243782/need-a-row-count-after-select-statement-whats-the-optimal-sql-approach by cc-by-sa and MIT license