sys*_*out 186 sql optimization query-optimization
阅读一些SQL Tuning文档我发现了这个:
Select count(*):
- 计算行数
- 通常不正确地用于验证记录的存在
是否Select count(*)真的如此糟糕?
验证记录存在的正确方法是什么?
Mar*_*onk 226
最好使用以下任一方法:
-- Method 1.
SELECT 1
FROM table_name
WHERE unique_key = value;
-- Method 2.
SELECT COUNT(1)
FROM table_name
WHERE unique_key = value;
Run Code Online (Sandbox Code Playgroud)
第一个替代方案应该没有结果或一个结果,第二个计数应该是零或一个.
您使用的文档多大了?虽然你已经阅读了很好的建议,但是最近RDBMS中的大多数查询优化器都是优化SELECT COUNT(*)的,所以虽然理论上(和旧数据库)存在差异,但你不应该注意到实践中的任何差异.
Pav*_*yuk 179
我宁愿不使用Count函数:
IF [NOT] EXISTS ( SELECT 1 FROM MyTable WHERE ... )
<do smth>
Run Code Online (Sandbox Code Playgroud)
例如,如果要在将用户插入数据库之前检查用户是否存在,则查询可能如下所示:
IF NOT EXISTS ( SELECT 1 FROM Users WHERE FirstName = 'John' AND LastName = 'Smith' )
BEGIN
INSERT INTO Users (FirstName, LastName) VALUES ('John', 'Smith')
END
Run Code Online (Sandbox Code Playgroud)
Căt*_*tiș 18
您可以使用:
SELECT 1 FROM MyTable WHERE <MyCondition>
Run Code Online (Sandbox Code Playgroud)
如果没有匹配条件的记录,则结果记录集为空.
您可以使用:
SELECT COUNT(1) FROM MyTable WHERE ...
Run Code Online (Sandbox Code Playgroud)
要么
WHERE [NOT] EXISTS
( SELECT 1 FROM MyTable WHERE ... )
Run Code Online (Sandbox Code Playgroud)
这比SELECT *你只是为每一行选择值1而不是所有字段更有效.
COUNT(*)和COUNT(列名)之间也存在细微差别:
COUNT(*) 将计算所有行,包括空值COUNT(column name)将仅计算列名称的非空出现次数小智 9
SELECT COUNT(1) FROM MyTable WHERE ...
Run Code Online (Sandbox Code Playgroud)
将循环通过所有记录.这就是记录存在使用不好的原因.
我会用
SELECT TOP 1 * FROM MyTable WHERE ...
Run Code Online (Sandbox Code Playgroud)
找到1条记录后,它将终止循环.
小智 7
您可以使用:
SELECT 1 FROM MyTable WHERE... LIMIT 1
Run Code Online (Sandbox Code Playgroud)
使用select 1以避免不必要的字段的检查.
使用LIMIT 1 以避免不必要的行的检查.
| 归档时间: |
|
| 查看次数: |
348631 次 |
| 最近记录: |