当我做出看似无关紧要的变化时,我正在尝试优化复杂的SQL查询并获得截然不同的结果.
例如,运行需要336毫秒:
Declare @InstanceID int set @InstanceID=1;
With myResults as (
Select
Row = Row_Number() Over (Order by sv.LastFirst),
ContactID
From DirectoryContactsByContact(1) sv
Join ContainsTable(_s_Contacts, SearchText, 'john') fulltext on (fulltext.[Key]=ContactID)
Where IsNull(sv.InstanceID,1) = @InstanceID
and len(sv.LastFirst)>1
) Select * From myResults Where Row between 1 and 20;
Run Code Online (Sandbox Code Playgroud)
如果我用硬编码的数字替换@InstanceID,则需要超过13秒(13890毫秒)才能运行:
Declare @InstanceID int set @InstanceID=1;
With myResults as (
Select
Row = Row_Number() Over (Order by sv.LastFirst),
ContactID
From DirectoryContactsByContact(1) sv
Join ContainsTable(_s_Contacts, SearchText, 'john') fulltext on (fulltext.[Key]=ContactID)
Where IsNull(sv.InstanceID,1) = 1 …Run Code Online (Sandbox Code Playgroud) 是否有任何工具可以为SQL Server 2005及更高版本执行查询优化?
我搜索过,没找到任何东西.
您有什么推荐的吗?
如果这个问题重复,你可以关闭它,但我没有看到任何类似的东西
有没有办法.explain()在Linq查询上运行或等效?我想知道
.explain()(使用的索引等)的输出下面是存储过程中的SQL语句(为简洁而截断):
SELECT *
FROM item a
WHERE a.orderId NOT IN (SELECT orderId FROM table_excluded_item);
Run Code Online (Sandbox Code Playgroud)
这个陈述需要30秒左右!但是,如果我删除内部SELECT查询,它将降至1秒.table_excluded_item并不是很大,但我怀疑内部查询的执行速度超过了它的需要.
有更有效的方法吗?
我设法将一个符合我需要的查询放在一起,虽然比我希望的更复杂.但是,对于表的大小,查询比它应该更慢(0.17s).基于EXPLAIN下面提供的原因是因为在表上有一个表扫描,meta_relationships因为它COUNT在引擎的WHERE子句中innodb.
查询:
SELECT
posts.post_id,posts.post_name,
GROUP_CONCAT(IF(meta_data.type = 'category', meta.meta_name,null)) AS category,
GROUP_CONCAT(IF(meta_data.type = 'tag', meta.meta_name,null)) AS tag
FROM posts
RIGHT JOIN meta_relationships ON (posts.post_id = meta_relationships.object_id)
LEFT JOIN meta_data ON meta_relationships.meta_data_id = meta_data.meta_data_id
LEFT JOIN meta ON meta_data.meta_id = meta.meta_id
WHERE meta.meta_name = computers AND meta_relationships.object_id
NOT IN (SELECT meta_relationships.object_id FROM meta_relationships
GROUP BY meta_relationships.object_id HAVING count(*) > 1)
GROUP BY meta_relationships.object_id
Run Code Online (Sandbox Code Playgroud)
此特定查询选择仅包含该computers类别的帖子.的目的count > 1是为了排除包含职位computers/hardware, …
来自Joel Spolsky 关于漏洞抽象的 文章:
[C]某些SQL查询比其他逻辑上等效的查询慢几千倍.一个着名的例子是,如果你指定"a = b和b = c和a = c",那么某些SQL服务器要比你只指定"where a = b和b = c"那样快得多,即使结果集也是如此是一样的.
有谁知道这个细节?
从MySQL表中选择列时,性能会受到选择列的顺序与表中的顺序相比的影响(不考虑可能覆盖列的索引)吗?
例如,您有一个包含行uid,name,bday的表,并且您具有以下查询.
SELECT uid, name, bday FROM table
Run Code Online (Sandbox Code Playgroud)
MySQL是否以不同的方式查看以下查询,从而导致任何类型的性能损失?
SELECT uid, bday, name FROM table
Run Code Online (Sandbox Code Playgroud) 以下是我用于通过电子邮件搜索某人的查询
SELECT *
FROM phppos_customers
JOIN phppos_people ON phppos_customers.person_id = phppos_people.person_id
WHERE deleted = 0
AND email LIKE '%f%'
ORDER BY email ASC
Run Code Online (Sandbox Code Playgroud)
在"电子邮件"上添加索引会加快查询速度吗?
我在MySQL中有1000万行表,2 GB数据选择IN LIFO格式数据很慢
表引擎是=InnoDB
table有一个主键和一个唯一键
SELECT * FROM link LIMIT 999999 , 50;
Run Code Online (Sandbox Code Playgroud)
我如何提高表的性能.?
表结构
id int(11) NO PRI NULL auto_increment
url varchar(255) NO UNI NULL
website varchar(100) NO NULL
state varchar(10) NO NULL
type varchar(100) NO NULL
prio varchar(100) YES NULL
change varchar(100) YES NULL
last varchar(100) YES NULL
Run Code Online (Sandbox Code Playgroud)
注意:
SELECT * FROM link LIMIT 1 , 50;正在采取,.9ms但目前的SQL正在花费1000ms100倍的时间
让我们在SQL Server 2016中有下表
-- generating 1M test table with four attributes
WITH x AS
(
SELECT n FROM (VALUES (0),(1),(2),(3),(4),(5),(6),(7),(8),(9)) v(n)
), t1 AS
(
SELECT ones.n + 10 * tens.n + 100 * hundreds.n + 1000 * thousands.n + 10000 * tenthousands.n + 100000 * hundredthousands.n as id
FROM x ones, x tens, x hundreds, x thousands, x tenthousands, x hundredthousands
)
SELECT id,
id % 50 predicate_col,
row_number() over (partition by id % 50 order by id) join_col, …Run Code Online (Sandbox Code Playgroud)