我遇到的文章表明,SELECT COUNT(*) FROM TABLE_NAME当表有很多行和很多列时会很慢.
我有一个表可能包含数十亿行[它有大约15列].有没有更好的方法来获得表的行数的精确计数?
请在回答之前考虑以下事项:
我正在寻找独立于数据库供应商的解决方案.如果它涵盖MySQL,Oracle,MS SQL Server,那就没关系.但如果确实没有数据库供应商独立解决方案,那么我将为不同的数据库供应商寻求不同的解决方案.
我不能使用任何其他外部工具来做到这一点.我主要是在寻找基于SQL的解决方案.
我无法进一步规范我的数据库设计.它已经在3NF,而且已经编写了很多代码.
我经常发现这三种变体:
SELECT COUNT(*) FROM Foo;
SELECT COUNT(1) FROM Foo;
SELECT COUNT(PrimaryKey) FROM Foo;
Run Code Online (Sandbox Code Playgroud)
据我所知,他们都做同样的事情,我发现自己在我的代码库中使用了三个.但是,我不喜欢以不同的方式做同样的事情.我应该坚持哪一个?他们中的任何一个比其他两个更好吗?
我有一个名为"posts"的SQL表,如下所示:
id | category
-----------------------
1 | 3
2 | 1
3 | 4
4 | 2
5 | 1
6 | 1
7 | 2
Run Code Online (Sandbox Code Playgroud)
每个类别编号对应一个类别.我如何计算每个类别在一个SQL查询中出现在帖子上的次数?
例如,这样的查询可能会返回一个符号数组,如下所示: (1:3, 2:2, 3:1, 4:1)
我当前的方法是对每个可能的类别使用查询,例如:SELECT COUNT(*) AS num FROM posts WHERE category=#,然后将返回值组合成最终数组.但是,我正在寻找一种只使用一个查询的解决方案.
我见过很多关于以下内容的查询.
Select 1
From table
Run Code Online (Sandbox Code Playgroud)
这是什么1意思,它将如何执行,它将返回什么?
此外,在什么类型的场景中,可以使用它吗?
是否有所作为,如果你这样做count(*)VS count(column-name)在这两个例子?
我倾向于总是写作,count(*)因为它似乎更符合我的想法,它是一个集合函数,如果这是有道理的.
但我不确定它是否在技术上最好,因为我倾向于看到没有*经常写的示例代码.
计数(*):
select customerid, count(*), sum(price)
from items_ordered
group by customerid
having count(*) > 1;
Run Code Online (Sandbox Code Playgroud)
与count(列名):
SELECT customerid, count(customerid), sum(price)
FROM items_ordered
GROUP BY customerid
HAVING count(customerid) > 1;
Run Code Online (Sandbox Code Playgroud) 我以前写这样的EXISTS检查:
IF EXISTS (SELECT * FROM TABLE WHERE Columns=@Filters)
BEGIN
UPDATE TABLE SET ColumnsX=ValuesX WHERE Where Columns=@Filters
END
Run Code Online (Sandbox Code Playgroud)
前一个DBA中的一个告诉我,当我做一个EXISTS条款时,请使用SELECT 1而不是SELECT *
IF EXISTS (SELECT 1 FROM TABLE WHERE Columns=@Filters)
BEGIN
UPDATE TABLE SET ColumnsX=ValuesX WHERE Columns=@Filters
END
Run Code Online (Sandbox Code Playgroud)
这真的有所作为吗?
我一直向我的开发者讲道,这SELECT *是邪恶的,应该像瘟疫一样避免.
有什么理由可以说是合理的吗?
我不是在谈论COUNT(*)- 大多数优化者都可以解决这个问题.
编辑
我在谈论生产代码.
我看到这个不好的做法的一个很好的例子是select *在存储过程中使用的传统asp应用程序,用于ADO循环返回的记录,但是通过索引得到列.您可以想象在字段列表末尾之外的某处添加新字段时发生的情况.
我看了一些文章,但真的不明白select 1 from做了什么?有人说"你应该用而不是select *".这是一个exapmle表:
cust_id cust_name cust_address
1000000001 Village Toys Mapl
1000000002 Kids Place South
1000000003 Fun4All Sunny
1000000004 Fun4All Riverside
1000000005 The Toy Store 53rd
Run Code Online (Sandbox Code Playgroud)
当我写下select 1 from customer_table这句话的内容时,结果会是什么?
相关(SQL Server): 计数(*)与计数(1)
你能告诉我性能有哪些(MySQL)吗?算(*)还是算(1)?
假设表中存在主要字段"id"(如速度等),以下查询之间是否存在差异?
SELECT COUNT(id)
FROM table
Run Code Online (Sandbox Code Playgroud)
与
SELECT COUNT(*)
FROM table
Run Code Online (Sandbox Code Playgroud)