我SQL在我以前的所有应用程序中都使用过并了解Parse.com数据库存储,我想知道NOSQL.
我试图寻找之间的差异SQL,并NOSQL为最近两天&I仍然不明白的关系中是如何工作的NOSQL。
我了解到这NOSQL是无模式的,并且没有像 SQL 这样的结构。让我用一个例子来简要说明我的问题。
例子 :
在用于学校管理的 SQL 应用程序中,我将创建一个students存储学生信息的表。对于标记,我将有一个marks表,其中有一列user_id引用students表。我subjects将再有一张桌子,可以容纳sub_id,sub_code和subject_name。
因此,如果我sub_code在subjects表中进行更改,这将简单地反映到使用 ON UPDATE DELETE CASCADE 使用 FOREIGN KEY 的其他表。
现在我的问题是,
由于
NOSQL不使用规范化,数据将如何存储?单个表(NOSQL 中的文档)是否应该包含students表、marks表和subjects表中的所有信息?如果我们将所有信息都转储到一张表中,效率会有多高?
如果我们要更改主题代码,那么我们需要更新所有文档,对吗?(在 SQL 中,我们只是更改一个表中的主题代码,因为其他表中引用此列主题代码的其他列将简单地更新而不是更新每个条目?)
我有一个查询,其中链接了两列。为什么别名不能在工作中的GROUP BY条款,但ORDER BY条款,它的工作?如何正确编写选择?
SELECT
KOS_VER_ID AS "Vertrag"
, WHR_ISO_3_CODE AS "Waehrung"
, KOS_KOA_ST_KZN || ' - ' || ST_LANGBEZ_EN as "Kostenart"
, SUM (KOS_BETRAG) AS "Summe pro KOA"
FROM
KOSTEN
, WAEHRUNG
, SCHLUESSELTABELLE
WHERE
KOSTEN.KOS_VERHI_WHR_ID = WAEHRUNG.WHR_ISO_ID
AND KOSTEN.KOS_KOA_ST_KZN = SCHLUESSELTABELLE.ST_ID
AND KOS_VER_ID in (2509, 2510, 2511)
GROUP BY
KOS_VER_ID
, WHR_ISO_3_CODE
, KOS_KOA_ST_KZN || ' - ' || ST_LANGBEZ_EN
ORDER BY
"Vertrag"
, "Kostenart"
;
Run Code Online (Sandbox Code Playgroud) 在 Oracle SQL Developer 中,有没有办法在 SQL 查询中包含 SQL 文件?就像\include{myfile.tex}LaTeX 中的命令一样。
例子:
file1.sql 包含 FROM my_table;file2.sql 包含 SELECT * \include{file1.sql}执行file2.sql从Oracle SQL Developer中应该是相当于执行SELECT * FROM my_table;。
我只是想知道是否存在插入/删除组合比更新其他插入函数更快的常见场景。
这是我的具体例子。
我必须使用一次包含 1000 条记录的页面更新数据库。(我无法合并页面)。
这些记录中约有 5% 或 50 行是需要“更新”而不是作为全新插入的重复项。
我认为,不是“基于 ID 更新,否则插入新行”的典型功能,“插入所有内容”并在最后一次性删除重复项可能会更快。
两个原因:
并行性。如果我希望多个进程同时处理这个任务,那么......如果我有一个很大的提交大小和同时搜索和更新 ID 的事务,我可能会遇到行锁。通过“插入所有内容”并稍后删除“旧”记录,我可以有无限的进程同时写入数据。
我觉得在最后优化一个大的“删除查找”很容易。它看起来像下面这样:
with CTE as (
select primary_id,update_date,
rn = row_number()over(partition by primary_id order by update_date desc)
from MyTable
)
delete from CTE where rn > 1
Run Code Online (Sandbox Code Playgroud)我的意思是性能提升是存在的——我只是想知道这是否违背了最佳实践。有人能明白为什么插入 + 删除重复项似乎比“更新,如果没有找到,插入”更快?
我可以看到一个危险是在数据加载运行时有一段时间表不准确(在删除之前)。但是在任何更新过程中,这种情况难道不是真的吗?
这也将是数据仓库的临时表,而不是实时使用的数据。我只是想知道为什么我没有经常看到这种方法。
我们有一个将 cobol 数据(索引文件)传输到数据库的程序。
到目前为止,我们将数据传输到了一个 oracle 数据库。
在程序开始时,我使用用户登录sys,然后将当前模式更改为ink. 我是这样做的,因为ink没有创建表的权限。
然后我创建了一个表,表所有者是自动的ink,而不是sys。
我们最近将数据库从 Oracle 切换到 Postgres。
在这里,我以“postgres”身份登录,然后使用以下命令切换到“ink”模式:
set search_path to 'ink';
Run Code Online (Sandbox Code Playgroud)
然后我创建一个表,表所有者自动是postgres,不是ink。所以这种行为是相反的。
我该怎么做才能获得与 oracle 数据库相同的行为:
在我的场景中,表所有者应该自动是ink,而不是postgres。
要是不用写就好了
ALTER TABLE ... OWNER TO ink;
Run Code Online (Sandbox Code Playgroud)
在每个创建表命令之后。
我有一张有 260 万条记录的表。它看起来像这样:
email prject_name
rafael.nadal@xyz.com lab1
rafael.nadal@xyz.com lab2
rafael.nadal@xyz.com lab3
TEST@TEST.COM shift1
TEST@TEST.COM shift2
Run Code Online (Sandbox Code Playgroud)
但我希望我的桌子看起来像这样:
email project_name
rafael.nadal@xyz.com lab1, lab2, lab3
TEST@TEST.COM shift1, shift2, shift3
Run Code Online (Sandbox Code Playgroud)
我用过这个查询
select distinct email ,
STUFF((Select ','+project_name
from dbo.[UMG sent 2016] as T1
where T1.email=T2.email
FOR XML PATH('')),1,1,'') from dbo.[UMG sent 2016] as T2;
Run Code Online (Sandbox Code Playgroud)
它已经运行了5个小时。
如何加快流程?
我的目标是检查表空间上的用户配额:
不幸的是,该表dba_ts_quotas提供了表空间上已使用空间的详细信息。
我想查看所有在 tbs 上有配额的用户,即使他们不使用表空间上的任何空间。
有没有解决方案来检查用户是否在 tbs 上有配额?
我有这样的查询:
SELECT t0.id
FROM platform_conversations t0
LEFT OUTER JOIN contacts t1 ON t1.id = t0.contact_id
WHERE t0.user_id = 5340
AND (
t0.participant ILIKE '%baa%' -- (1)
OR t1.first_name ILIKE '%baa%' -- (2)
)
LIMIT 50;
Run Code Online (Sandbox Code Playgroud)
和
CREATE INDEX ix_conversations_participant
ON platform_conversations USING GIN (participant gin_trgm_ops);
CREATE INDEX ix_trgm_contacts_search
ON contacts USING GIN (first_name gin_trgm_ops);
Run Code Online (Sandbox Code Playgroud)
并且无法弄清楚为什么索引不与OR条件一起使用。如果我只使用 (1),或者只使用 (2),或者使用AND,它们都被使用。
这是计划:
仅适用于 (1)
Limit (cost=12.43..203.68 rows=50 width=37) (actual time=0.037..0.037 rows=0 loops=1)
-> Bitmap Heap Scan on platform_conversations t0 (cost=12.43..222.80 …Run Code Online (Sandbox Code Playgroud) 我们正在尝试将 SQL 服务器数据库从 Windows 移动到 Linux。但是我们在迁移时面临的问题很少。
RESTORE FILELISTONLY FROM DISK =N'/var/opt/mssql/data/backup_file_name.bak'
RESTORE DATABASE DB_NAME
FROM DISK = N'/var/opt/mssql/backup_file_name.bak' WITH FILE = 1,
MOVE N'DB_NAME' TO N'/var/opt/mssql/data/DB_NAME.mdf',
MOVE N'DB_NAME_Log' TO N'/var/opt/mssql/data/DB_NAME.ldf',
NOUNLOAD, REPLACE, STATS = 1
GO
Run Code Online (Sandbox Code Playgroud)
运行这个我或多或少地得到一个错误在于:
文件 XX_FlatFline 无法恢复到PATH_IN_WINDOWS {.....mdf}。使用 WITH MOVE 标识文件的有效位置。
MDF 和 LDF 文件都出现错误。上面错误中显示的windows路径是mdf和ldf文件在windows机器中的位置。
有人可以帮助我了解这里出了什么问题吗?当我将转储恢复到新数据库时,为什么 Windows 路径仍然重要?
警告:我是 SQL Server 的新手。
我正在运行一个插入很多行的应用程序,我们遇到了一些低性能。所以我开始用 sysbench 和 oltp_insert.lua(实际上是用随机密钥插入)对 Galera 集群进行基准测试。
集群的性能真的很差。
用同样的测试:
表结构是这样的:
Table: sbtest1
Create Table: CREATE TABLE `sbtest1` (
`id` int(11) NOT NULL,
`k` int(11) NOT NULL DEFAULT '0',
`c` char(120) NOT NULL DEFAULT '',
`pad` char(60) NOT NULL DEFAULT '',
PRIMARY KEY (`id`),
KEY `k_1` (`k`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
Run Code Online (Sandbox Code Playgroud)
到目前为止我尝试过的(没有成功):
wsrep_slave_threads=16wsrep_sync_wait=0(虽然我不执行读取)配置:
[mysqld]
binlog_format=ROW
innodb_autoinc_lock_mode=2
bind-address=0.0.0.0
datadir=/var/lib/mysql
innodb_buffer_pool_size = 300MB
innodb_large_prefix=1
innodb_file_format=Barracuda …Run Code Online (Sandbox Code Playgroud) oracle ×3
sql-server ×3
alias ×1
ddl ×1
etl ×1
galera ×1
group-by ×1
insert ×1
linux ×1
mysql ×1
nosql ×1
parallelism ×1
performance ×1
postgresql ×1
ssms ×1
t-sql ×1
windows ×1