相关疑难解决方法(0)

MySQL 中 SELECT 语句的默认记录顺序是什么?

假设您有以下表格和数据:

create table t (
    k int,
    v int,
    index k(k)
    ) engine=memory;

insert into t (k, v)
values (10, 1),
       (10, 2),
       (10, 3);
Run Code Online (Sandbox Code Playgroud)

发出select * from t where k = 10noorder by子句时,MySQL默认如何对记录进行排序?

mysql mysql-5 index order-by select

94
推荐指数
3
解决办法
13万
查看次数

主键中指定的排序顺序,但排序是在 SELECT 上执行的

我将传感器数据存储在表SensorValues 中。表和主键如下:

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 [MyPartitioningScheme]([Date])
Run Code Online (Sandbox Code Playgroud)

然而,当我选择在特定时间有效的传感器值时,执行计划告诉我它正在执行排序。这是为什么?

我原以为,由于我存储了按日期列排序的值,因此不会发生排序。还是因为索引不仅仅按日期列排序,即它不能假设结果集已排序?

SELECT TOP 1 SensorValue
  FROM SensorValues
  WHERE SensorId = 53
    AND DeviceId = …
Run Code Online (Sandbox Code Playgroud)

sql-server primary-key

15
推荐指数
3
解决办法
2万
查看次数

为什么 SSMS 在表格顶部而不是底部插入新行?

每当我在 SQL Server Management Studio 2008(数据库是 SQL Server 2005)的表中手动插入一行时,我的新行就会出现在列表的顶部而不是底部。我正在使用身份列,这会导致诸如

id  row
42 first row
1 second row
2 third row
Run Code Online (Sandbox Code Playgroud)

当获取行且未明确排序时。当为 Web 应用提取行并更改TOP 1查询返回的内容时,这会导致不同的外观。

我知道我可以order by,但为什么会发生这种情况?我的大部分数据都是通过 Web 应用程序插入的,从该应用程序插入的所有数据都按照先进先出的顺序进行,例如,最新的插入位于底部,因此 ID 都在一行中。服务器或 Management Studio 中是否有某些设置会导致这种不正确的排序?

sql-server ssms identity

14
推荐指数
2
解决办法
1万
查看次数

非聚集索引对行顺序有任何保证吗?

我有一个开发人员希望在执行没有 order by 的 select 语句时,表中的行按照它们插入的顺序排列。开发人员建议从聚集索引更改为非聚集索引。

通过将索引从聚簇更改为非聚簇,这是否可以保证行在表中出现的顺序?

这个问题主要是为了我的好奇心;我将建议改用身份列,但这个请求让我开始思考。可以使用时间戳,但有可能同时插入行。

在此先感谢您的帮助。

index sql-server clustered-index nonclustered-index

9
推荐指数
3
解决办法
1444
查看次数

物联网是否保证选择中的订单?

我们需要向priority表中添加一列,该列每秒被命中约 250 次,大约 170 次选择、125 次插入和 60 次更新。该列将是一个简单的number(1).

priority无关紧要的插入或更新,即不是主键,我将单独执行的一部分。

我们基本上不想order by每秒进行 170 次超范围扫描,因为执行的数量会大幅下降。

是否索引组织表保证priority = 1始终来之前priority = 9运行下面的查询时:

select *
  from my_table
 where rownum < 2
Run Code Online (Sandbox Code Playgroud)

对于稍微更多的上下文,典型的查询将是:

select *
  from my_table
 where mod(to_number(to_char(tstamp,'ss')),1) = 0
   and done is null
   and country = 'gbr'
   and rownum < 2
Run Code Online (Sandbox Code Playgroud)

对于 IOT 的 pk 约束将成为priority, rest of the pk单独的 pk 约束,仅用于结构。done在表的大约 99% 中为空,所以这无论如何都不是很有选择性。 …

oracle oracle-11g-r2

7
推荐指数
2
解决办法
1427
查看次数

插入和选择时奇怪的 sql server 行为

今天,在我们的 sql server 上的一个驱动器空间不足之后。该驱动器包含事件跟踪器日志,所以我认为这没什么大不了的,但后来我注意到当我将一条记录插入到数据库中时,它会将它插入到以前的记录之上而不是附加它。

当我做select *的时候,插入的记录首先出现。我能做些什么来解决这个问题吗?

section_d   section
-------------------
15          SDSD
16          SDSD2
17          SDSD2
18          adf

(4 row(s) affected)

insert into test2 values ('inserted row')

section_d   section
-----------------------
19          inserted row
15          SDSD
16          SDSD2
17          SDSD2
18          adf

(5 row(s) affected)
Run Code Online (Sandbox Code Playgroud)

sql-server order-by

2
推荐指数
1
解决办法
800
查看次数