|
|
导航: |
论坛 -> 数据库专区
斑竹:liumazi,waterstone |
|
作者: |
dalas (dalas) |
★☆☆☆☆ |
-
|
普通会员 |
|
2021/11/10 19:48:20 |
标题: |
|
加入我的收藏 |
楼主: |
用过SMSS的都知道 select * from 表名 查询大量数据时,SMSS 会一边执行脚本,一边将结果加载到返回结果列表,这个功能如何实现?
----------------------------------------------
- |
作者: |
|
2021/11/10 20:15:13 |
1楼: |
自己分页嘛。
----------------------------------------------
-
|
作者: |
dalas (dalas) |
★☆☆☆☆ |
-
|
普通会员 |
|
2021/11/11 23:03:19 |
2楼: |
怎么分页啊?不懂
----------------------------------------------
-
|
作者: |
|
2021/11/11 23:46:05 |
3楼: |
用FireDAC的TFDQuery默认就是一边执行一边加载,默认一次加载50条记录,你NEXT到第51条则自动加载第51-100条记录,全透明操作
----------------------------------------------
-
|
作者: |
|
2021/11/12 0:19:28 |
4楼: |
楼上说的,准确的说应该是SQL已经查询完成(服务端已选出数据),返回时候可以设置批量条数的意思?
SQL查询没完成之前应该是没有数据生成的吧……
----------------------------------------------
Bye bye DDRFAN...
|
作者: |
|
2021/11/12 8:47:51 |
5楼: |
你是担心查询执行时间过长,第一批数据获取的等待时间过长吧
这个要看你有没有用到排序或者分组了,如果你用到这些东西,那从第一条记录开始,就必须遍历所有数据才能得到,这种肯定无解
但如果是你顶楼所说,只是一个select *的话,第一批记录毫无疑问是瞬间返回的,服务器能响应你没理由拖着数据不发。
----------------------------------------------
-
|
作者: |
|
2021/11/12 10:47:11 |
6楼: |
是的,如果查询本身很简单,那么立即就会返回数据。
我做的业务方面经常有查大量用户+订购+业务一类的查询。 耗时可能上小时,甚至一整天(美队:有被冒犯到……)
我主要是针对楼主的问题说,SQL查询和返回数据是两个阶段。 强调SQL查询没完成时是无法返回数据的,所以不能一边查询一边返回数据。 查询完成返回数据阶段当然可以分页,设批量条数等。
查询本身慢,只能优化SQL,最基本的就是优化SQL逻辑,用索引,并行等。 SQL没问题数据量太大了也没办法,即使只有500万用户,有时因为比较独特的查询结果要求,也会很慢。。。所以有时不能写复杂的SQL,不如几个表都单表select出来再程序内部处理还快得多……哎,不过不在这里的讨论范围中。
----------------------------------------------
Bye bye DDRFAN...
|
作者: |
|
2021/11/12 10:48:54 |
7楼: |
所以总结楼主的问题:select * from 表名。 其实服务器段并没有一边执行SQL一边返回数据。
SQL是瞬间执行完成了的,数据再慢慢的返回。
----------------------------------------------
Bye bye DDRFAN...
|
作者: |
|
2021/11/12 12:28:02 |
8楼: |
FireDAC 和 UniDAC 都可以实现,FireDAC 默认就启用的,UniDAC 改 FetchAll = False。
----------------------------------------------
-
|
作者: |
|
2021/11/12 18:27:56 |
9楼: |
查询和返回并不是串行的两个阶段,它们是并行的
只要服务器确定了第一条记录的内容,它就会立即将这条记录发送给你,不会迟疑,你不用担心数据库故意卡住你
卡住的情况只可能是因为你的查询从第一条记录开始就必须遍历太多的数据才能得到结果
----------------------------------------------
-
|
作者: |
|
2021/11/12 22:17:03 |
10楼: |
后端支持分页,前端也能根据控件的状态比如滚动到了表格底部,自动拉取下一页的数据并自动填充即可。
----------------------------------------------
delphi|vue|golang hnysoft|hnyerp+mes+srm
|
作者: |
|
2021/11/13 0:26:39 |
11楼: |
综合楼上各位:
1. select 语句的写法很重要,如何利用索引也很重要。否则一个 select 语句要执行很久才有结果,那就没办法;
2. 如果 select 语句执行的瞬间就有第一条数据,接下来的问题就是数据库客户端,比如 FireDAC 本身如何分页的问题了。比如8楼提到的 FetchAll = False 。
3. 10楼提到的滚动到表格底部,自动拉取下一页,这个其实是数据已经到了 FireDAC 这个数据库客户端的内存里面以后,才会有的。前提是数据库服务器的 select 语句已经执行到有结果出现。
----------------------------------------------
-
|
|