确定记录是否存在的最快方法

时间:2013-08-07 21:51:33

标签: 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 = ?;

假设?'TB100'交换...第一个和第二个查询都会返回完全相同的结果(例如... 1用于此对话)。最后一个查询将按预期返回'TB100',如果表中不存在id,则不返回任何内容。

目的是弄清楚id是否在表中。如果没有,程序将接下来插入记录,如果是,程序将跳过它或基于该问题范围之外的其他程序逻辑执行UPDATE查询。

哪个更快,开销更少? (每个程序运行将重复数万次,并且每天将运行多次)。

(通过M $提供的JDBC驱动程序从Java运行此M $ SQL Server查询)

14 个答案:

答案 0 :(得分:164)

EXISTS(或NOT EXISTS)专门用于检查是否存在某些内容,因此应该是(也是)最佳选择。它将在匹配的第一行停止,因此它不需要TOP子句,并且它实际上不会选择任何数据,因此列的大小没有开销。您可以在此处安全使用SELECT * - 与SELECT 1SELECT NULLSELECT AnyColumn ... (you can even use invalid expression like SELECT 1/0 and it will not break)完全不同。

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

答案 1 :(得分:143)

SELECT TOP 1 products.id FROM products WHERE products.id = ?;将胜过您的所有建议,因为它会在找到第一条记录后终止执行。

答案 2 :(得分:20)

没有什么可以击败 -

SELECT TOP 1 1 FROM products WHERE id = 'some value';

您无需计算表中是否有数据。并且在不需要时不要使用别名。

答案 3 :(得分: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

这种方法为你返回一个布尔值。

答案 4 :(得分:8)

您也可以使用

 If EXISTS (SELECT 1 FROM dbo.T1 WHERE T1.Name='Scot')
    BEGIN
         --<Do something>
    END 

ELSE    
     BEGIN
       --<Do something>
     END

答案 5 :(得分:5)

不要认为有人提到过它,但是如果您确定数据不会在您下面发生变化,您可能还想要应用NoLock提示以确保在阅读时不会阻止它。 / p>

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

答案 6 :(得分:3)

SELECT COUNT(*) FROM products WHERE products.id = ?;

这是适用于所有数据库的跨关系数据库解决方案。

答案 7 :(得分:2)

以下是确定数据库中是否存在记录的最简单,最快捷的方法 好的是它适用于所有Relational DB的

     $http.post('api/NCT_UsersLogin/', credentials).success(function (response) { 
      //if your response status is success then redirect to another page using 
        $state.go('/home');
     });

答案 8 :(得分:0)

create or replace procedure ex(j in number) as
i number;
begin
select id into i from student where id=j;
if i is not null then
dbms_output.put_line('exists');
end if;
exception
   when no_data_found then
        dbms_output.put_line(i||' does not exists');

end;

答案 9 :(得分:0)

我过去曾经使用过它,它不需要全表扫描来查看是否存在某些内容。它超级快......

UPDATE TableName SET column=value WHERE column=value
IF @@ROWCOUNT=0
BEGIN
     --Do work
END             

答案 10 :(得分:0)

对于那些来自MySQL或Oracle背景的人 - MySQL支持LIMIT子句选择有限数量的记录,而Oracle使用ROWNUM。

答案 11 :(得分:0)

对于 MySql,您可以使用如下所示的 LIMIT(示例在 PHP 中显示)

  $sql = "SELECT column_name FROM table_name WHERE column_name = 'your_value' LIMIT 1";
  $result = $conn->query($sql);
  if ($result -> num_rows > 0) {
      echo "Value exists" ;
  } else {
      echo "Value not found";
  }

答案 12 :(得分:0)

SQL SERVER 2012+

SELECT IIF((SELECT TOP 1 1 FROM dbo.[YourTable] WHERE [YourColumn] = [YourValue]) IS NULL, 0, 1)

答案 13 :(得分:0)

为什么不简单地使用

SELECT EXISTS (SELECT 1 FROM products WHERE products.id = ?)