2020-08-13 16:05发布
加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)
你好,
通常可以使用:
从x = y的选项卡中选择单个*。
但是,关于性能,我认为 其他一些更好的命令...
任何想法吗?
tks。
我喜欢
从dbtab中最多选择1个count(*),其中field = value。
对我来说似乎很合理。
现在可以从ABAP 7.4中获得
从x = y的标签中选择单个*。
你好
如果您的数据库将表数据存储在B树中,则可以这样做并从中受益,
您已经选择了可能需要的数据。
如果您有没有索引组织表的ORACLE,并且不需要数据,但是
只需确认记录存在,
从选项卡中选择only_key_fields,其中x = y
会更快,因为您保存了数据块提取。
如果您的PK的高度为2或3,则表示"获得"的收益为33%或25%,
如果可能需要的表块访存可能涉及物理读取,则可能会更多。
Volker
注意,测量结果取决于缓冲和索引。 特别是,像其他聚合SELECT一样,SELECT COUNT(*)会绕过可能不希望的缓冲区! 除此之外,正如Hermann Gahm已经指出的那样,我们的客户使用的数据库之间似乎存在显着差异。
我最喜欢的模式是SELECT SINGLE [...]。
为了"验证"这是否真的是一个好选择,我比较了三种不同情况下的几种策略:
a)大型无缓冲表,其中子句仅指定键的一部分
b)大表,具有单记录缓冲,并且在哪里指定完整键
c)相同的大表,具有单记录缓冲,而子句仅指定键的一部分
我的测量在HANA和MaxDB的7.40系统中运行。 独立于数据库,结果之间的定量关系相似,证实了我的最爱是一个不错的选择。 特别要注意的是,在第二个示例中,SELECT COUNT看起来有多糟糕,否则表缓冲可以节省大量时间!
>>>完全无缓冲表<<<
SELECT * FROM sbook INTO sbook_line WHERE carrid ='LH'。 EXIT。 ENDSELECT。执行500次的持续时间(秒):43,8334260
从最多1个行中选择COUNT(*)其中carrid ='LH'。 500次执行的持续时间(秒):0,7393800
SELECT * FROM sbook INTO sbook_line 最多1个行其中carrid ='LH'。 ENDSELECT。 500次执行的持续时间(以秒为单位):0,7619870
SELECT carrid从Sbook进入carrid 最多1个行其中carrid ='LH'。 ENDSELECT。 500次执行的持续时间(以秒为单位):0,5869470
从sbook到carrid中选择单个carrid WHERE carrid ='LH'。 500次执行的持续时间(秒):0,6001700
>>>具有完整键<<<
SELECT * FROM tadir INTO tadir_line 哪里pgmid ='R3TR' AND object ='PROG' AND obj_name = sy-cprog。退出。 ENDSELECT。 500次执行的持续时间(以秒为单位):0,0103200
从tadir到1行选择COUNT(*) pgmid ='R3TR' AND object ='PROG' AND obj_name = sy-cprog。
500次执行的持续时间(以秒为单位):0,6242380
SELECT *从tadir到tadir_line 最多1个行 pgmid ='R3TR' AND object ='PROG' AND obj_name = sy-cprog。 ENDSELECT。< br> 500次执行的持续时间(以秒为单位):0,0103680
从tadir到pgmid的SELECT pgmid 最多到1行 pgmid ='R3TR' AND object ='PROG' AND obj_name = sy-cprog。 ENDSELECT。< br> 500次执行的持续时间(以秒为单位):0,0103690
从tadir到pgmid中选择单个pgmid 哪里pgmid ='R3TR' AND object ='PROG' AND obj_name = sy-cprog。 500次执行的持续时间以秒为单位:0, 0097770
>>>具有不完整键<<<
SELECT * FROM tadir INTO tadir_line 哪里pgmid ='R3TR' AND object ='PROG'。退出。 ENDSELECT。持续500秒的持续时间:25, 2490160
从tadir到1行之间选择COUNT(*)哪里pgmid ='R3TR' AND object ='PROG'。 500次执行的持续时间(以秒为单位):1,4555210
SELECT *从tadir到tadir_line 最多1个行 pgmid ='R3TR' AND object ='PROG'。 ENDSELECT。持续500秒的持续时间: 1,6207910
SELECT pgmid从tadir到pgmid 最多到1行 pgmid ='R3TR' AND object ='PROG'。 ENDSELECT。持续500秒的持续时间: 1,5180330
从tadir到pgmid中选择单个pgmid 哪里pgmid ='R3TR' AND object ='PROG'。 500次执行的持续时间(以秒为单位):1,2033210
Rob
此消息已被审核。
我们有一条通用规则: *非缓冲表:
从...其中选择单个计数(*)...
*缓冲表:
从...其中选择一个<1字段> ...
至少在我们的环境中,这是最快的方法。
您可以使用此示例程序来检查两种可能性的运行时间:
*&--------------------------------------------- ------------------------ * *&报告Z_COMPARE_RUNTIME *&*&----------------- -------------------------------------------------- -* *&*&*&----------------------------------------- ---------------------------- *报告z_compare_runtime。 数据:g_start类型i,g_stop类型i,g_count类型i,g_single类型i。 参数:p_do类型i默认值为1000。选择开始。 做p_do次。 获取运行时字段g_start。 执行select_single。 获取运行时间字段g_stop。 g_single = g_single + g_stop-g_start。 获取运行时字段g_start。 执行select_count。 获取运行时间字段g_stop。 g_count = g_count + g_stop-g_start。 ENDDO。 g_single = g_single/p_do。 g_count = g_count/p_do。 写:p_do,"执行-平均运行时间:"。 写:/'选择单身:',g_single。 写:/'选择计数:',g_count。 *&------------------------------------------------ --------------------- * *&形成select_single *&---------------------- ----------------------------------------------- * *文字 * ------------------------------------------------- --------------------- * FORM select_single。 *数据:l_obj_name类型tadir-obj_name。 * *选择单个obj_name *从tadir * INTO l_obj_name *在pgmid ='R3TR'。 数据:l_name TYPE trdir-name。 从trdir INTO l_name中选择单个名称,其中name ='Z_COMPARE_RUNTIME'。 ENDFORM。 " select_single *&---------------------------------------------- ----------------------- * *&形成select_count *&-------------------- ------------------------------------------------- * *文字* ----------------------------------------------- ----------------------- * FORM select_count。* SELECT SINGLE COUNT(*)* FROM tadir * WHERE pgmid ='R3TR'。SELECT SINGLE COUNT(* )FROM trdir WHERE name ='Z_COMPARE_RUNTIME'。ENDFORM。" select_count
最多设置5个标签!
我喜欢
对我来说似乎很合理。
现在可以从ABAP 7.4中获得
你好
如果您的数据库将表数据存储在B树中,则可以这样做并从中受益,
您已经选择了可能需要的数据。
如果您有没有索引组织表的ORACLE,并且不需要数据,但是
只需确认记录存在,
会更快,因为您保存了数据块提取。
如果您的PK的高度为2或3,则表示"获得"的收益为33%或25%,
如果可能需要的表块访存可能涉及物理读取,则可能会更多。
Volker
注意,测量结果取决于缓冲和索引。 特别是,像其他聚合SELECT一样,SELECT COUNT(*)会绕过可能不希望的缓冲区! 除此之外,正如Hermann Gahm已经指出的那样,我们的客户使用的数据库之间似乎存在显着差异。
我最喜欢的模式是SELECT SINGLE [...]。
为了"验证"这是否真的是一个好选择,我比较了三种不同情况下的几种策略:
a)大型无缓冲表,其中子句仅指定键的一部分
b)大表,具有单记录缓冲,并且在哪里指定完整键
c)相同的大表,具有单记录缓冲,而子句仅指定键的一部分
我的测量在HANA和MaxDB的7.40系统中运行。 独立于数据库,结果之间的定量关系相似,证实了我的最爱是一个不错的选择。 特别要注意的是,在第二个示例中,SELECT COUNT看起来有多糟糕,否则表缓冲可以节省大量时间!
>>>完全无缓冲表<<<
的存在检查SELECT * FROM sbook INTO sbook_line
WHERE carrid ='LH'。
EXIT。
ENDSELECT。
执行500次的持续时间(秒):43,8334260
从最多1个行中选择COUNT(*)
其中carrid ='LH'。
500次执行的持续时间(秒):0,7393800
SELECT * FROM sbook INTO sbook_line
最多1个行
其中carrid ='LH'。
ENDSELECT。
500次执行的持续时间(以秒为单位):0,7619870
SELECT carrid从Sbook进入carrid
最多1个行
其中carrid ='LH'。
ENDSELECT。
500次执行的持续时间(以秒为单位):0,5869470
从sbook到carrid中选择单个carrid
WHERE carrid ='LH'。
500次执行的持续时间(秒):0,6001700
>>>具有完整键<<<
SELECT * FROM tadir INTO tadir_line
哪里pgmid ='R3TR'
AND object ='PROG'
AND obj_name = sy-cprog。
退出。
ENDSELECT。
500次执行的持续时间(以秒为单位):0,0103200
从tadir到1行选择COUNT(*)
pgmid ='R3TR'
AND object ='PROG'
AND obj_name = sy-cprog。
500次执行的持续时间(以秒为单位):0,6242380
SELECT *从tadir到tadir_line
最多1个行
pgmid ='R3TR'
AND object ='PROG'
AND obj_name = sy-cprog。
ENDSELECT。< br> 500次执行的持续时间(以秒为单位):0,0103680
从tadir到pgmid的SELECT pgmid
最多到1行
pgmid ='R3TR'
AND object ='PROG'
AND obj_name = sy-cprog。
ENDSELECT。< br> 500次执行的持续时间(以秒为单位):0,0103690
从tadir到pgmid中选择单个pgmid
哪里pgmid ='R3TR'
AND object ='PROG'
AND obj_name = sy-cprog。
500次执行的持续时间以秒为单位:0, 0097770
>>>具有不完整键<<<
SELECT * FROM tadir INTO tadir_line
哪里pgmid ='R3TR'
AND object ='PROG'。
退出。
ENDSELECT。
持续500秒的持续时间:25, 2490160
从tadir到1行之间选择COUNT(*)
哪里pgmid ='R3TR'
AND object ='PROG'。
500次执行的持续时间(以秒为单位):1,4555210
SELECT *从tadir到tadir_line
最多1个行
pgmid ='R3TR'
AND object ='PROG'。
ENDSELECT。
持续500秒的持续时间: 1,6207910
SELECT pgmid从tadir到pgmid
最多到1行
pgmid ='R3TR'
AND object ='PROG'。
ENDSELECT。
持续500秒的持续时间: 1,5180330
从tadir到pgmid中选择单个pgmid
哪里pgmid ='R3TR'
AND object ='PROG'。
500次执行的持续时间(以秒为单位):1,2033210
Rob
此消息已被审核。
我们有一条通用规则:
*非缓冲表:
从...其中选择单个计数(*)...
*缓冲表:
从...其中选择一个<1字段> ...
至少在我们的环境中,这是最快的方法。
您可以使用此示例程序来检查两种可能性的运行时间:
*&--------------------------------------------- ------------------------ * *&报告Z_COMPARE_RUNTIME *&*&----------------- -------------------------------------------------- -* *&*&*&----------------------------------------- ---------------------------- *报告z_compare_runtime。 数据:g_start类型i,g_stop类型i,g_count类型i,g_single类型i。 参数:p_do类型i默认值为1000。选择开始。 做p_do次。 获取运行时字段g_start。 执行select_single。 获取运行时间字段g_stop。 g_single = g_single + g_stop-g_start。 获取运行时字段g_start。 执行select_count。 获取运行时间字段g_stop。 g_count = g_count + g_stop-g_start。 ENDDO。 g_single = g_single/p_do。 g_count = g_count/p_do。 写:p_do,"执行-平均运行时间:"。 写:/'选择单身:',g_single。 写:/'选择计数:',g_count。 *&------------------------------------------------ --------------------- * *&形成select_single *&---------------------- ----------------------------------------------- * *文字 * ------------------------------------------------- --------------------- * FORM select_single。 *数据:l_obj_name类型tadir-obj_name。 * *选择单个obj_name *从tadir * INTO l_obj_name *在pgmid ='R3TR'。 数据:l_name TYPE trdir-name。 从trdir INTO l_name中选择单个名称,其中name ='Z_COMPARE_RUNTIME'。 ENDFORM。 " select_single *&---------------------------------------------- ----------------------- * *&形成select_count *&-------------------- ------------------------------------------------- * *文字* ----------------------------------------------- ----------------------- * FORM select_count。* SELECT SINGLE COUNT(*)* FROM tadir * WHERE pgmid ='R3TR'。SELECT SINGLE COUNT(* )FROM trdir WHERE name ='Z_COMPARE_RUNTIME'。ENDFORM。" select_count
一周热门 更多>