我在一个表中有400万行数据,我运行这个查询
Select * from B
当我检查cpu使用情况时,这个查询会得到很高的cpu使用率。我的问题是如何在这个SQL查询中提高cpu使用率?
您是否有可能阅读一份包含400万行的报告<我当然不会。>
如果不是,为什么生成?
如果您出于备份目的而转储整个表,那么可能有更好的方法,具体针对您使用的DBMS。
如果不需要所有数据(甚至一次需要所有数据),那么任何可以用来限制输出内容的东西(例如限制行的where
子句和/或比select *
更具选择性的列选择)都会帮助您,正确的索引也会帮助您加快where
子句中的条件。这是,尤其是如果数据是"跨线"传输的,你不想在网络上发送不需要的千兆字节。
如果真的希望400万行中的所有列一次都是正常输出格式,那么性能就会受到影响。数据库提供了各种有效获取数据的方法,但如果你想要大量数据,它们无能为力
话虽如此,还是有办法减轻影响的,但这取决于你如何安排。例如:
- 复制您的数据库,将主副本用于其预期目的,并将从属副本用于报告。然后命中复制副本不会影响主副本
- 如果您可以执行多个较小的查询而不是一个较大的查询来获得相同的结果,那么这是有可能的。例如,一个查询获取2015年的所有记录,另一个查询在休息一段时间后获取2014年的记录,依此类推
这是我脑子里想不出来的两件事,毫无疑问还有其他事情,但在不了解更多细节的情况下,很难给出具体建议。
非常简单地减少生成的内容。
限制的选择
SELECT TOP (100) * FROM B
包括where子句
SELECT * FROM B WHERE COLA = XXX AND COLB = YYY
指定列
SELECT COLA, COLB, COLC, COLD FROM B WHERE COLA = XXX AND COLB = YYY
或者,如果必须返回所有400万行。
创建一个填充临时表的视图,并用它设置一个在"停机时间"、半夜等时间运行的作业,然后从临时表中选择