在explain命令的输出中,我发现了两个术语'Seq Scan'和'Bitmap heap Scan'.有人能告诉我这两种类型的扫描有什么区别吗?(我正在使用PostgreSql)
postgresql optimization query-optimization sql-execution-plan
我已经阅读了一些博客和一些与优化相关的文章,如何优化查询.我读过我需要使用索引并确保使用良好的关系数据库模式正确设置所有主键和外键.
现在我有一个我需要优化的查询,我得到了EXPLAIN:
Using where; Using temporary; Using filesort
Run Code Online (Sandbox Code Playgroud)
我正在使用MySQL 5.5
我知道我正在使用WHERE但不使用我的临时表格或文件?这是什么意思?
Select tables optimized away在MySQL解释计划中有什么意义?
explain select count(comment_count) from wp_posts;
+----+-------------+---------------------------+-----------------------------+
| id | select_type | table,type,possible_keys, | Extra |
| | | key,key_len,ref,rows | |
+----+-------------+---------------------------+-----------------------------+
| 1 | SIMPLE | all NULLs | Select tables optimized away|
+----+-------------+---------------------------+-----------------------------+
1 row in set (0.00 sec)
Run Code Online (Sandbox Code Playgroud)
注意:explain plan输出已编辑为易读性.
我有一个SQL表突然无法返回数据,除非我在末尾包含"with(nolock)",这表示我的表上有某种锁.我已经用dm_tran_locks进行了一些实验,以确定表中实际上存在多个锁,但是如何识别锁定它们的是什么(即dm_tran_locks的请求元素)?
编辑:我知道SQL 2005之前的sp_lock,但现在不推荐使用sp,AFAIK正确的做法是使用dm_tran_locks.我正在使用SQL Server 2008 R2.
sql sql-server locking query-optimization sql-server-2008-r2
我有一个像这样的列的表,例如:
id,col1,col2,col3,col4
Run Code Online (Sandbox Code Playgroud)
现在,我想检查ANY的col1, col2, col3, col4价值已经传入.
要做的很长的路要走..
SELECT * FROM table WHERE (col1 = 123 OR col2 = 123 OR col3 = 123 OR col4 = 123);
Run Code Online (Sandbox Code Playgroud)
我想这是相反的版本IN.
有没有更简单的方法来做我想要的?
我有一个表,我在LIMIT和OFFSET之前进行ORDER BY,以便进行分页.
在ORDER BY列上添加索引会对性能产生巨大影响(与小LIMIT结合使用时).在一个500,000行表中,只要有一个小的LIMIT,我看到增加索引的10,000倍改进.
但是,索引对高OFFSET(即我的分页中的后续页面)没有影响.这是可以理解的:b树索引可以很容易地从头开始按顺序迭代但不能找到第n个项.
似乎有用的是计算的b树索引,但我不知道PostgreSQL中对这些的支持.还有其他解决方案吗?似乎优化大型OFFSET(特别是在分页用例中)并不是那么不寻常.
不幸的是,PostgreSQL手册简单地说"OFFSET子句跳过的行仍然必须在服务器内部计算;因此大的OFFSET可能效率低下."
我在Innodb有一张超过1亿行的表.
我必须知道外键是否超过5000行= 1.我不需要确切的数字.
我做了一些测试:
SELECT COUNT(*) FROM table WHERE fk = 1=> 16秒
SELECT COUNT(*) FROM table WHERE fk = 1 LIMIT 5000=> 16秒
SELECT primary FROM table WHERE fk = 1=> 0.6秒
我将拥有更大的网络和治疗时间,但它可能是15.4秒的超载!
你有更好的主意吗?
谢谢
编辑:[添加了OP的相关评论]
我尝试了SELECT SQL_NO_CACHE COUNT(fk)FROM表WHERE fk = 1但是耗时25秒
使用Mysql Tuner调整了Mysod的Innodb.
CREATE TABLE table ( pk bigint(20) NOT NULL AUTO_INCREMENT,
fk tinyint(3) unsigned DEFAULT '0',
PRIMARY KEY (pk), KEY idx_fk (fk) USING BTREE )
ENGINE=InnoDB AUTO_INCREMENT=100380914 DEFAULT CHARSET=latin1
Run Code Online (Sandbox Code Playgroud)
DB Stuff:
'have_innodb', 'YES' 'ignore_builtin_innodb', …Run Code Online (Sandbox Code Playgroud) 我有以下疑问
第一个使用内连接
SELECT item_ID,item_Code,item_Name
FROM [Pharmacy].[tblitemHdr] I
INNER JOIN EMR.tblFavourites F ON I.item_ID=F.itemID
WHERE F.doctorID = @doctorId AND F.favType = 'I'
Run Code Online (Sandbox Code Playgroud)
第二个使用子查询
SELECT item_ID,item_Code,item_Name from [Pharmacy].[tblitemHdr]
WHERE item_ID IN
(SELECT itemID FROM EMR.tblFavourites
WHERE doctorID = @doctorId AND favType = 'I'
)
Run Code Online (Sandbox Code Playgroud)
在此项目表中[Pharmacy].[tblitemHdr]包含15列和2000条记录.并[Pharmacy].[tblitemHdr]包含5列和大约100条记录.在这种情况下which query gives me better performance?
我跑了EXEC sp_who2 78,我得到以下结果:

我怎样才能找到其状态暂停的原因?
INSERT基于昂贵的查询,此过程非常繁重.一个大SELECT从几个表中获取数据,并写一些3-4百万行不同的表.
没有锁/块.
将waittype它与是CXPACKET.我能理解,因为你可以在下面的图片中看到9个78.
关注我和我真正想知道的是为什么SPID78 号中的第1号被暂停.
我知道当a的状态SPID被暂停时,它意味着进程正在等待资源,并且当它获取其资源时它将恢复.
我怎样才能找到更多这方面的细节?什么资源?为什么不可用?
我使用了下面的代码以及其中的变化,但是我还能做些什么来找出SPID暂停的原因?
select *
from sys.dm_exec_requests r
join sys.dm_os_tasks t on r.session_id = t.session_id
where r.session_id = 78
Run Code Online (Sandbox Code Playgroud)
我已经习惯了EXEC sp_who2 78.我得到的这个特殊spid78的结果如下:(分为3个图片以适应屏幕)

我有一张桌子,我们称之为"foos",其中有近600万条记录.我正在运行以下查询:
SELECT "foos".*
FROM "foos"
INNER JOIN "bars" ON "foos".bar_id = "bars".id
WHERE (("bars".baz_id = 13266))
ORDER BY "foos"."id" DESC
LIMIT 5 OFFSET 0;
Run Code Online (Sandbox Code Playgroud)
此查询需要很长时间才能运行(Rails在运行时会超时).所有ID都有一个索引.好奇的部分是,如果我删除ORDER BY条款或LIMIT条款,它几乎是瞬间运行.
我假定这两者的存在ORDER BY和LIMIT正在做的PostgreSQL查询规划一些错误的选择.任何人都有任何想法如何解决这个问题?
如果它有帮助,这里是EXPLAIN所有3种情况:
//////// Both ORDER and LIMIT
SELECT "foos".*
FROM "foos"
INNER JOIN "bars" ON "foos".bar_id = "bars".id
WHERE (("bars".baz_id = 13266))
ORDER BY "foos"."id" DESC
LIMIT 5 OFFSET 0;
QUERY PLAN
--------------------------------------------------------------------------------------------------------------------
Limit (cost=0.00..16663.44 rows=5 width=663)
-> Nested Loop (cost=0.00..25355084.05 rows=7608 width=663) …Run Code Online (Sandbox Code Playgroud) sql ×7
mysql ×4
postgresql ×3
optimization ×2
performance ×2
sql-server ×2
count ×1
database ×1
limit ×1
locking ×1
select ×1
sql-order-by ×1
sql-tuning ×1