Questions tagged «sorting»

4
为什么要先对NULL排序?
为什么当我们在列中有一个NULL值并按值升序排序时,这些NULL首先排序? select 1 as test union all select 2 union all select NULL union all select 3 union all select 4 order by test 结果是 NULL 1 2 3 4 我一直认为NULL表示“不确定”或可能的“未知”。如果是这样,那么由于该值可能大于所有其他值,它们是否会排在最后?(或者这是某处的排序选项?) 我使用的是SQL Server 2008R2,但我怀疑在所有SQL Server以及所有RDBMS中都是如此。

1
如何在未嵌套的数组中保留元素的原始顺序?
给定字符串: “我认为PostgreSQL很漂亮” 我想对在该字符串中找到的单个单词进行操作。本质上,我有一个单独的字符串,可以从中获取单词的详细信息,并希望在此字典中加入该字符串的未嵌套数组。 到目前为止,我有: select word, meaning, partofspeech from unnest(string_to_array('I think that PostgreSQL is nifty',' ')) as word from table t join dictionary d on t.word = d.wordname; 这样就完成了我希望做的基本工作,但是并没有保留原始的单词顺序。 相关问题: 带有元素编号的PostgreSQL unnest()

2
分页性能,可自定义排序数百万行
在我们的应用程序中,我们有一个网格,用户可以在该网格上翻阅大量记录(10-20百万)。网格支持在多列(20+)中以升序和降序排序。许多值也不是唯一的,因此该应用程序还按ID进行平局,以确保行始终出现在同一页面上。例如,如果用户要按小部件大小排序(从最大的开始),则应用程序将生成一个查询,看起来像这样: SELECT TOP 30 * -- (Pretend that there is a list of columns here) FROM Test -- WHERE widgetSize > 100 ORDER BY widgetSize DESC, id ASC 该查询需要大约15秒的时间来运行(使用缓存的数据),主要的花费似乎是根据widgetSize对130万行进行排序。为了调优该查询,我发现如果我添加一个WHERE仅限于最大的widgetSizes(在上面的查询中注释)的子句,查询仅需约800ms(所有前50,000个结果中的widget大小均大于100) 。 为什么没有WHERE子句的查询这么慢?我检查了widgetSize列上的统计信息,它们显示前739行的WidgetSize>506。由于仅需要30行,因此SQL Server不能使用此信息来推断它仅需要对具有窗口小部件大小的行进行排序哪个大? 我知道我可以通过在上添加索引来使此特定查询的执行更快widgetSize和id,但是该索引仅在此特定情况下有用,并且在(例如)用户反转排序方向时变得毫无用处。该表包含许多其他列,每个索引都很大(〜200mb),因此我真的负担不起为每种可能的排序顺序添加索引。 有什么方法可以使这些查询查询执行而无需为每个可能的排序顺序添加索引?(用户可以按20列以上的任意列进行排序) 以下脚本创建上表,并用一些代表性数据填充该表。该表比实际表要窄得多,但是仍然显示了我所看到的性能。在我的PC上,使用where子句的查询大约需要200毫秒,而没有where停顿的查询大约需要800毫秒。 警告:运行此脚本后生成的数据库大小约为2Gb。 CREATE TABLE Test ( id INT NOT NULL IDENTITY(1,1) PRIMARY KEY, widgetSize INT NOT …

1
将溢出排序到tempdb,但估计的行等于实际的行
在最大内存设置为25GB的SQL Server 2016 SP2上,我们有一个查询,在一分钟内执行大约80次。该查询将大约4000页溢出到tempdb。这会在tempdb磁盘上导致大量IO。 当您查看查询计划(简化查询)时,您会看到估计的行数等于实际的行数,但仍然会发生溢出。因此,过时的统计信息不能成为问题的原因。 我做了一些测试,然后查询溢出到Tempdb: select id --uniqueidentifier from SortProblem where [status] ='A' order by SequenceNumber asc option (maxdop 1) 但是,如果我选择其他列,则不会发生溢出: select startdate --datetime from SortProblem where [status] ='A' order by SequenceNumber asc option (maxdop 1) 因此,我尝试“扩大” id列的大小: select CONVERT(nvarchar(512),id) from SortProblem where [status] ='A' order by SequenceNumber asc …

4
使用GROUP BY和ORDER BY对大表进行慢查询
我有一张桌子,上面有720万个元组,看起来像这样: table public.methods column | type | attributes --------+-----------------------+---------------------------------------------------- id | integer | not null DEFAULT nextval('methodkey'::regclass) hash | character varying(32) | not null string | character varying | not null method | character varying | not null file | character varying | not null type | character varying | …



2
如何判断MySQL中是否使用索引进行排序?
我有一个带有ORDER BY子句的查询,该子句使用一列,该列是WHERE子句中使用的索引的最后一列,本质上是以下形式: SELECT cols FROM tables WHERE col_1 = x AND col_2 = y AND col_3 = z ORDER BY col_4 并按此顺序在列(col_1,col_2,col_3,col_4)上创建索引。 当我分析查询时,超过99%的时间用于“排序结果”状态。如果有区别,col_4是一个时间戳列。我了解到ORDER BY只能在某些情况下使用索引,但是对于优化器何时才能使用它仍然有些困惑。
10 mysql  index  sorting 

1
如何使用索引加快Postgres中的排序
我正在使用postgres 9.4。 的messages具有以下模式:消息属于FEED_ID,并且具有posted_at,还消息可以具有(在答复的情况)的父消息。 Table "public.messages" Column | Type | Modifiers ------------------------------+-----------------------------+----------- message_id | character varying(255) | not null feed_id | integer | parent_id | character varying(255) | posted_at | timestamp without time zone | share_count | integer | Indexes: "messages_pkey" PRIMARY KEY, btree (message_id) "index_messages_on_feed_id_posted_at" btree (feed_id, posted_at DESC NULLS …

5
如何确定最佳sort_buffer_size?
我从一个示例配置文件中读取内容,该文件显示以下内容: # Sort buffer is used to perform sorts for some ORDER BY and GROUP BY # queries. If sorted data does not fit into the sort buffer, a disk # based merge sort is used instead - See the "Sort_merge_passes" # status variable. Allocated per thread if sort is …

1
ORDER BY和字母和数字混合字符串的比较
我们需要对值进行报告,这些值通常是数字和字母的混合字符串,需要“自然”排序。诸如“ P7B18”或“ P12B3”之类的东西。@字符串主要是字母序列,然后是数字交替。但是,这些段的数量和每个段的长度可能会有所不同。 我们希望这些数字部分按数字顺序排序。显然,如果我直接使用来处理这些字符串值ORDER BY,则“ P12B3”将出现在“ P7B18”之前,因为“ P1”早于“ P7”,但是我想反过来,因为“ P7”自然会在前面“ P12”。 我还希望能够进行范围比较,例如@bin < 'P13S6'此类。我不必处理浮点数或负数;这些严格来说是我们要处理的非负整数。字符串长度和段数可能是任意的,没有固定的上限。 在我们的案例中,字符串大小写并不重要,尽管如果有一种方法可以按排序规则识别的方式执行此操作,那么其他人可能会觉得有用。所有这一切中最丑陋的部分是我希望能够在WHERE子句中同时进行排序和范围过滤。 如果我在C#中执行此操作,那将是一个非常简单的任务:进行一些解析以将alpha与数字分离,实现IComparable,基本上就可以完成。当然,至少就我所知,SQL Server似乎没有提供任何类似的功能。 有人知道有什么好办法可以使这项工作吗?是否有一些鲜为人知的功能来创建实现IComparable的自定义CLR类型,并使它的行为符合预期?我也不反对愚蠢的XML技巧(另请参阅:列表串联),并且服务器上也提供了CLR regex匹配/提取/替换包装器功能。 编辑: 作为一个更详细的示例,我希望数据表现出这样的效果。 SELECT bin FROM bins ORDER BY bin bin -------------------- M7R16L P8RF6JJ P16B5 PR7S19 PR7S19L S2F3 S12F0 例如,将字符串分成所有字母或所有数字的记号,并分别按字母或数字对它们进行排序,最左边的记号是最重要的排序术语。就像我提到的那样,如果实现IComparable,.NET无疑是小菜一碟,但是我不知道如何(或是否)可以在SQL Server中实现这种功能。在使用它的10年左右的时间里,这肯定不是我遇到过的事情。

5
SQL查询仅显示单个食品的最新购买记录
我正在使用MS Access 2013中的食品购买/发票系统,正在尝试创建一个SQL查询,该查询将返回每个食品的最新购买价格。 这是我正在使用的表的图表: 我对SQL的理解是非常基础的,因此我尝试了以下(不正确的)查询,希望它对每个项目仅返回一条记录(由于DISTINCT运算符),并且仅返回最近的购买记录(因为我做了ORDER BY [Invoice Date] DESC) SELECT DISTINCT ([Food items].Item), [Food items].Item, [Food purchase data].[Price per unit], [Food purchase data].[Purchase unit], Invoices.[Invoice Date] FROM Invoices INNER JOIN ([Food items] INNER JOIN [Food purchase data] ON [Food items].ID = [Food purchase data].[Food item ID]) ON Invoices.ID = [Food …

1
存储顺序与结果顺序
这是主键中指定的排序顺序的一个衍生问题,但排序是在SELECT上执行的。 @Catcall说这关于存储顺序(聚集索引)和输出顺序 许多人认为聚集索引可以保证输出的排序顺序。但这不是它的作用。它保证了磁盘上的存储顺序。 例如,请参阅此博客文章。 我已经阅读了Hugo Kornelis的博客文章,并且了解到索引并不能保证sql服务器按特定顺序读取记录。但是我很难接受我不能为我的情况承担这个责任吗? CREATE TABLE [dbo].[SensorValues]( [DeviceId] [int] NOT NULL, [SensorId] [int] NOT NULL, [SensorValue] [int] NOT NULL, [Date] [int] NOT NULL, CONSTRAINT [PK_SensorValues] PRIMARY KEY CLUSTERED ( [DeviceId] ASC, [SensorId] ASC, [Date] DESC ) WITH ( FILLFACTOR=75, DATA_COMPRESSION = PAGE, PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, …

5
Oracle使用特殊字符最后对varchar2列进行排序
如何在Oracle中按自己定义的顺序对Varchar2或NVarchar2列进行排序。或者是否存在任何现有选项,这些选项将首先显示字母,然后显示数字,然后显示所有特殊字符。 我们的第一种方法是使用一个将字符手动映射到数字的函数。 select id, sorted_column from some_table order FN_SPECIAL_SORT_KEY(sorted_column,'asc') 特殊的排序功能将每个字符映射到一个2位数字,并将返回值用于排序。这似乎是非常昂贵的连接,并且感觉不对。 for i in 1..length(sorted_text) loop v_result:=v_result || case substr(sorted_text,i,1) WHEN ' ' THEN 82 WHEN '!' THEN 81 WHEN '"' THEN 80 WHEN '#' THEN 79 WHEN '$' .............. WHEN 'u' THEN 15 WHEN 'U' THEN 15 WHEN 'v' THEN …
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.