从表中选择部分或全部记录的有效方法

达雷克

我有一个查询优化问题。假设有一个包含所有发票的表格。使用TVP(表值参数),我想通过提供1..n id来选择几条记录,或者通过提供一个值为-1的单个id来返回所有记录。

    DECLARE @InvoiceIdSet AS dbo.TBIGINT;
    INSERT INTO @InvoiceIdSet VALUES (1),(2),(3),(4)
    --INSERT INTO @InvoiceIdSet VALUES (-1)

    SELECT TOP 100
            I.Id ,
            Number ,
            DueDate ,
            IssuedDate ,
            Amount ,
            Test3
    FROM    dbo.Invoices I
    --WHERE   EXISTS ( SELECT NULL
    --                 FROM   @InvoiceIdSet
    --                 WHERE  I.Id = ID
    --                        OR ID = -1 )
    --CROSS APPLY @InvoiceIdSet s WHERE i.Id = s.ID OR s.ID = -1
    JOIN @InvoiceIdSet S ON S.ID = I.Id OR S.ID=-1

不管我使用哪种选择方法,查询都将非常有效地执行,直到我开始使用OR运算符为止,这时它开始需要很长时间才能返回几条记录,但是所有记录都将很快地返回。

任何指示和建议将不胜感激。

没有OR

与或

第一个计划没有OR,第二个计划带有OR。

更新:摆弄了不同的选项后,无论参数数量如何,我都认为该解决方案是性能最快的解决方案。

首先将UserDefinedTableType更改为包括主键索引:

CREATE TYPE [dbo].[TBIGINT] AS TABLE(
[ID] [bigint] NOT NULL PRIMARY KEY CLUSTERED
)

现在,select语句如下所示:

SELECT TOP 100
    I.Id ,
    Number ,
    DueDate ,
    IssuedDate ,
    Amount ,
    Test3
FROM    dbo.Invoices I
WHERE   I.ID IN ( SELECT    S.ID
              FROM      @InvoiceIdSet S
              WHERE     S.ID <> -1
              UNION ALL
              SELECT    S.ID
              FROM      dbo.Invoices S
              WHERE     EXISTS ( SELECT NULL
                                 FROM   @InvoiceIdSet
                                 WHERE  ID = -1 ) )

计划变得更大了,但是性能几乎是不变的,介于很少(第一个计划)和所有(第二个计划)记录之间。

很少记录

所有记录

如您所见,这些计划现在是相同的,并且在不到一秒的时间内从1M行返回了所需的记录。

我很想听听社区对此解决方案的看法。

感谢大家的帮助。

达雷克

我将在这里接受自己的回答:

DECLARE @InvoiceIdSet AS TBIGINT
--INSERT  INTO @InvoiceIdSet
--VALUES  ( 1 ),
--        ( 2 ),
--        ( 3 ),
--        ( 4 )
INSERT  INTO @InvoiceIdSet VALUES  ( -1 )

SELECT TOP 100
        I.Id ,
        Number ,
        DueDate ,
        IssuedDate ,
        Amount ,
        Test3
FROM    dbo.Invoices I
WHERE   I.ID IN ( SELECT    S.ID
                  FROM      @InvoiceIdSet S
                  WHERE     NOT EXISTS ( SELECT NULL
                                         FROM   @InvoiceIdSet
                                         WHERE  ID = -1 )
                  UNION ALL
                  SELECT    S.ID
                  FROM      dbo.Invoices S
                  WHERE     EXISTS ( SELECT NULL
                                     FROM   @InvoiceIdSet
                                     WHERE  ID = -1 ) )

它在所有和某些情况下都表现良好。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在Python中从大文件中选择部分记录的更有效方法

来自分类Dev

从PARTITION BY中选择行的更有效方法

来自分类Dev

在Excel文件中选择大量行的有效方法

来自分类Dev

从oracle数据库中选择许多记录的有效方法(或在短时间内)

来自分类Dev

如何从 SQL 表中选择部分记录

来自分类Dev

如何有效地从记录列表中选择特定的行号?

来自分类Dev

从表中选择其他表中最有效的方式

来自分类Dev

jQuery选择表行数据的有效方法

来自分类Dev

从Sqlite表中选择线元组并有效地对元组进行排序

来自分类Dev

从具有Z数量库存的Y列表中选择X的有效方法是什么?

来自分类Dev

从数据库中选择大量值的最有效方法

来自分类Dev

从排序数组中选择项目<值的有效方法

来自分类Dev

在A *搜索中选择/排序最佳节点的更有效方法是什么?

来自分类Dev

在OpenCV中选择图像的非矩形ROI的最有效方法是什么?

来自分类Dev

从火炬中的张量中选择性替换向量的有效方法

来自分类Dev

从数据库中选择大量值的最有效方法

来自分类Dev

在A *搜索中选择/排序最佳节点的更有效方法是什么?

来自分类Dev

在排序结果集中选择行数的有效方法(MySQL)

来自分类Dev

在Boost Graph Library中选择给定顶点的随机输入或输出邻居的有效方法?

来自分类Dev

从长(且合理)稀疏向量中选择随机元素的最有效方法是什么?

来自分类Dev

从 Scala 中的 Seq 中选择元素子集的有效方法

来自分类Dev

Pandas:使用多个条件从数据框中选择行的有效方法

来自分类Dev

如何找到有效记录的方法

来自分类Dev

Bash使用awk从文件中选择有效行

来自分类Dev

选择一个单词组成的记录的最有效方法

来自分类Dev

选择功能的更有效方法

来自分类Dev

一步就能清除选择并在KDE Dolphin中选择新项目的有效方法?

来自分类Dev

一步就能清除选择并在KDE Dolphin中选择新项目的有效方法?

来自分类Dev

在表触发器中记录更改的更有效方法

Related 相关文章

  1. 1

    在Python中从大文件中选择部分记录的更有效方法

  2. 2

    从PARTITION BY中选择行的更有效方法

  3. 3

    在Excel文件中选择大量行的有效方法

  4. 4

    从oracle数据库中选择许多记录的有效方法(或在短时间内)

  5. 5

    如何从 SQL 表中选择部分记录

  6. 6

    如何有效地从记录列表中选择特定的行号?

  7. 7

    从表中选择其他表中最有效的方式

  8. 8

    jQuery选择表行数据的有效方法

  9. 9

    从Sqlite表中选择线元组并有效地对元组进行排序

  10. 10

    从具有Z数量库存的Y列表中选择X的有效方法是什么?

  11. 11

    从数据库中选择大量值的最有效方法

  12. 12

    从排序数组中选择项目<值的有效方法

  13. 13

    在A *搜索中选择/排序最佳节点的更有效方法是什么?

  14. 14

    在OpenCV中选择图像的非矩形ROI的最有效方法是什么?

  15. 15

    从火炬中的张量中选择性替换向量的有效方法

  16. 16

    从数据库中选择大量值的最有效方法

  17. 17

    在A *搜索中选择/排序最佳节点的更有效方法是什么?

  18. 18

    在排序结果集中选择行数的有效方法(MySQL)

  19. 19

    在Boost Graph Library中选择给定顶点的随机输入或输出邻居的有效方法?

  20. 20

    从长(且合理)稀疏向量中选择随机元素的最有效方法是什么?

  21. 21

    从 Scala 中的 Seq 中选择元素子集的有效方法

  22. 22

    Pandas:使用多个条件从数据框中选择行的有效方法

  23. 23

    如何找到有效记录的方法

  24. 24

    Bash使用awk从文件中选择有效行

  25. 25

    选择一个单词组成的记录的最有效方法

  26. 26

    选择功能的更有效方法

  27. 27

    一步就能清除选择并在KDE Dolphin中选择新项目的有效方法?

  28. 28

    一步就能清除选择并在KDE Dolphin中选择新项目的有效方法?

  29. 29

    在表触发器中记录更改的更有效方法

热门标签

归档