我有一个有两个问题的存储过程。
它有 40 个参数。我知道第一条评论是重新设计我的存储过程,使其没有 40 个参数。然而,这是一个带有大标准部分的搜索表单。因此,用户最多可以指定 40 个不同的搜索条件。然后我们将这些值作为参数传递。现在我有一个 40 个参数的存储过程。将它们作为 XML 参数传递并在内部或表参数中解析它是否会更有效(我们仍在运行 SQL 2k5,但正在考虑升级到 2k12)。
我的三个参数是由引号和逗号分隔的 Guid 值的长字符串。基本上,用户会看到一个产品线列表,有时有数百个。然后他们单击想要搜索的内容。我们限制了他们可以检查的行数,只是因为字符串太长,但我们传递了一长串由引号和逗号分隔的 Guid。我知道这不是正确的方法。用于传递像这样的 Guid 值的数组或集合的标准 Trans SQl 模式是什么?40 个领域中,我有 3 个独立领域在做这件事。我们希望更有效地做到这一点,并且能够传递超出当前限制的内容。
tt - 是一个映射表。 tt结构是
表_1 | 表_2 | 表3
SELECT t1.foo1, t2.foo2, t3.foo3 FROM tt
JOIN table1 t1 ON tt.table_1 = t1.id
JOIN table2 t2 ON tt.table_2 = t2.id
JOIN table3 t3 ON tt.table_3 = t3.id
WHERE t2.value = 'test'
Run Code Online (Sandbox Code Playgroud)
该指数是否有意义并且会发挥作用tt?综合指数为ix_table_1__table_2__table_3(table1, table2, table_3)
如果这样做 - 为什么,如果不这样做 - 为什么?
DATEDIFF函数和直接减去INTERVAL DAY有什么区别?
SELECT * FROM table WHERE DATEDIFF(CURDATE(), publish_date) <= 3
SELECT * FROM table WHERE publish_date >= CURDATE() - INTERVAL 3 DAY
结果数据是一样的,但似乎2.方法更快一点?
我在基于 PrestoDB 的 AWS Athena 上运行它。我原本的计划是查询3个月前的数据来分析这些数据。然而,即使是过去2个小时的查询时间也需要超过30分钟,此时查询就会超时。有没有更有效的方法来执行查询?
SELECT column1, dt, column 2
FROM database1
WHERE date_parse(dt, '%Y%m%d%H%i%s') > CAST(now() - interval '1' hour AS timestamp)
Run Code Online (Sandbox Code Playgroud)
日期列以字符串形式记录YYYYmmddhhmmss
我用谷歌搜索了很多,但找不到我的问题的明确答案
假设我们有这个查询
SELECT * WHERE user_id = x ORDER BY date_created
Run Code Online (Sandbox Code Playgroud)
如果我们在 user_id 上有一个单列索引,在 date_created 上有另一个单列索引,优化器是否会使用这两个索引?或者只是 user_id 索引?
我们有一个 sql 性能不佳。我已经修复了执行计划,但 REGEXP_LIKE 导致高缓冲区获取,并且还在运行时做出贡献。我可以在 sql 中使用的任何替代方案。问题是 AND REGEXP_LIKE (xx3la. assembly_type, '^I ..*')
/* Formatted on 1/6/2023 2:07:28 PM (QP5 v5.318) */
SELECT 1
FROM apps.oe_order_lines_all ola
JOIN APPS.OE_order_headers_all oh
ON oh.Header_Id = ola.header_id AND oh.org_id = ola.org_id
JOIN inv.mtl_parameters org
ON ola.ship_from_org_id = org.ORGANIZATION_ID
INNER JOIN ont.oe_transaction_types_tl tt
ON tt.transaction_type_id = oh.order_type_id
AND tt.language = 'US'
AND LPAD (UPPER (tt.name), 4) NOT IN ('TRIA',
'WARR',
'REPA',
'DUMM',
'DEMO',
'GOOD',
'INTE',
'CRED',
'EVAL',
'INVO') --- ('STAND')
JOIN apps.mtl_system_items_b msib
ON …Run Code Online (Sandbox Code Playgroud) 在 SQL Server 数据库中,我有一个包含一DateTime列的表,我想获取特定日期的行。
我发现了很多选择,例如:
WHERE myColumn BETWEEN '2020-10-10T00:00:00.00' AND '2020-10-10T23:59:59.999'WHERE CAST(myColumn AS date) = '2020-10-10'WHERE date LIKE '%2020-10-10%'...
其中哪一个最快?
假设我有一个像这样的oracle数据库模式:
tournaments(id,name)player(id,name)gameinfo(id,pid(引用players.id),tid(引用tournaments.id),日期)
所以在gameinfo表意味着某个玩家在给定日期的比赛中玩某个游戏.锦标赛有大约20个记录,玩家大约有16万,游戏信息大约有200万.我必须写一个查询列出锦标赛(tid在1-4范围内)以及参加该锦标赛的第一场比赛的球员数量.
我想出了以下查询:
select tid, count(pid)
from gameinfo g
where g.date = (select min(date) from gameinfo g1 where g1.player = g.player)
and g.tid in (1,2,3,4)
group by tid;
这显然不是最理想的(它运行了大约58分钟).我有另一个想法,我可以看到:
select pid, tid, min(date)
from gameinfo
where tid in(1,2,3,4)
group by pid, tid;
并在此视图上运行我的查询,因为它只有大约60万条记录,但这似乎仍然不是最优的.
你能就如何优化这个提出任何建议吗?
我正在尝试优化查询以从DB获取特定国家/地区的用户的排名.目前看来效率很低.
我正在努力确定可以采取哪些措施来改进它.
这是当前的SQL:
SELECT COUNT(*) + 1
FROM leaderboard lb, users u
WHERE u.country = 'United States'
AND lb.id = u.id
AND lb.score + 1 > (SELECT lb2.score
FROM leaderboard lb2
WHERE lb2.id = some_user_id);
Run Code Online (Sandbox Code Playgroud)
细节:
Users 表:
id 是主键country 列已编入索引Leadeboard 表:
id 是主键score 列已编入索引执行计划显示2个警告:
没有统计数据的列:[dbo].[排行榜] .id(成本23%)
没有统计数据的列:[dbo].[用户] .id(成本28%)
我有使用hibernate orm与db一起工作的java应用程序?那么什么是在db中检查记录(映射到hibernate对象)的presense的最快方法
我有一张包含实体店的桌子.该表大约有1500万行,有30列.
现在,当用户键入商店名称时检索商店的查询时间大约是15到20秒(我们显示自动完成列表,以便用户可以直接从列表中选择).
我想达到2-3秒的查询时间,这样用户就不会感到沮丧.
我应该采取什么行动来实现这一目标?(我目前在Linode上使用MySql数据库......也许在Simple DB上会有帮助吗?)
我做了很多问题,比如:
SELECT THIS
FROM THAT
WHERE ROW_TIME < NOW()
Run Code Online (Sandbox Code Playgroud)
如何在PHP中创建包含当前时间的变量,以便我可以使其工作:
SELECT THIS
FROM THAT
WHERE ROW_TIME < '$variable'
Run Code Online (Sandbox Code Playgroud)
?
我遇到了性能问题,也许您可以帮忙。当我打开游标时,然后运行其他几个SELECT语句以使用游标中的变量来检索值(请参见下文)。这似乎减慢了整个过程。我认为这是因为PL / SQL和SQL引擎之间的切换。使用表集合会有所帮助吗?但是,正如我所看到的,由于我需要来自不同表的不同列,因此我需要具有多个不同的集合,如何在一条记录中输出所有内容以返回结果集?
CREATE OR REPLACE procedure sp_test (in_input in number)
as
v_calc number;
v_calc_res number;
v1 number;
v2 number;
v3 number;
CURSOR C_test IS
select col1 from test where col1 = in_input;
begin
open c_test
loop
fetch c_test into v_calc;
select col1 into v1 from t1;
select col1 into v2 from t2;
select col1 into v3 from t3;
v_calc_res := v_calc * 5 * v1 * v2 * v3;
dbms_output.put_line(v_calc_res);
end loop;
end sp_test;
/
Run Code Online (Sandbox Code Playgroud) sql ×8
mysql ×5
performance ×4
oracle ×3
sql-server ×3
t-sql ×3
where-clause ×3
indexing ×2
plsql ×2
datetime ×1
hibernate ×1
java ×1
join ×1
optimization ×1
php ×1
presto ×1
ranking ×1
string ×1