2009-08-06 1 views
0

По этому вопросу, я ищу быстрый способ подсчитать количество записей в таблице без просмотра таблицы с тем, где состояниечто это самый быстрый способ получить запись таблицы подсчитывать с условием на SQL Server

+0

Не могли бы вы объяснить немного дальше, пожалуйста? Вы только что искали: select count (*) from tablename Возможно, с помощью «с (nolock)» –

+0

I ahve larga table, в которой мне нужно выбрать количество записей. Скажите выберите count (id) от пользователя, где active = 1 Я ищу способ подсчета записей без полного сканирования таблицы, я нашел несколько образцов, которые получают все счетчики записей из индексов sys, но не уверены, возможно с условием – nLL

+0

@nLL: вы должны отредактировать свой вопрос, чтобы добавить эту дополнительную информацию. –

ответ

2

Просто убедитесь, что ваш таблица правильно проиндексирована для условия where.

Если вы обеспокоены такого рода производительности подход заключается в создании индексов, которые включают поле в вопросе, например, если таблица содержит первичный ключ обув, а затем поля бар, попугай и кустарника и вы знаете, что вы собираетесь нужно тянуть обратно запись регулярно, используя условие на основе кустарника что просто нужны данные из этого поля вы должны создать соединение индекс [кустарника, Foo ]. Таким образом, rdbms должен запрашивать только индекс, а не таблицу. Индексы, являющиеся древовидными структурами, намного быстрее запрашивают, чем сама таблица.

Какова действительная активность, необходимая rdbms, зависит от самого rdbms и именно от той информации, которую она помещает в индекс. Например, выберите счетчик () * в неиндексированной таблице, не использующей условие where, которое будет в большинстве случаев возвращено большинству rdbms, поскольку количество записей будет удерживаться на уровне таблицы, а сканирование таблицы не требуется. Аналогичные соображения могут иметь место для доступа к индексу.

Помните, что индексы несут накладные расходы на обслуживание, поскольку при обновлении поля rdbms также должно обновлять все индексы, содержащие это поле. Это может быть или не быть критическим соображением, но нет ничего необычного в том, чтобы видеть таблицы, в которых читается большинство операций, а активность вставки/обновления/удаления имеет меньшее значение, которые сильно индексируются в различных комбинациях полей таблицы, так что большинство запросов будут просто использовать индексы и не касаться собственно данных таблицы.

ADDED: Если вы используете индексированный доступ к таблице, которая имеет значительную активность IUD, просто убедитесь, что вы планируете регулярное обслуживание. Древовидные структуры, т. Е. Индексы, наиболее эффективны при сбалансированном и значительном периодическом обслуживании активности UID, чтобы сохранить их таким образом.

+0

Спасибо. В моей таблице будет много активности вставки/удаления (около 50 к-60 кет в день), вы бы посоветовали вам тяжелый индекс? Я знаю, что вы объяснили во второй части своего ответа, но я не понимаю его (английский не мой родной язык) – nLL

+0

50-60k в день не много. За 24 часа 86400 секунд, так что 60 000, что меньше одного изменения в секунду (при условии, что это приложение используется равномерно в течение дня). Каковы часы пик? Есть ли время, когда приложение не используется? Не зная схему таблиц, шаблоны использования и т. Д., Говоря, что данный индекс хорош или нет, невозможно. Общая рекомендация: сохранить количество индексов на таблице до минимума и количество столбцов в этой таблице только для тех, которые необходимы. –

+0

@rangerchris - свести число индексов на столе к минимуму - к тому же, оно просто достигает наиболее эффективного набора индексов для любого конкретного набора обстоятельств, который является сложным битом, и этот минимум отнюдь не всегда 1 , – Cruachan

2

Существуют различные методы, наиболее надежным один является

Select count(*) from table_name 

Но кроме этого вы также можете использовать один из следующих

select sum(1) from table_name 

select count(1) from table_name 

select rows from sysindexes where object_name(id)='table_name' and indid<2 

exec sp_spaceused 'table_name' 

DBCC CHECKTABLE('table_name') 

Последние 2 необходимо sysindexes обновить, запустите для достижения этого, если вы не обновляете их, очень вероятно, что это даст вам неправильные результаты, но для приближения они могут действительно работать.

DBCC UPDATEUSAGE ('database_name','table_name') WITH COUNT_ROWS. 

EDIT: извините, я не читал часть о подсчете по определенному пункту. Я согласен с Cruachan, решение вашей проблемы - это правильные индексы.

2

Список следующих страниц 4 метода получения количества строк в таблице с комментариями о точности и скорости.

http://blogs.msdn.com/b/martijnh/archive/2010/07/15/sql-server-how-to-quickly-retrieve-accurate-row-count-for-table.aspx

Это один Management Studio использует:

SELECT CAST(p.rows AS float) 
FROM sys.tables AS tbl 
INNER JOIN sys.indexes AS idx ON idx.object_id = tbl.object_id and idx.index_id < 2 
INNER JOIN sys.partitions AS p ON p.object_id=CAST(tbl.object_id AS int) 
AND p.index_id=idx.index_id 
WHERE ((tbl.name=N'Transactions' 
AND SCHEMA_NAME(tbl.schema_id)='dbo')) 
Смежные вопросы