我有两个非常大的表要合并,所以我一直在尝试优化更新速度.我注意到在PHP中进行部分更新会大大加快,所以我认为这意味着我没有正确地使用MySQL.
我已经简化了问题,试图缩小范围......
GRID_TABLE POSTCODE_TABLE idNo, lat, lng, nearestPostcode postcode, lat, lng ________________________________ _____________________ 1 57.1 -2.3 - AB12 3BA 56.3 -2.5 2 56.8 -1.9 - AB12 1YA 56.2 -2.3 . . . . . . (200 entries) (35,000 entries)
我想使用纬度(lat)和经度(lng)使用来自POSTCODE_TABLE的nearestPostcode更新GRID_TABLE,以找到每个网格点最近的邮政编码...
update grid_table set nearestPostcode = (
select postcode from postcode_table
where lat > grid_table.lat -0.0037 and lat < grid_table.lat +0.0037
and lng > grid_table.lng -0.0068 and lng < grid_table.lng +0.0068
order by POW(lat - grid_table.lat,2) + POW((lng - grid_table.lng) *0.546,2) …Run Code Online (Sandbox Code Playgroud) 我希望比较索引并进一步优化我的代码。我想要做的是强制查询在没有索引的情况下运行,以便我可以看到它产生了什么不同。是否有可能做到这一点?
具有前缀SP(而不是SP_)的用户存储过程是否通过查看主数据库(类似于名为SP_的用户SP)具有较差的性能,或者它是否存在存储过程存在的DB,因为它缺少下划线?
目前我有这个相当大的查询
count()按事件名称和日期分组的事件,将每日、每周、每月计数聚合到中间表中。avg()按事件分组来选择每个中间表的平均计数,对结果进行联合,并且因为我想为每天、每周、每月设置一个单独的列,将填充值 0 放入空列中。查询虽然很大,但我觉得我正在做很多重复的工作。有什么办法可以更好地执行此查询或使其更小吗?我以前没有真正做过这样的查询,所以我不太确定。
WITH monthly_counts as (
SELECT
event,
count(*) as count
FROM tracking_stuff
WHERE
event = 'thing'
OR event = 'thing2'
OR event = 'thing3'
GROUP BY event, date_trunc('month', created_at)
),
weekly_counts as (
SELECT
event,
count(*) as count
FROM tracking_stuff
WHERE
event = 'thing'
OR event = 'thing2'
OR event = 'thing3'
GROUP BY event, date_trunc('week', created_at)
),
daily_counts as (
SELECT
event,
count(*) as count
FROM tracking_stuff
WHERE …Run Code Online (Sandbox Code Playgroud) 我有ad_item包含以下列的postgresql表。
id | name | remaining | created_at
Run Code Online (Sandbox Code Playgroud)
然后我的剩余指数小于或等于 300。
create index remaining_index on ad_item using btree(id) where remaining <= 300
Run Code Online (Sandbox Code Playgroud)
但是当我做explain analyze我的查询时。
explain analyze select id from ad_item where remaining <= 300
Run Code Online (Sandbox Code Playgroud)
它向我展示了以下内容。
Seq Scan on ad_item (cost=0.00..2.06 rows=1 width=4) (actual time=0.010..0.013 rows=1 loops=1)
Filter: (remaining <= '300'::numeric)
Rows Removed by Filter: 4
Planning time: 0.115 ms
Execution time: 0.026 ms
Run Code Online (Sandbox Code Playgroud)
为什么不使用我的remaining_index?那个索引是多余的吗?
谢谢。
我有一个使用以下架构的数据库:
CREATE TABLE IF NOT EXISTS `sessions` (
`starttime` datetime NOT NULL,
`ip` varchar(15) NOT NULL default '',
`country_name` varchar(45) default '',
`country_iso_code` varchar(2) default '',
`org` varchar(128) default '',
KEY (`ip`),
KEY (`starttime`),
KEY (`country_name`)
);
Run Code Online (Sandbox Code Playgroud)
(实际表包含更多列;我只包含我查询的列。)引擎是 InnoDB。
正如您所看到的,有 3 个索引 - ip、starttime和country_name。
该表非常大 - 它包含大约 150 万行。我正在对其运行各种查询,尝试提取一个月的信息(2018 年 8 月,在下面的示例中)。
像这样的查询
SELECT
UNIX_TIMESTAMP(starttime) as time_sec,
country_iso_code AS metric,
COUNT(country_iso_code) AS value
FROM
sessions
WHERE
starttime >= FROM_UNIXTIME(1533070800) AND
starttime <= FROM_UNIXTIME(1535749199)
GROUP BY …Run Code Online (Sandbox Code Playgroud) 我有一个Java Web服务方法getCardInformation,可Oracle使用从数据库获取数据JDBC。每秒大约进行300个呼叫。
Java将其称为pl / sql函数:
PROCEDURE GET_CARDS_BY_ID(p_card_id IN NUMBER
,o_result OUT VARCHAR2) IS
BEGIN
SELECT 'some data'
INTO o_result
FROM 'my complicated SQL' c
WHERE c.card_id = p_card_id;
END GET_CARDS_BY_ID;
Run Code Online (Sandbox Code Playgroud)
通常SQL Select statement/procedure在30毫秒内返回结果,但有时有时需要20秒钟以上,而所有其他线程(调用)都在等待此延迟的调用。尽管这些调用没有相互连接,但是它们在SQL Select statement不同的输入参数下运行相同。所有参数都是使用Java从Java设置的bind variables。
在延迟期间,我们选择了活动会话并获得了很多游标:引脚S等待X
SELECT DISTINCT a.*, s.*
FROM V$ACTIVE_SESSION_HISTORY a
,v$sql s
WHERE a.sql_id = s.sql_id
AND blocking_session IS NOT NULL
AND a.sample_time > sysdate - 1
Run Code Online (Sandbox Code Playgroud)
我们通过添加hint到中解决了该问题Select。我们认为,在此延迟期间,Oracle试图对此进行解析Select …
我正在使用数据库客户端来测试。
使用EXPLAIN ANALYZE:
Hash Join (cost=5.02..287015.54 rows=3400485 width=33) (actual time=0.023..1725.842 rows=3327845 loops=1)
Hash Cond: ((fact_orders.financial_status)::text = (include_list.financial_status)::text)
CTE include_list
-> Result (cost=0.00..1.77 rows=100 width=32) (actual time=0.003..0.004 rows=4 loops=1)
-> ProjectSet (cost=0.00..0.52 rows=100 width=32) (actual time=0.002..0.003 rows=4 loops=1)
-> Result (cost=0.00..0.01 rows=1 width=0) (actual time=0.000..0.000 rows=1 loops=1)
-> Seq Scan on fact_orders (cost=0.00..240253.85 rows=3400485 width=38) (actual time=0.006..551.558 rows=3400485 loops=1)
-> Hash (cost=2.00..2.00 rows=100 width=32) (actual time=0.009..0.009 rows=4 loops=1)
Buckets: 1024 Batches: 1 Memory Usage: 9kB
-> CTE Scan on …Run Code Online (Sandbox Code Playgroud) sql postgresql query-optimization explain sql-execution-plan
除了拥有 mariadb 10.1.36-MariaDB 之外,我还收到以下错误。
EXPLAIN ANALYZE select 1
MySQL said: Documentation
1064 - You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'ANALYZE select 1' at line 1
Run Code Online (Sandbox Code Playgroud)
我还需要在这里做什么。我的 PHP 版本是 7.2.11。
我将要描述的是在以下硬件上运行:
SQL Server Management Studio (SSMS) 和 sql server 实例都在此服务器上运行。所以所有的查询都是在本地执行的。此外,在执行任何查询之前,我总是运行以下命令以确保没有数据访问缓存在内存中:
DBCC DROPCLEANBUFFERS
Run Code Online (Sandbox Code Playgroud)
我们有一个包含大约 11'600'000 行的 SQL Server 表。在大计划中,不是一张特别大的桌子,但它会随着时间的推移而大大增加。
该表具有以下结构:
CREATE TABLE [Trajectory](
[Id] [int] IDENTITY(1,1) NOT NULL,
[FlightDate] [date] NOT NULL,
[EntryTime] [datetime2] NOT NULL,
[ExitTime] [datetime2] NOT NULL,
[Geography] [geography] NOT NULL,
[GreatArcDistance] [real] NULL,
CONSTRAINT [PK_Trajectory] PRIMARY KEY CLUSTERED ([Id])
)
Run Code Online (Sandbox Code Playgroud)
(为简单起见,排除了一些列,但它们的数量和大小非常小)
虽然没有那么多行,但由于[Geography]列的原因,该表占用了相当多的磁盘空间。此列的内容是 …
mysql ×4
sql ×4
postgresql ×3
indexing ×2
performance ×2
php ×2
sql-server ×2
aggregate ×1
analytics ×1
explain ×1
mariadb ×1
oracle ×1
plsql ×1