2009-07-24 2 views
0

Я хочу проверить, есть ли записи в таблице для определенной записи. Я использовал COUNT(*), чтобы проверить количество записей и заставить его работать. Однако, когда количество записей для записи очень велико, моя страница медленно загружается.Проверить количество записей в таблице базы данных, кроме count (*)

Я думаю, COUNT(*) вызывает проблему, но как проверить, существуют ли записи без использования? Я только хочу проверить, существуют ли какие-либо записи для записи, а затем выполнить некоторый код. Пожалуйста, помогите мне найти альтернативное решение для этого.

Спасибо за любую помощь.

+2

Можете ли вы разместить SQL, который вы пытаетесь. Скорее всего, это не граф, а скорее ваши объединения или индексы, вызывающие проблемы. –

+0

Согласен, проверьте свои соединения, я всегда использовал его в порядке, альтернатива count (*) - это SUM (случай, когда [ваше условие] THEN 1 ELSE 0 END), но счет должен быть быстрее. – RandomUs1r

ответ

3

использование выбрать топ 1 и проверка есть ряд

+0

Большое спасибо .. !!! – ajithmanmu

3

Вы можете попытаться выбрать первую запись для данного состояния.

SELECT id FROM table WHERE <condition> LIMIT 1 

Я не уверен, что это будет быстрее, но вы можете попробовать.

Другое возможное решение. Как вы используете счет? COUNT(*)? Если да, попробуйте использовать COUNT(id). Насколько я помню, это должно быть быстрее.

+1

Использование count (id) может быть на самом деле медленнее, чем count (*), и они не работают одинаково. Использование count (*) дает вам количество строк, но count (id) дает вам количество ненулевых значений id, поэтому он должен проверять значение каждой строки. – Guffa

+0

Я предположил, что 'id' является первичным ключом, который не может быть NULL. Но в другом случае вы совершенно правы. – czuk

+0

@ Guffa: это нормально, если 'id' является основным или уникальным ключом, хотя он не может быть нулевым. Я предполагаю, что реализации SQL достаточно умны, чтобы понять это. – DisgruntledGoat

6

Существует несколько способов, которые могут сработать. Вы можете использовать существует, которая позволяет базы данных оптимизировать метод, чтобы получить ответ:

if exists(select * from ...) 

Вы можете использовать верхнюю 1 так, что база данных может остановить после нахождения первого матча:

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

вы должны использовать

выберите кол (1) от

Если вы говорите (*) она будет расширяться все колонки, а затем рассчитывать

+0

, конечно, не верно для Oracle. – Randy

0

Я бы рекомендовал тестирование, чтобы увидеть, существует ли по крайней мере 1 запись в таблице, соответствующая вашим критериям, а затем продолжить соответственно. Например:

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

Нет необходимости в вершине 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

Это дает вам представление о том, существуют ли какие-либо строки в таблице или нет, но ** NOT ** есть ли какие-либо строки с определенным значением EntryID или что-то в этом роде. –

Смежные вопросы