Sna*_*Doc 125 sql sql-server performance select count
正如标题所暗示的那样......我正在试图以最少的开销来找出最快的方法来确定表中是否存在记录.
示例查询:
SELECT COUNT(*) FROM products WHERE products.id = ?;
vs
SELECT COUNT(products.id) FROM products WHERE products.id = ?;
vs
SELECT products.id FROM products WHERE products.id = ?;
Run Code Online (Sandbox Code Playgroud)
假设?与'TB100'... 交换...第一个和第二个查询将返回完全相同的结果(例如... 1对于此对话).最后一个查询将按'TB100'预期返回,如果id表中没有,则不返回任何内容.
目的是弄清楚id表中是否有.如果没有,程序将接下来插入记录,如果是,程序将跳过它或基于该问题范围之外的其他程序逻辑执行UPDATE查询.
哪个更快,开销更少?(每个程序运行将重复数万次,并且每天将运行多次).
(通过M $提供的JDBC驱动程序从Java运行此M $ SQL Server查询)
Nen*_*vic 172
EXISTS(或NOT EXISTS)是专门用于检查是否存在某些东西,因此应该(并且是)最佳选择.它将在匹配的第一行停止,因此它不需要TOP子句,它实际上不会选择任何数据,因此列的大小没有开销.你可以安全地SELECT *在这里使用- 没有什么不同SELECT 1,SELECT NULL或者SELECT AnyColumn...... (你甚至可以使用无效的表达式SELECT 1/0,它不会破坏).
IF EXISTS (SELECT * FROM Products WHERE id = ?)
BEGIN
--do what you need if exists
END
ELSE
BEGIN
--do what needs to be done if not
END
Run Code Online (Sandbox Code Playgroud)
Dec*_*n_K 153
SELECT TOP 1 products.id FROM products WHERE products.id = ?; 将超越您的所有建议,因为它会在找到第一条记录后终止执行.
Age*_*SQL 21
什么都不能打败 -
SELECT TOP 1 1 FROM products WHERE id = 'some value';
Run Code Online (Sandbox Code Playgroud)
您无需计算表中是否有数据.并且在不需要时不要使用别名.
Kri*_*man 10
SELECT CASE WHEN EXISTS (SELECT TOP 1 *
FROM dbo.[YourTable]
WHERE [YourColumn] = [YourValue])
THEN CAST (1 AS BIT)
ELSE CAST (0 AS BIT) END
Run Code Online (Sandbox Code Playgroud)
这种方法为您返回一个布尔值.
你也可以使用
If EXISTS (SELECT 1 FROM dbo.T1 WHERE T1.Name='Scot')
BEGIN
--<Do something>
END
ELSE
BEGIN
--<Do something>
END
Run Code Online (Sandbox Code Playgroud)
下面是确定数据库中是否存在记录的最简单、最快的方法,好处是它适用于所有关系数据库
SELECT distinct 1 products.id FROM products WHERE products.id = ?;
Run Code Online (Sandbox Code Playgroud)
不要以为还没有人提到它,但是如果您确定数据在您下面不会发生变化,您可能还希望应用NoLock提示以确保读取时不会被阻塞。
SELECT CASE WHEN EXISTS (SELECT 1
FROM dbo.[YourTable] WITH (NOLOCK)
WHERE [YourColumn] = [YourValue])
THEN CAST (1 AS BIT)
ELSE CAST (0 AS BIT) END
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
389475 次 |
| 最近记录: |