MAX (someAttribute) или SELECT COUNT (*) FROM table_name в SQL Server? - PullRequest
1 голос
/ 05 мая 2011

У меня есть таблица с большим количеством строк (более 5,000,000,000), и я хочу получить точное количество строк, но так как в таблице есть атрибут с именем ID, например:

    ID              someAtt someAtt2  someAtt3  
-----------------------------------------------  
    1               32      DOWN      45
    ...
    ...
    (lots of rows)
    ...
    ...   
    5,000,000,000   25      MOVE      40

Какой лучший способ получить точное число (здесь 5 000 000 000)?используя max(ID) или SELECT COUNT(*) FROM table_name

Ответы [ 5 ]

2 голосов
/ 05 мая 2011

Если вы можете жить с потенциально немного устаревшим счетчиком, вы также можете просмотреть представления системного каталога в SQL Server.Особенно на такой большой таблице, как ваша, это значение будет получено значительно быстрее, чем на самом деле COUNT(*) на вашем столе, но оно может быть не точным на 100%:

SELECT 
    t.NAME AS TableName,
    p.rows AS RowCount
FROM 
    sys.tables t
INNER JOIN      
    sys.indexes i ON t.OBJECT_ID = i.object_id
INNER JOIN 
    sys.partitions p ON i.object_id = p.OBJECT_ID AND i.index_id = p.index_id
WHERE 
    t.NAME = 'YourLargeTableNameHere'
    AND i.index_id <= 1
2 голосов
/ 05 мая 2011

Используйте COUNT(*). MAX(ID) даст вам неточный счет, если строка будет удалена, а COUNT - нет. Если вы используете COUNT(*) вместо определенного имени столбца, сервер базы данных примет решение о том, какой столбец использовать для оптимизации операции.

1 голос
/ 05 мая 2011

Я бы, наверное, использовал COUNT (*) - см. Ответ Кена Уайта по причинам.

Если мне нужна альтернатива, я рассмотрю вопрос об обновлении статистики и использовании количества строк, указанных на этой странице Хаки SQL .

По причинам, предложенным другими (пробелы в последовательности идентификаторов), я бы не использовал MAX (ID)), также это могло бы привести к полному сканированию таблицы, как мог бы делать счетчик (*), но безпреимущество точности.

1 голос
/ 05 мая 2011

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

1 голос
/ 05 мая 2011

Попробуйте оба варианта и сравните производительность, но я бы по умолчанию выбрал метод COUNT, так как он более очевиден и вряд ли когда-нибудь даст неправильный результат.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...