【发布时间】:2021-07-08 16:43:21
【问题描述】:
我有一个非常大的表格,其中有一列包含日期。由于表格太大,我想请求数据,例如每天,我都在尝试使用以下语句:
SELECT *
FROM [my_db].[dbo].[my_data] where date between '2019-03-25' and '2019-03-26'
到目前为止一切顺利,当我运行此查询时,将返回相关数据(大约 10,000 行)。但是,查询并没有停止,它会持续执行很长时间(看不到多长时间,我总是在大约 30 分钟后停止)。 我认为它正在检查更合适的日期。但是,表格已排序,所以我知道不会有更多日期了。
在这里处理这个问题的最佳方法是什么?在没有找到进一步的结果后,有没有办法设置某种超时?还是我应该只使用正常的超时时间并希望交易及时完成?谢谢!
【问题讨论】:
-
the table is sorted,没有这样的东西。表中没有隐含的顺序。除非使用 ORDER BY 子句,否则不能保证结果顺序。没关系。查询性能受索引影响,而不是物理排序顺序。桌子有多大?date是否已编入索引?如果没有,服务器将不得不扫描整个表,因为没有保证最后不会有匹配的行 -
无论如何,当笔记本电脑可以轻松运行具有多 GB 表的数据库时,
large意味着数十亿行。对于需要 30 分钟的查询,date未编入索引或这不是真正的查询,并且其他条件会强制进行全表扫描。 10K 行是 no 数据 -
这意味着该字段没有被索引。它必须被索引。没有其他方法可以加速查询。没有“可能”,没有索引,服务器不知道该字段中的内容,因此它必须检查所有值。
-
建立索引后,您可以使用多种技术来进一步提高性能。压缩表可以减少磁盘 IO,从而提高性能。数据库服务器的主要延迟是从磁盘读取,而不是从 CPU 读取,因此压缩提供了明显的好处。它也是透明的,这意味着您不必修改查询和应用程序
-
另一种获取表中总行数的方法是在 SQL Management Studio 中打开表的“属性”窗口,然后查看“存储”页面。属性 Row count 显示总行数
标签: sql sql-server bigdata