我正在使用 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 LAST)
Run Code Online (Sandbox Code Playgroud)
我想返回由 排序的所有消息share_count,但对于每个parent_id,我只想返回一条消息。即,如果多条消息具有相同的parent_id,则仅posted_at返回最新的一条 ( )。在parent_id可以为空,以空消息parent_id都应该回报。
我使用的查询是:
WITH filtered_messages AS (SELECT *
FROM messages
WHERE feed_id …Run Code Online (Sandbox Code Playgroud) postgresql performance index sorting postgresql-9.4 postgresql-performance
我们需要对通常是需要“自然”排序的数字和字母混合字符串的值进行一些报告。诸如“P7B18”或“P12B3”之类的东西。@字符串将主要是字母序列然后数字交替。但是,这些段的数量和每个段的长度可能会有所不同。
我们希望这些数字部分按数字顺序排序。显然,如果我直接用 处理这些字符串值ORDER BY,那么“P12B3”将在“P7B18”之前出现,因为“P1”早于“P7”,但我希望相反,因为“P7”自然在前面“P12”。
我还希望能够进行范围比较,例如@bin < 'P13S6'或类似的。我不必处理浮点数或负数;这些将严格是我们正在处理的非负整数。字符串长度和段数可能是任意的,没有固定的上限。
在我们的例子中,字符串大小写并不重要,但如果有一种方法可以以排序方式感知方式做到这一点,其他人可能会发现这很有用。所有这一切中最丑陋的部分是我希望能够在WHERE子句中进行排序和范围过滤。
如果我在 C# 中执行此操作,这将是一项非常简单的任务:进行一些解析以将 alpha 与数字分开,实现 IComparable,您基本上就完成了。当然,SQL Server 似乎没有提供任何类似的功能,至少就我所知。
任何人都知道使这项工作有什么好的技巧吗?是否有一些很少公开的能力来创建实现 IComparable 的自定义 CLR 类型并使其按预期运行?我也不反对 Stupid XML Tricks(另请参阅:list concatenation),而且我在服务器上也提供了 CLR 正则表达式匹配/提取/替换包装函数。
编辑: 作为一个更详细的例子,我希望数据表现得像这样。
SELECT bin FROM bins ORDER BY bin
bin
--------------------
M7R16L
P8RF6JJ
P16B5
PR7S19
PR7S19L
S2F3
S12F0
Run Code Online (Sandbox Code Playgroud)
即将字符串分成所有字母或所有数字的标记,并分别按字母或数字对它们进行排序,最左边的标记是最重要的排序项。就像我提到的,如果您实现 IComparable,在 .NET 中是小菜一碟,但我不知道如何(或是否)您可以在 SQL Server 中执行此类操作。这肯定不是我在 10 年左右的工作中遇到过的事情。
如何在 Oracle 中按我自己自定义的顺序对 Varchar2 或 NVarchar2 列进行排序。或者是否有任何现有的选项可以先放字母,然后是数字,然后是所有特殊字符。
我们的第一种方法是使用一个函数来手动将字符映射到数字。
select id, sorted_column
from some_table
order FN_SPECIAL_SORT_KEY(sorted_column,'asc')
Run Code Online (Sandbox Code Playgroud)
特殊的排序函数将每个字符映射到一个 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 14 WHEN 'V' THEN 14 WHEN 'w' THEN 13 WHEN 'W' THEN 13 WHEN 'x'
....
else 90 end;
end loop;
Run Code Online (Sandbox Code Playgroud)
我很难想出另一种方法。我想知道这种方法存在哪些问题。也许我们别无选择。 …
这是主键中指定的排序顺序的衍生问题,但排序是在 SELECT 上执行的。
@Catcall关于存储顺序(聚集索引)和输出顺序的主题
很多人认为聚集索引可以保证输出的排序顺序。但这不是它的作用。它保证了磁盘上的存储顺序。 例如,请参阅此博客文章。
我已经阅读了 Hugo Kornelis 的博客文章,并了解到索引并不能保证 sql server 以特定顺序读取记录。然而,我很难接受我不能为我的场景假设这一点?
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,
SORT_IN_TEMPDB = OFF,
IGNORE_DUP_KEY = OFF,
ONLINE = OFF,
ALLOW_ROW_LOCKS = ON,
ALLOW_PAGE_LOCKS = ON)
ON …Run Code Online (Sandbox Code Playgroud) 我正在使用 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 purchase data].[Invoice ID]
ORDER BY Invoices.[Invoice Date] DESC;
Run Code Online (Sandbox Code Playgroud)
然而,上面的查询只是返回所有的食品购买(即 中每个记录的多条记录[Food items]),结果按日期降序排序。有人可以向我解释我对DISTINCT运营商的误解吗?也就是说,为什么它不只为 中的每个项目返回一条记录[Food items]?
更重要的是 …
我有一个长时间运行的查询(有 1 亿行的事实表加入了一些小的暗表然后分组),它溢出到 tempdb,即使(经过一些调整)CE 非常接近实际的行数,请参阅计划:
寻找解释,我注意到以下内存授予信息:
环境:SQL Server 2012 SP1 Enterprise,服务器 RAM 256 GB,SQL Server 最大内存 200 GB,缓冲池大小 42 GB,工作区最大大小 156 GB(GrantedMemory = 156 * 25% ~= 38 GB)
Paste The Plan 上的匿名查询计划
强制哈希匹配聚合(而不是排序 + 流聚合)时,查询始终快 3 - 4 倍。不幸的是,实际查询来自 Cognos,我们无法更改它。
散列聚合计划中没有散列溢出。查询优化器不会选择散列匹配聚合,因为如果我查看散列与流聚合的运算符成本,散列组的 CPU 成本比进行流聚合高 2 - 3 倍。
在流和哈希聚合中,估计的输出行与输入(约 1 亿行)完全相同。
查询使用单个 NC 列存储索引,并且列统计信息都定期更新。
我的 Rails 数据库由 Postgres 数据库支持。您可能知道,Rails 中的每个表都分配了一个主键,该主键是 Integer 类型并已编入索引。
我的列表视图以相反的时间顺序显示记录。所以我只是按照主键的相反顺序对我的结果集进行排序。
我的问题是:查询会使用主键索引吗?如果是,那么那么有效吗?我如何验证?
在此先感谢您的时间。
巴拉特
我有这样的记录
A5
A4
Z1
B2
C7
C1A
C11A
B1
B4
Run Code Online (Sandbox Code Playgroud)
我希望它们以这种方式排序
A4
A5
B1
B2
B4
C1
C11A
C7
Z1
Run Code Online (Sandbox Code Playgroud)
使用该ORDER BY条款。
我希望它们按字母排序,然后按数值排序。
标题几乎总结了问题本身:是否有关于tmp_table_size和max_heap_table_sizeMySQL 属性的值的经验法则?
我的性能严重下降,这是由于 MySQL 使用磁盘空间对 JOIN 结果进行文件排序造成的。
增加tmp_table_size和max_heap_table_size向3G解决的问题,但是这更多的是一种试错的办法。
有没有更可靠的方法来计算这两个的合适值?
考虑以下示例:
DECLARE @suppliedNumber MONEY
SET @suppliedNumber = 245656.00
SELECT
ah.FirstName,
ah.LastName
FROM
AccountHolders AS ah
JOIN
[dbo].[Accounts] AS a
ON
ah.Id = a.AccountHolderId
GROUP BY
ah.FirstName, ah.LastName
HAVING SUM(a.Balance) > @suppliedNumber
Run Code Online (Sandbox Code Playgroud)
如您所见,查询中没有任何排序。但是查看执行计划,我看到了隐式排序:
为什么会这样?这背后的技术原因是什么?
我在 Windows NT 6.3 (Build) 上使用 Microsoft SQL Server 2014 (RTM-CU14) (KB3158271) - 12.0.2569.0 (X64) May 27 2016 15:06:08 版权所有 (c) Microsoft Corporation Express Edition(64 位) 14393:)
sorting ×10
sql-server ×4
join ×3
postgresql ×3
index ×2
natural-sort ×2
order-by ×2
performance ×2
collation ×1
date ×1
distinct ×1
ms-access ×1
mysql ×1
oracle ×1
oracle-10g ×1
primary-key ×1
tempdb ×1