1

我正在寻找的是返回一些对行数的估计,而不是实际计数,这可能是一个昂贵的调用。类似于您在 google 搜索中看到的内容(... of about 1.000 rows)。

有一些开箱即用的解决方案吗?如果没有,一般的方法是什么?

我正在查询 Sql Server 2008 数据库。

编辑:为了澄清,结果计数与某些用户查询有关。例如,用户搜索“John”,结果应该是“大约有 1.280.000 行匹配 John”

4

6 回答 6

5

只是为现有建议添加一个通配符......

如果您的统计数据是最新的,一个可能的想法是从您的调用代码分析估计的执行计划(因此这里的限制是这涉及到 SQL 之外的代码来接收和分析 XML)

例如

SET SHOWPLAN_XML ON;
SELECT Something
FROM MyTable
WHERE SomeField = 'ABC123'

然后检查返回的 XML 以提取“EstimateRows”值。

于 2010-11-02T13:20:40.230 回答
1

很难说出你在问什么。如果您正在谈论从搜索算法返回一个数字,您可以从输入中计算一个哈希值,然后使用该哈希值映射到您每隔一段时间定期维护的计数。这可能会给您“大约”正确的结果,具体取决于散列的好坏以及更新计数的频率。

于 2010-11-02T13:07:01.397 回答
1

请看我上面的评论。但是,如果您发现计数操作特别昂贵,似乎确实有一种方法可以使用以下方法来近似行数:

SELECT rows FROM sysindexes WHERE id = OBJECT_ID('sometable') AND indid < 2

这是从位于此处的较早帖子中获取的:

count(*) 真的很贵吗?

于 2010-11-02T13:07:43.750 回答
1

一般的方法是随机抽取行样本来估计实际有多少行。例如,如果您的 id 是 UUID,那么您可以在 select 语句中执行过滤器,这将创建一个随机样本。因此,您可以只查看 id 以“f”开头的行。然后将计数乘以 16 以获得行数的估计值。不过,您需要为此创建一个索引才能快速。

于 2010-11-02T13:09:49.810 回答
1

与我的其他答案分开,因为这是一个完全不同的答案,您可以在 TSQL 中使用它......

另一种可能性是使用TABLESAMPLE子句仅查看指定数量(或百分比)的数据页,然后将其相乘。

例如

SELECT COUNT(*)
FROM MyTable TABLESAMPLE(50 PERCENT)
WHERE SomeField = 'ABC123'

需要调整样本量。我建议通读BOL 参考资料,因为它非常有用。

于 2010-11-02T13:40:45.413 回答
0

Vlejkoz,根据您的进一步更新,您似乎正在寻找一种通用的文本搜索算法,而不是我猜您当前昂贵的表查找和连接。

在 SQL Server 中,您有一个完整的框架,它被称为 Microsoft 全文搜索,并为您提供了额外的查询功能。这为您提供的搜索语法更像是传统的模糊风格的 Google 搜索,但针对您的特定数据库表进行了定制。

该主题有很多内容,因此最好看一下这篇介绍性文章,该文章似乎符合您的问题的类似要求:

微软全文搜索文章

于 2010-11-02T13:23:47.137 回答