我的 SQL Server 数据库中有一个配置表,该表应该只有一行。为了帮助未来的开发人员理解这一点,我想防止添加多于一行的数据。我选择为此使用触发器,如下所示......
ALTER TRIGGER OnlyOneConfigRow
ON [dbo].[Configuration]
INSTEAD OF INSERT
AS
BEGIN
DECLARE @HasZeroRows BIT;
SELECT @HasZeroRows = CASE
WHEN COUNT (Id) = 0 THEN 1
ELSE 0
END
FROM
[dbo].[Configuration];
IF EXISTS(SELECT [Id] FROM inserted) AND @HasZeroRows = 0
BEGIN
RAISERROR ('You should not add more than one row into the config table. ', 16, 1)
END
END
Run Code Online (Sandbox Code Playgroud)
这不会引发错误,但不允许第一行进入。
还有比这更有效/更自我解释的方法可以将可以插入表中的行数限制为 1 吗?我是否缺少任何内置的 SQL Server 功能?
我有以下配置:
Redis 和 MongoDB 都用于存储海量数据。我知道 Redis 需要将所有数据保存在 RAM 中,我对此没有意见。不幸的是,发生的情况是 mongo 开始占用大量 RAM,一旦主机 RAM 已满(我们在这里谈论的是 32GB),mongo 或 Redis 就会崩溃。
我已经阅读了以下有关此问题的先前问题:
it's completely okay to limit the WiredTiger cache size, since it handles I/O operations pretty efficiently
MongoDB uses the LRU (Least Recently Used) cache algorithm …
最近我发现 MySQL 有一个offset
特性。我一直在寻找有关偏移结果的文档,或者偏移量和限制变量之间的差异,但我似乎找不到我要找的东西。
假设我在一个表中有 10.000 行,我想要 25 个结果,来自第 1.000 行。就目前而言,我可以同时执行两者以获得相同的结果:
SELECT id,name,description FROM tablename LIMIT 1000,25
SELECT id,name,description FROM tablename LIMIT 25 OFFSET 1000
Run Code Online (Sandbox Code Playgroud)
我想知道的是两者之间的区别。
WHERE column=1
(比如列有 >100 个不同的值)ORDER BY column ASC
(假设它具有随机值)我有一种感觉 offset 跳过了数据库中找到的前 X 行,不考虑排序和 where。
我的问题(或至少是错误消息)与查询处理器耗尽内部资源非常相似- 非常长的 sql query。
我的客户正在使用 SQL 选择查询,其中包含一个恰好包含 100,000 个条目的 where 子句。
查询失败,错误 8632 和错误消息
内部错误:已达到表达式服务限制。请在您的查询中寻找潜在的复杂表达式,并尝试简化它们。)
我发现抛出此错误消息非常奇怪,正好是 100,000 个条目,所以我想知道这是否是一个可配置的值。是这种情况吗?如果是,我怎样才能将此值增加到更高的值?
在MSDN 上,有人提议重新编写查询,但我想避免这种情况。
同时我发现我正在谈论的条目列表包含自然数,其中相当一部分似乎是连续的(例如 (1,2,3,6,7,8,9,10,12, 13、15、16、17、18、19、20)。
这使得 SQL where 子句类似于:
where entry in (1,2,3,6,7,8,9,10,12,13,15,16,17,18,19,20)
Run Code Online (Sandbox Code Playgroud)
我可以将其转换为:
where (entry between 1 and 3) OR
(entry between 6 and 10) OR
(entry between 12 and 13) OR
(entry between 15 and 20)
Run Code Online (Sandbox Code Playgroud)
可以通过以下方式缩短:
where entry in (1,...,3,6,...,10,12,13,15,...,20)
Run Code Online (Sandbox Code Playgroud)
......或类似的东西?(我知道这是一个长镜头,但它会使软件更新更容易和更易读)
供您参考: where 子句中的数据是在另一个表上完成的计算结果:首先在开始时读取并过滤该表的条目,然后进行一些额外的处理(这是不可能使用的SQL),额外处理的结果是更多的过滤,并且结果用于 where 子句中。由于无法在 SQL 中编写完整的过滤,因此使用了上述方法。显然, where 子句的内容可能会在每次处理时发生变化,因此需要动态解决方案。
目前是否计划标准化一种限制查询返回结果数量的最佳方法?
是否有 ANSI SQL 替代 MYSQL LIMIT 关键字的堆栈溢出问题?列出了用不同语言处理这种行为的各种方法:
DB2 -- select * from table fetch first 10 rows only
Informix -- select first 10 * from table
Microsoft SQL Server and Access -- select top 10 * from table
MySQL and PostgreSQL -- select * from table limit 10
Oracle -- select * from (select * from table) where rownum <= 10
Run Code Online (Sandbox Code Playgroud)
我不经常玩数据库,所以我在这里说的是无知,但似乎这是一个非常重要的功能 - 至少足够重要,当我看到它被留给供应商时我会挠头。
我很迷惑。AFAIK SQL Server 2005 Express 的数据库 数据大小限制为 4GB 。但是我有以下结果sp_spaceused
:
space left
直到我达到限制吗?index_size
在极限算?我们一再看到尝试索引值超过最大大小的列失败。Postgres 10 有这样的错误信息:
Run Code Online (Sandbox Code Playgroud)ERROR: index row size xxxx exceeds maximum 2712 for index "foo_idx" HINT: Values larger than 1/3 of a buffer page cannot be indexed. Consider a function index of an MD5 hash of the value, or use full text indexing.
例子:
等等。
现在,a_horse_with_no_name 演示了一个具有更大text
值(10000 个字符)的案例,它似乎仍然适用UNIQUE
于 Postgres 9.6 中的索引。引用他的测试用例:
create table tbl (col text);
create unique index on tbl (col);
insert into tbl
values (rpad(md5(random()::text), 10000, md5(random()::text)));
select length(val) …
Run Code Online (Sandbox Code Playgroud) 我正在尝试计算旧记录。LIMIT 1
在这种情况下,即使我设置了一些限制,为什么 Postgres 仍会给出 1160 的结果?
SELECT COUNT(*) FROM data WHERE datetime < '2015-09-23 00:00:00' LIMIT 1;
Run Code Online (Sandbox Code Playgroud)
count
--------
1160
(1 row)
Run Code Online (Sandbox Code Playgroud)
我期望的结果是 1 或 0,但结果是 1160。为什么?
我正在尝试提高 postgres(9.6) 查询的性能。这是我的架构,表包含大约 6000 万行。
Column | Type | Modifiers
--------------------------+-----------------------------+-----------
transaction_id | text | not null
network_merchant_name | text |
network_merchant_id | text |
network_merchant_mcc | integer |
network_merchant_country | text |
issuer_country | text |
merchant_id | text |
remapped_merchant_id | text |
created_at | timestamp without time zone |
updated_at | timestamp without time zone |
remapped_at | timestamp without time zone |
Indexes:
"mapped_transactions_pkey" PRIMARY KEY, btree (transaction_id)
"ix_mapped_transactions_remapped_at" btree (remapped_at NULLS FIRST)
Run Code Online (Sandbox Code Playgroud)
这是我试图执行的查询。
SELECT * …
Run Code Online (Sandbox Code Playgroud) postgresql performance order-by limits postgresql-9.6 query-performance
我正在尝试获得一个快速、简单的 sql 查询,以便在使用 join 时一次只更新一行。
我试过了LIMIT
,但没有成功。
询问:
UPDATE
table1
JOIN
table2 ON table2.col=table1.col
SET
table1.row1='a value'
WHERE
table1.row2 LIKE '%something%'
LIMIT 1
Run Code Online (Sandbox Code Playgroud)
信息:
错误代码:1221. UPDATE 和 LIMIT 的错误用法
limits ×10
postgresql ×3
sql-server ×3
mysql ×2
count ×1
docker ×1
index ×1
insert ×1
join ×1
memory ×1
mongodb ×1
order-by ×1
performance ×1
row ×1
size ×1
sql-standard ×1
trigger ×1
update ×1