2009-07-24 6 views
0

테이블에 특정 항목에 대한 레코드가 있는지 확인하고 싶습니다. 나는 기록의 수를 확인하기 위해 COUNT(*)을 사용했고 그것을 작동 시켰습니다. 그러나 항목 레코드 수가 매우 많으면 페이지가 느리게로드됩니다.count (*)가 아닌 데이터베이스 테이블의 레코드 수를 확인하십시오.

제가 COUNT(*)이 문제를 일으키는 것 같지만, 레코드를 사용하지 않고 레코드가 있는지 어떻게 확인합니까? 난 단지 항목에 대한 레코드가 존재하는지 확인한 다음 일부 코드를 실행하기 만하면됩니다. 이를위한 대안을 찾도록 도와주세요.

도움 주셔서 감사합니다.

+2

시도하는 SQL을 게시 할 수 있습니까? 그것은 아마도 Count가 아니지만 문제를 일으키는 조인 또는 인덱스 일 가능성이 큽니다. –

+0

당신의 조인을 확인하십시오. 항상 잘 사용했습니다. 카운트 (*)의 대안은 SUM입니다 ([yourcondition] THEN 1 ELSE 0 END).하지만 카운트가 더 빨라야합니다. – RandomUs1r

답변

3

사용은 상위 1 선택하고 확인 당신은 주어진 조건에 대한 첫 번째 항목을 선택하려고 할 수있는 행

+0

대단히 감사합니다 .. !!! – ajithmanmu

3

이있다.

SELECT id FROM table WHERE <condition> LIMIT 1 

이 방법이 더 빠를 지 확신 할 수 없지만 시도해 볼 수는 있습니다.

다른 가능한 해결책. 어떻게 카운트를 사용합니까? COUNT(*)? 그렇다면 COUNT(id)을 사용해보십시오. 나는 이것이 더 빨라야한다는 것을 기억한다.

+1

카운트 (ID)를 사용하면 실제로 카운트 (*)보다 느려질 수 있으며, 동일하지 않습니다. count (*)를 사용하면 행의 수를 얻을 수 있지만 count (id)는 id의 null이 아닌 값의 수를 제공하므로 각 행의 값을 확인해야합니다. – Guffa

+0

'id'는 NULL이 될 수없는 기본 키라고 가정했습니다. 그러나 다른 경우에는 당신이 완전히 옳습니다. – czuk

+0

@Guffa : 'id'가 기본 키이거나 고유 키인 경우 괜찮습니다. null이 될 수 없기 때문입니다. 나는 SQL 구현이 이것을 파악할만큼 똑똑하다고 가정한다. – DisgruntledGoat

6

작동하는 방법에는 여러 가지가 있습니다.

if (select count(*) from (select top 1 * from ...)) > 0 
-1

당신이해야 :

if exists(select * from ...) 

당신은 데이터베이스가 첫 경기를 찾은 후 정지 할 수 있도록 상위 1을 사용할 수 있습니다 : 당신이 사용할 수있는 데이터베이스가 답을 얻을 수있는 방법을 최적화 할 수있는 존재 사용

SELECT COUNT (1) 당신이 말하는 경우

(*)에서 모든 열의를 확장 한 다음

계산됩니다
+0

오라클의 경우에는 그렇지 않습니다. – Randy

0

적어도 하나의 레코드가 테이블에 존재하는지보고 테스트를 권장합니다. 예를 들면 다음과 같습니다.

IF EXISTS 
(
    SELECT TOP 1 Table_Name --Or Your ColumnName 
    FROM INFORMATION_SCHEMA.Tables -- Or your TableName 
) 
BEGIN 
    PRINT 'At least one record exists in table' 
END 
+0

IF EXISTS 내부에서 톱 1이 필요 없습니다. IF EXISTS가 첫 번째 행을 찾으면 아주 좋습니다. –

0

이 코드는 codeproject에서 발견되었습니다. 아주 편리합니다.

-- Author,,Md. Marufuzzaman 

SELECT SYS_OBJ.NAME AS "TABLE NAME" 
    , SYS_INDX.ROWCNT AS "ROW COUNT" 
FROM SYSOBJECTS SYS_OBJ, SYSINDEXES SYS_INDX 

WHERE SYS_INDX.ID = SYS_OBJ.ID 
    AND INDID IN(0,1) --This specifies 'user' databases only 
    AND XTYPE = 'U' --This omits the diagrams table of the database 
--You may find other system tables will need to be ommitted, 
AND SYS_OBJ.NAME <> 'SYSDIAGRAMS' 

ORDER BY SYS_INDX.rowcnt DESC --I found it more useful to display 
--The following line adds up all the rowcount results and places 
--the final result into a separate column [below the first resulting table] 
COMPUTE SUM(SYS_INDX.ROWCNT) 

GO 
+0

이렇게하면 표에 행이 있는지 여부를 알 수 있습니다. 그러나 ** 특정 EntryID 값이나 이와 유사한 행이 있는지 여부는 ** NOT **입니다. –

관련 문제