性能:检查表上是否存在记录的最佳方法是什么?

2020-08-13 16:05发布

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


你好,

通常可以使用:

从x = y的选项卡中选择单个*。

但是,关于性能,我认为 其他一些更好的命令...

任何想法吗?

tks。

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


你好,

通常可以使用:

从x = y的选项卡中选择单个*。

但是,关于性能,我认为 其他一些更好的命令...

任何想法吗?

tks。

付费偷看设置
发送
15条回答
SAP小菜
1楼 · 2020-08-13 16:50.采纳回答

我喜欢

 从dbtab中最多选择1个count(*),其中field = value。
 

对我来说似乎很合理。

昵称总是被占用
2楼-- · 2020-08-13 16:35

现在可以从ABAP 7.4中获得

zZ12138
3楼-- · 2020-08-13 16:34

从x = y的标签中选择单个*。

你好

如果您的数据库将表数据存储在B树中,则可以这样做并从中受益,

您已经选择了可能需要的数据。

如果您有没有索引组织表的ORACLE,并且不需要数据,但是

只需确认记录存在,

 从选项卡中选择only_key_fields,其中x = y
 

会更快,因为您保存了数据块提取。

如果您的PK的高度为2或3,则表示"获得"的收益为33%或25%,

如果可能需要的表块访存可能涉及物理读取,则可能会更多。

Volker

打个大熊猫
4楼-- · 2020-08-13 16:52

注意,测量结果取决于缓冲和索引。 特别是,像其他聚合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

compass1988
5楼-- · 2020-08-13 16:46
< p>有趣的讨论,但是OP似乎一经发布就失去了兴趣。 没有回复,也没有分配分数。 我想听听他是否从中得到任何帮助。

Rob

四川大学会员
6楼-- · 2020-08-13 16:30

此消息已被审核。

wang628962
7楼-- · 2020-08-13 16:49

我们有一条通用规则:
*非缓冲表:

从...其中选择单个计数(*)...

*缓冲表:

从...其中选择一个<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

一周热门 更多>