在SO上,最近有人问为什么不使用ORDER BY? 这种情况涉及MySQL中的一个简单的InnoDB表,该表包含三列和1万行。其中一列(整数)被索引了,OP试图检索按该列排序的整个表: SELECT * FROM person ORDER BY age 他附加了EXPLAIN输出,该输出显示此查询是使用filesort(而不是索引)解决的,并询问为什么会这样。 尽管有提示 FORCE INDEX FOR ORDER BY (age) 导致使用索引的提示,但有人回答(带有支持的注释/来自他人的评论)说,仅当从索引中读取所有选定的列时,索引才用于排序(即通常由Using index该Extra列中的指示)的EXPLAIN输出)。稍后给出了一个解释,即遍历索引然后从表中获取列会导致随机I / O,MySQL认为它比a更昂贵filesort。 这似乎是在关于ORDER BY优化的手册一章中碰到的,它不仅传达出强烈的印象,即ORDER BY从索引满足比执行其他排序更可取(实际上,它filesort是quicksort和mergesort的组合,因此 必须具有下限;虽然应该按顺序遍历索引并查找表,所以这很有意义),但它也忽略了此所谓的“优化”,同时还指出:Ω(nlog n)O(n) 以下查询使用索引来解析ORDER BY零件: SELECT * FROM t1 ORDER BY key_part1,key_part2,... ; 就我的阅读而言,在这种情况下就是这种情况(但没有明确提示就没有使用索引)。 我的问题是: 确实有必要为所有选定的列建立索引以便MySQL选择使用索引吗? 如果是这样,在哪里记录(如果有的话)? 如果没有,这里发生了什么?
在诊断基数估计不佳(尽管索引简单,统计信息最新等)并因此查询计划不佳的SQL Server 2008 R2查询时,我发现了一个可能相关的知识库文章: FIX:运行查询时性能不佳包含SQL Server 2008或SQL Server 2008 R2或SQL Server 2012中的关联AND谓词 我可以猜测知识库文章“关联”的含义,例如谓词2和谓词1主要针对相同的行。 但是我不知道SQL Server如何知道这些相关性。一个表是否需要一个包含来自两个谓词的列的多列索引?SQL是否使用统计信息来检查一列中的值是否与另一列相关?还是使用其他方法? 我问这个有两个原因: 确定使用此修补程序可以改善我的表和查询 知道我应该在索引编制,统计数据等方面做些什么来影响#1
我想通过脚本在数据库中创建新功能。脚本代码如下: IF Exists(Select * From sys.sysobjects A Where A.name =N'fn_myfunc' and xtype=N'FN') return; CREATE FUNCTION fn_myfunc () returns varchar(10) AS Begin ... End 但是当我执行上述脚本时,SQL Server返回错误: 'CREATE FUNCTION' must be the first statement in a query batch.
我试图回答以下stackoverflow问题: 我应该使用哪种SQL Server 2005/2008锁定方法来处理多个服务器应用程序实例中的单个表行? 在发布一个有点天真的答案之后,我想我会把钱放在嘴边,实际上 测试我所建议的方案,以确保我不会像往常一样追逐OP。好吧,事实证明,这比我想象的要难得多(我敢肯定,这对任何人来说都不奇怪)。 这是我尝试过并想到的: 首先,我尝试使用派生表中的ORDER BY进行TOP 1 UPDATE ROWLOCK, READPAST。这产生了死锁,并且还处理了乱序的项目。它必须尽可能接近FIFO,以排除需要多次尝试处理同一行的错误。 然后,我尝试选择所需的下一个QueueID到一个变量,使用的各种组合READPAST,UPDLOCK,HOLDLOCK,并ROWLOCK专门由会话保持了更新的行。我尝试过的所有变体都遇到了与以前相同的问题,并且对于与的某些组合READPAST,抱怨如下: 您只能在READ COMMITTED或REPEATABLE READ隔离级别中指定READPAST锁。 这是令人困惑的,因为它是“已提交读”。我以前遇到过这个问题,这令人沮丧。 自从我开始写这个问题以来,Remus Rusani发布了一个新的问题答案。我阅读了他的链接文章,看到他正在使用破坏性读取,因为他在回答中说“在网络通话期间实际上不可能保持锁定状态”。在阅读了他的文章中有关热点和需要锁定才能进行任何更新或删除的页面的内容后,我担心即使我能够算出正确的锁定来执行我想要的操作,也无法扩展并且可能无法处理大量并发。 现在,我不确定该去哪里。是真的无法实现在处理行时维持锁定(即使它不支持高tps或大量并发)吗?我想念什么? 希望比我更聪明的人和比我更老练的人可以提供帮助,以下是我使用的测试脚本。它又切换回TOP 1 UPDATE方法,但是我也将另一种方法留在其中,注释掉,以防您也想探索一下。 将这些粘贴到单独的会话中,运行会话1,然后快速将所有其他会话粘贴。在大约50秒内,测试将结束。查看每个会话中的消息,以查看其所做的工作(或失败的方式)。第一个会话将显示一个带有快照的行集,第二个快照详细描述了存在的锁和正在处理的队列项。有时它可以工作,而其他时候则根本不工作。 第一场 /* Session 1: Setup and control - Run this session first, then immediately run all other sessions */ IF Object_ID('dbo.Queue', 'U') IS NULL CREATE …