标签: sqlperformance

使用 MSSQL 中的附加 max() 条件从数据库中检索每个组中的最后一条记录

这是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 选择每个组中最后一条记录的性能最高的查询是什么?

sql sql-server sqlperformance

2
推荐指数
1
解决办法
1267
查看次数

如何提高 CockroachDB 的 INSERT 性能(每秒行数)(与 PostgreSQL 相比大约慢 20 倍)

附在本文末尾的 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

2
推荐指数
1
解决办法
1667
查看次数

SELECT子句使用IN ...非常慢?

你们可以查看以下对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)

查询统计:

  • 所用时间:10.53秒.

指数:

  • 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)

sql oracle sqlperformance sql-tuning

1
推荐指数
2
解决办法
1万
查看次数

当从多台 PC 连接时,Oracle 是否会为同一用户分配不同的 PGA?

假设我已使用同一用户从不同的 PC 连接到数据库 3 次。Oracle 是否为每个区域创建单独的 PGA 区域,还是只创建一个区域?如果有,它如何处理来自同一用户连接的不同会话并同时执行的多个查询?

oracle database-administration sqlperformance database-performance oracle19c

1
推荐指数
1
解决办法
237
查看次数

如何提高 SQL 查询的性能?

我是 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查询:

\n
WITH 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)

sql oracle sqlperformance

1
推荐指数
1
解决办法
116
查看次数

使用 LAG/LEAD 分析功能优化自联接 Oracle SQL 查询?

我们有一个 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),但到目前为止我们无法找出可行的解决方案。任何想法,将不胜感激

sql oracle sqlperformance oracle11g

0
推荐指数
1
解决办法
4134
查看次数

SQL Server:将两列组合成不同值的有效方法?

这是一个性能问题,我希望将两个独立的表中的两列组合在一起.你怎么做组合?

我理解这是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中的列

1
2
3
Run Code Online (Sandbox Code Playgroud)

表B中的Golumn

1
3
5
Run Code Online (Sandbox Code Playgroud)

想要输出

1
2
3
5
Run Code Online (Sandbox Code Playgroud)

sql-server performance sqlperformance

0
推荐指数
1
解决办法
781
查看次数

在使用顶行过滤器后如何从 rowcount 获取表的所有行数

我的数据库中有一个巨大的表和一个访问它的存储过程,它需要分页。

为了实现这一目标,我想要表的总记录,为此,我面临性能问题,因为为此我需要运行此查询两次:

  • 第一次统计所有记录
  • 其次,当我需要选择该页面范围中的记录时

有什么方法可以避免第一个查询来获取总计数,而不是使用行计数或其他东西?

sql t-sql sql-server sqlperformance sql-server-2017

0
推荐指数
1
解决办法
1482
查看次数