该表存储时间序列数据并包含大约 15 列。我想优化SELECT在 3 列上有过滤器的查询
SELECT * FROM TABLE_1
WHERE COL_1 = ?
AND COL_2 = ?
AND COL_3 = ?
Run Code Online (Sandbox Code Playgroud)
COL_1在和上创建了 2 个索引COL_2,但在 上没有创建COL_3。当 RPS(每秒请求数)约为 1K 时,数据库 CPU 峰值达到100% 。
数据库配置是
由于没有索引,查询处理是否更多COL_3?在子句中使用的每个列上创建索引是一个好习惯吗WHERE?
postgresql indexing query-optimization cpu-usage timescaledb
Sort运算符表示只有 100 行需要排序。这怎么可能比读取 190 万行更昂贵呢?我一定是读错了或者误解了某些东西。
另外,排序运算符中每次执行的估计行数为何只有 100?如果Index Seek运算符估计每次执行的行数为 190 万行,那么如何仅将 100 行传送到 Sort 运算符呢?
这是查询:
DECLARE @PageIndex INT = 1000;
DECLARE @PageCount INT = 1000;
SELECT ID
FROM dbo.Table1
WHERE DateCreated >= '2021-10-27'
AND
DateCreated < '2021-10-28'
ORDER BY ID
OFFSET @PageIndex * @PageCount ROWS FETCH NEXT @PageCount ROWS ONLY
Run Code Online (Sandbox Code Playgroud) 我的tracks表包含大约 300 万条记录(每天增长 500 条),大约有 30 列,但我只在WHERE子句中使用 15 列。查询平均需要 4800 毫秒,没有其他用户/进程使用数据库。如何让它更快?我希望看到接近 100 毫秒的结果。
寻找歌曲(曲目)的人填写表格:
99% 的用例是 SELECT 查询:
SELECT
"public"."tracks"."sys_id",
"public"."tracks"."all_artists",
"public"."tracks"."name",
"public"."tracks"."genres",
"public"."tracks"."release_date",
"public"."tracks"."tempo",
"public"."tracks"."popularity",
"public"."tracks"."danceability",
"public"."tracks"."energy",
"public"."tracks"."speechiness",
"public"."tracks"."acousticness",
"public"."tracks"."instrumentalness",
"public"."tracks"."liveness",
"public"."tracks"."valence",
"public"."tracks"."main_artist_popularity",
"public"."tracks"."main_artist_followers",
"public"."tracks"."key",
"public"."tracks"."preview_url"
FROM
"public"."tracks"
WHERE
(
"public"."tracks"."name" LIKE '%oultec%'
OR "public"."tracks"."all_artists_string" LIKE '%oultec%'
)
AND ("public"."tracks"."genres_string" LIKE '%rum%')
AND "public"."tracks"."tempo" >= '80'
AND "public"."tracks"."tempo" <= '210'
AND "public"."tracks"."popularity" >= …Run Code Online (Sandbox Code Playgroud) 我有一个缓慢的删除查询。我曾经EXPLAIN ANALYZE了解瓶颈,我看到两个触发器很慢:
Trigger for constraint other_table_1_fid_fkey: time=3.644 calls=1
Trigger for constraint other_table_2_fid_fkey: time=6.289 calls=1
Run Code Online (Sandbox Code Playgroud)
在这次讨论之后,我添加了索引。索引fid确实other_table_1提高了性能。fid但是在in上添加索引并other_table_2没有任何区别,而且它似乎是delete查询中的瓶颈。
我的问题是如何调试(或EXPLAIN ANALYZE)触发器本身。
谢谢,
PS 为了解决我的具体问题,我暂时删除了外键约束,它提高了性能。
我需要加快查询速度.索引表是我正在寻找的吗?如果是这样,我该怎么做?每次插入都需要更新吗?
以下是表格模式:
--table1-- | --tableA-- | --table2--
id | id | id
attrib1 | t1id | attrib1
attrib2 | t2id | attrib2
| attrib1 |
Run Code Online (Sandbox Code Playgroud)
和查询:
SELECT
table1.attrib1,
table1.attrib2,
tableA.attrib1
FROM
table1,
tableA
WHERE
table1.id = tableA.t1id
AND (tableA.t2id = x or ... or tableA.t2id = z)
GROUP BY
table1.id
Run Code Online (Sandbox Code Playgroud) 看来我的SQL不是基于的限制结果price.
在我之前的帖子中,SQL:帮助我优化我的SQL,人们表示我应该使用LEFT OUTER JOIN.
SELECT homes.home_id,
address,
city,
state,
zip,
price,
photo_id,
photo_url_dir
FROM homes
LEFT OUTER JOIN home_photos ON homes.home_id = home_photos.home_id
AND primary_photo_group_id = home_photo_group_id
AND home_photo_type_id =2
AND display_status = true
AND homes.price BETWEEN 500000 AND 1000000
Run Code Online (Sandbox Code Playgroud)
我不明白.当我有一个WHERE条件来精确限制该字段时,为什么上面的SQL会显示价格低于500000的房屋.
谢谢你的帮助.
我希望根据PRICEX和Y之间的标准显示家庭和家庭没有home_photo ...或者SQFTZ.但是这些标准需要应用于那些有和homes没有a的家庭.home_photo
SELECT homes.home_id,
address,
city,
state,
zip,
price,
photo_id,
photo_url_dir
FROM homes
LEFT OUTER JOIN home_photos ON homes.home_id = home_photos.home_id
AND homes.primary_photo_group_id = …Run Code Online (Sandbox Code Playgroud) 注意:编辑:请编辑标题,如果有更好的:)
我的问题是:
我的数据库中有两个表
-----------
| table1 |
|----------|
| id |
|text |
===========
-----------
| table2 |
|----------|
| id |
|text |
===========
Run Code Online (Sandbox Code Playgroud)
table1是600,000条记录
table2是5,000,000条记录!! :)
删除table2中不在table1中的所有记录的最佳方法是什么
我主要是顺便 - 最快的方式,因为我不想等待4个小时来完成这个过程
你有比以下代码更好的东西:
<?PHP
$sql = "select text from table2";
$result = mysql_query($sql) or die(mysql_error());
while($row = mysql_fetch_array($result)){
$text = $row["text"];
$sql2 = "select id from table1 where text = '$text'";
$query2 = mysql_query($sql2) or die(mysql_error());
$result2 = mysql_num_rows($query2);
if($result2==0){
$sql3 = "delete from table2 where text = '$text'";
$query3 …Run Code Online (Sandbox Code Playgroud) 我们有一个查询当前正在查杀我们的数据库,我知道必须有一种方法来优化它.我们有3个表:
我们一直在使用以下查询来显示一个简单的HTML表,该表显示每个列表以及与列表相关的一些属性,包括所包含列表项的属性的平均值:
select object_id, user_id, slug, title, description, items,
city, state, country, created, updated,
(select AVG(rating) from items
where object_id IN
(select object_id from list_items where list_id=lists.object_id)
AND status="A"
) as 'avg_rating',
(select AVG(avg_rating) from items
where object_id IN
(select object_id from list_items where list_id=lists.object_id)
AND status="A"
) as 'avg_avg_rating',
(select AVG(length) from items
where object_id IN
(select object_id from list_items where list_id=lists.object_id)
AND status="A"
) as 'avg_length',
(select AVG(difficulty_rating) from …Run Code Online (Sandbox Code Playgroud) SELECT * FROM table WHERE col IN (1,2,3)
Run Code Online (Sandbox Code Playgroud)
要么
SELECT * FROM table WHERE col = 1 OR col = 2 OR col = 3
Run Code Online (Sandbox Code Playgroud) 首先,这是我的SQL查询:
SELECT research_cost, tech_name,
(SELECT research_cost
FROM technologies
WHERE research_cost <= USERS_RESEARCH_POINTS_VALUE
ORDER BY research_cost DESC
LIMIT 1) as research_prev,
(SELECT cost
FROM technology_costs
WHERE id = 18
LIMIT 1) as technology_cost
FROM `technologies`
JOIN technology_costs
ON id = COUNT_OF_TECHS_USER_LEARNED
WHERE research_cost > USERS_RESEARCH_POINTS_VALUE
ORDER BY research_cost ASC
LIMIT 1
Run Code Online (Sandbox Code Playgroud)
网站链接:http://www.joemajewski.com/fortress/
有些人可能会认为上面的查询是中等大小的,甚至是小的; 不是我.对我来说,这是我写过的最大,最复杂的SQL查询之一,所以我把自己推到了极限.
无论如何,查询本身没有语法错误,并且在大多数情况下它完全符合我的要求.然而,有一个小问题.
如果main SELECT子句没有返回一行("SELECT research_cost,tech_name FROM technologiesWHERE research_cost> whatever"),则整个查询都是空集.
如果有帮助,Fortress就是我正在努力的游戏.这是一个基于浏览器的MMORPG,用户可以在这里建立一支军队,试图在排行榜中占据一席之地.技术是一种游戏机制,用户购买其统计数据(黄金收入,单位生产等)的升级.研究是一种游戏机制,允许您通过培训科学家来进行研究来学习新技术.这就是这个查询的全部内容.它抓住了目前正在研究的技术,以及它的研究成本.它还可以获得下一项技术成本的黄金成本.
所以...有什么方法可以强制在结果集中至少返回一个空行,因为嵌套的select语句检索脚本中需要的变量,即使外部查询没有返回任何内容.或者有人可能会改变它,以便始终返回结果.
如果需要其他任何东西,请告诉我.:)
sql ×5
mysql ×4
optimization ×3
postgresql ×3
database ×2
indexing ×2
cascade ×1
cpu-usage ×1
php ×1
resultset ×1
sql-server ×1
timescaledb ×1
trigram ×1