我们要首先检查表行数,然后根据行数决定应该做什么。因为我们有一个逻辑,如果表行数超过一定数量,我们将尝试不同的逻辑。
SELECT COUNT(*) FROM Table1.
最简单,但如果桌子很大,它可能会非常昂贵。 所以我们尝试遵循 Oracle 中的逻辑
SELECT COUNT(*) FROM Table1 WHERE ROWNUM <= 1000000;
如果上面的查询返回 1000000,那么我们就知道这个表大于 1000,000。那么我们将使用不同的方式来处理它。 现在我们也希望 SQL Server 具有类似的逻辑,但我没有看到任何简单的方法来做到这一点。 SQL Server 提供了 TOP 语句,但它的工作方式并不像下面这样:
SELECT COUNT( TOP 1000000 *) FROM Table1
有人知道吗?
如果您坚持避免使用元数据表,则可以在子选择中使用
TOP N
选项,如下所示:
DECLARE @RowCountLimited INT = (
SELECT COUNT(*)
FROM (
SELECT TOP 101 *
FROM TableA
) S
)
SELECT @RowCountLimited
您也可以将
EXISTS()
与 ORDER BY ... OFFSET ... FETCH ...
语法一起使用。这需要一个ORDER BY
,但是如果您选择索引列或PK,则计划中不会生成排序操作。
DECLARE @RowCountIsMoreThan100 BIT = CASE WHEN EXISTS (
SELECT *
FROM TableB
WHERE IsActive = 1
ORDER BY IsActive
OFFSET 100 ROWS FETCH NEXT 1 ROWS ONLY
) THEN 1 ELSE 0 END
SELECT @RowCountIsMoreThan100
以上任一条件都可以包含
WHERE
条件。
请参阅 this db<>fiddle 以获取演示,其中的执行计划显示实际仅读取有限数量的行。