这是Retrieving last record in each group from database - SQL Server 2005/2008的后续问题
在答案中,此示例用于检索一组参数的最后一条记录(下面的示例检索计算机名中每个值的最后更新):
select t.*
from t
where t.lastupdate = (select max(t2.lastupdate)
from t t2
where t2.computername = t.computername
);
Run Code Online (Sandbox Code Playgroud)
但是,在我的情况下,“lastupdate”不是唯一的(某些更新成批出现并且具有相同的 lastupdate 值,如果“computername”的两个更新出现在同一批次中,您将获得“computername + lastupdate”的非唯一输出”)。假设我还有一个字段“rowId”,它只是自动递增的。缓解措施是在查询中包含 max('rowId') 字段的另一个标准。
注意:虽然该示例使用特定于时间的名称“lastupdate”,但实际的选择标准可能与时间完全无关。
因此,我想问一下,根据“组定义参数”(在上述情况下为“计算机名”)和最大 rowId 选择每个组中最后一条记录的性能最高的查询是什么?
附在本文末尾的 Python3 脚本创建了一个包含 5INT列的简单表,其中 3列带有索引。
然后它使用多行插入来填充表。
一开始,它设法每秒插入大约 10000 行。
Took 0.983 s to INSERT 10000 rows, i.e. performance = 10171 rows per second.
Took 0.879 s to INSERT 10000 rows, i.e. performance = 11376 rows per second.
Took 0.911 s to INSERT 10000 rows, i.e. performance = 10982 rows per second.
Took 1.180 s to INSERT 10000 rows, i.e. performance = 8477 rows per second.
Took 1.030 s to INSERT 10000 rows, i.e. performance = 9708 …Run Code Online (Sandbox Code Playgroud) sql bulkinsert sqlperformance database-performance cockroachdb
你们可以查看以下对Oracle DB的查询并指出错误:
SELECT t1.name FROM t1, t2 WHERE t1.id = t2.id AND t2.empno IN (1, 2, 3, …, 200)
Run Code Online (Sandbox Code Playgroud)
查询统计:
指数:
t2.empno 被编入索引.
t1.id 被编入索引.
t2.id 被编入索引.
更新
上面的查询只是我使用的查询的示例副本.下面是一个更真实的形式
解释计划

查询:
SELECT
PRODUCT_REPRESENTATION_SK
FROM
Product_Representation pr
, Design_Object do
, Files files
,EPS_STATUS epsStatus
,EPS_ERROR_CODES epsError
,VIEW_TYPE viewTable
WHERE
pr.DESIGN_OBJECT_SK = do.DESIGN_OBJECT_SK
AND pr.LAYER_NAME !='Layer 0'
AND epsStatus.EPS_STATUS_SK = pr.EPS_STATUS
AND epsError.EPS_ERROR_CODE = pr.EPS_ERROR_CODE
AND viewTable.VIEW_TYPE_ID = pr.VIEW_TYPE_ID
AND files.pim_id = do.PIM_ID
AND do.DESIGN_OBJECT_ID IN
(
147086,149924,140458,135068,145197,134774,141837,138568,141731,138772,143769,141739,149113,148809,141072,141732,143974,147076,143972,141078,141925,134643,139701,141729,147078,139120,137097,147072,138261,149700,149701,139127,147070,149702,136766,146829,135762,140155,148459,138061,138762............................................. 200 such …Run Code Online (Sandbox Code Playgroud) 假设我已使用同一用户从不同的 PC 连接到数据库 3 次。Oracle 是否为每个区域创建单独的 PGA 区域,还是只创建一个区域?如果有,它如何处理来自同一用户连接的不同会话并同时执行的多个查询?
oracle database-administration sqlperformance database-performance oracle19c
我是 SQL 的初学者,我想使用 SQL 从 Oracle 数据库查询数据。我有一个表空间记录了许多汽车的位置。每条记录都有里程和时间。表空间具有三列:\xe2\x80\x98SENDTIME\xe2\x80\x99、\xe2\x80\x98MILEAGE\xe2\x80\x99 和 \xe2\x80\x98PLATENO\xe2\x80\x99。它们分别代表汽车的时间、里程(以时间戳格式)和车牌号。\xe2\x80\x98SENDTIME\xe2\x80\x99 列中的值采用日期时间格式。我想找出某辆车何时没有移动超过 30 秒且少于 300 秒。所以我写了一个sql查询:
\nWITH gpsinfo_cte AS (\n SELECT plateno, sendtime, longitude, latitude, mileage, createdate,\n FIRST_VALUE(sendtime) OVER (PARTITION BY plateno, mileage ORDER BY sendtime) AS first_sendtime,\n LAST_VALUE(sendtime) OVER (PARTITION BY plateno, mileage ORDER BY sendtime) AS last_sendtime\n FROM GPSINFO \n WHERE plateno = \'\xe4\xba\xacAEW302\'\n)\nSELECT /*+ NO_MERGE(gpsinfo_cte) */ plateno, sendtime, longitude, latitude, mileage, createdate \nFROM gpsinfo_cte\nWHERE (last_sendtime - first_sendtime) * 24 * 60 *60 < 300\nAND (last_sendtime - first_sendtime) * …Run Code Online (Sandbox Code Playgroud) 我们有一个 Oracle SQL 查询来识别表列的值已从一个记录更改为另一个记录的记录。相关列是 (ID, SOME_COLUMN, FROM_DATE, TO_DATE) 其中 ID 不是唯一的,并且 FROM_DATE 和 TO_DATE 确定该 ID 的特定行有效的时间间隔,即
(ID1, VAL1, 01/01/2016, 03/01/2016)
(ID1, VAL2, 04/01/2016, 09/01/2016)
(ID1, VAL3, 10/01/2016, 19/01/2016)
Run Code Online (Sandbox Code Playgroud)
等等。
我们可以使用以下自连接来实现
SELECT N.ID
O.SOME_COLUMN OLD_VALUE,
N.SOME_COLUMN NEW_VALUE
FROM OUR_TABLE N, OUR_TABLE O
WHERE N.ID = O.ID
AND N.FROM_DATE - 1 = O.TO_DATE
AND N.SOME_COLUMN <> O.SOME_COLUMN
Run Code Online (Sandbox Code Playgroud)
但是,由于该表包含 1 亿条记录,因此对性能非常不利。有没有更有效的方法来做到这一点?有人暗示了分析函数(例如 LAG),但到目前为止我们无法找出可行的解决方案。任何想法,将不胜感激
这是一个性能问题,我希望将两个独立的表中的两列组合在一起.你怎么做组合?
我理解这是or条件
SELECT a.contract1 or b.contract2 from TABLE1 a, TABLE2 b
Run Code Online (Sandbox Code Playgroud)
我的目标是获得一个列,其中每个元素都在Table1的Contract1或Table2的Contract2中.该or符号不重复值等数值进行区分.我需要不同的价值观.由于底层不同,所提出的解决方案union方法对于大量数据集而言行动缓慢.
请提出有效的方法来处理性能.
输入
表A中的列
Run Code Online (Sandbox Code Playgroud)1 2 3表B中的Golumn
Run Code Online (Sandbox Code Playgroud)1 3 5
想要输出
1
2
3
5
Run Code Online (Sandbox Code Playgroud) 我的数据库中有一个巨大的表和一个访问它的存储过程,它需要分页。
为了实现这一目标,我想要表的总记录,为此,我面临性能问题,因为为此我需要运行此查询两次:
有什么方法可以避免第一个查询来获取总计数,而不是使用行计数或其他东西?
sql ×6
oracle ×4
sql-server ×3
bulkinsert ×1
cockroachdb ×1
oracle11g ×1
oracle19c ×1
performance ×1
sql-tuning ×1
t-sql ×1