我的一个存储过程的执行时间很长(平均大约 4 到 7 分钟)。我想让它运行得更快。
我正在查看执行计划,有两件事占了大部分成本。第一个代表成本的 68%,其中一个主表的“聚集索引扫描”用于报告。该表有两列的主键和 2.000.000 条记录。
第二个最苛刻的任务代表了“合并连接”(左外连接)成本的 26% 。这是我上面提到的通过外键连接到上表中两列主键之一的表。
我检查了这些表的索引物理统计和索引状况良好。
我该怎么做才能提高此存储过程的性能?我需要在这些表上创建新索引吗?将set transaction isolation level read uncommitted声明有助于提高性能?
许多数据库在没有见证人的情况下以高安全模式镜像。我试图了解在主服务器保持正常运行且所有其他镜像数据库处于正常同步状态时数据库(或多个数据库)遇到假故障的情况下可能会发生什么。
假故障 DB 的镜像状态是否会变为 DISCONNECTED,但是,因为服务器没有发生故障,主数据库上的 DB 仍然能够接受连接并执行事务,尽管它会在不受保护的情况下运行?或者,主数据库上的数据库是否会断开连接且不可用?而且,这将是什么恢复?它最有可能是一个简单的 ALTER DATABASE SET PARTNER RESUME 吗?
以前,我们将这些 DB 置于具有见证(自动故障转移)的高安全模式下,并将超时时间增加到 20 秒以消除假故障,这在一年半的时间里运行良好。但是,本周,由于未知原因,我们进行了一次数据库故障转移。我已将超时时间增加到 30 秒,但我们也在考虑删除见证,因为无论如何在故障转移的情况下应用程序都需要手动干预,因此我们也可以手动进行数据库故障转移。我可以处理计划好的故障转移,但我对我描述的情况不太满意。
我已经在 AWS 中设置了一个 3 节点、多子网 Always On Availability 组,它似乎运行良好。但是,每个节点只有一个网络适配器,并为其分配了 3 个 IP 地址(1 个主要、1 个 WSFC IP 资源、1 个侦听器)。这是否足以实现高可用性,还是我需要额外的网络?我相信对于传统集群,您需要多个网络和适配器以确保没有单点故障。我不确定 AWS 是否属于这种情况,因为我认为它们最终内置了冗余?
这是我的问题的简化版本。我有这些表:
id - 姓名 - 姓氏 - 父亲的名字 - 母亲的名字
id - 名称
id - 姓氏
我想查询主表,但我想从其他表中获取姓名、父亲姓名和母亲姓名的 ID。我想要类似的东西;
SELECT
'id from names table that matches record name'
, 'id from surnames table that matches record surname'
, 'id from names table that matches record fathers name'
, 'id from names table that matches record mothers name'
FROM master_table
Run Code Online (Sandbox Code Playgroud)
我的问题是我不知道如何多次加入同一个表。
我一直在努力理解如何处理在这种情况下经常出现的特定类型的性能问题:当您想在查询中应用多个过滤器,但您知道第一个过滤器将返回一个非常小的数字时来自一个非常大的表的行。
例如,我们有一个包含 10M+ 行的 3rd-party 异构表,其中的列根据TYPEID. 这是一个示例查询:
SELECT ID, NAME, INT109 FROM DATA WHERE TYPEID = 8301514 AND INT109 = 1
Run Code Online (Sandbox Code Playgroud)
在此查询中,两个过滤器没有覆盖索引,但在 'TYPEID' 列上有一个索引。令人困惑的是,即使表中的 10M 中只有大约 500 行TYPEID = 8301514,但此查询有时需要很多秒才能运行。
如果我只是INT109 = 1在最后删除过滤器,查询几乎立即运行:
SELECT ID, NAME, INT109 FROM DATA WHERE TYPEID = 8301514
Run Code Online (Sandbox Code Playgroud)
对我来说,使用较少的过滤器会使查询运行得更快是没有意义的。此外,行为似乎不一致 - 如果第一个查询已经运行多次,它也可以运行得非常快,就像正在缓存某些东西一样。很难做可靠的实验(这是在 SQL Azure 中)。这是正常行为吗?这是否是由错误的执行计划(即使我没有使用参数)或过时的统计数据引起的?
performance sql-server optimization condition azure-sql-database
我有一个查询问题。我有一个带有汽车及其规格的数据库,每个型号都有与该型号相关的不同汽车及其价格。我想创建一个查询,为我提供每个模型的最低和最高价格。
像这样:
+--------+----------+
| model | price |
+--------+----------+
| golf | 4000 |
| golf | 6000 |
| golf | 10000 |
| panda | 3000 |
| panda | 5000 |
| panda | 7000 |
+--------+----------+
Run Code Online (Sandbox Code Playgroud)
查询给了我这个:
+--------+----------+
| model | price |
+--------+----------+
| golf | 4000 |
| golf | 10000 |
| panda | 3000 |
| panda | 7000 |
+--------+----------+
Run Code Online (Sandbox Code Playgroud)
你能帮助我吗?
我是 MySQL 的新手,但我对 SQL Server 有一定的经验。我知道在 SQL Server 中我应该非常谨慎地使用MERGE语句,因为它们会导致一些问题。使用时有什么特别需要注意的ON DUPLICATE KEY UPDATE吗?在 MySQL 社区中,INSERT/UPDATE像 SQL Server 一样坚持使用单独的语句是否被认为是最佳实践,或者ON DUPLICATE KEY UPDATE广泛用于简单的 upserts 是否可以?
我有一张像:
create table x (a varchar(20),
b varchar(30),
c varchar(30),
primary key clustered(a asc))
Run Code Online (Sandbox Code Playgroud)
所以我想知道我是否创建了一个像这样的索引:
Create nonclustered index test on x(a) include (b,c)
Run Code Online (Sandbox Code Playgroud)
该索引将使我使用列 a、b、c 的查询更快?
见下面的例子。ID_1和ID_A用于主键table_1和table_3分别。Table_2,主键是ID_1和ID_A。由于业务规则,ID_A连接到一个且只有一个ID_1via table_2。
我需要一个查询将返回所有行table_1其中,value_1 = 11并加入到的是,我需要只行从table_3有一个value_a = 'a',如果它加入到行中table_1,有一个value_1 = 11。
请参阅所需的结果。注意没有行
|1 | a |
Run Code Online (Sandbox Code Playgroud)
在结果集中因为value_afor id_a = 'b';
我试过左外连接,但ID_1都返回了。我也试过 CTE,无济于事。这是一个 SQL,我试过了。
Select ID_1, Value_1, ID_A, VALUE_A
From TABLE_1 t1
Join TABLE_2 t2 on t1.ID_1 = t2.ID_1
Left Outer Join TABLE_3 …Run Code Online (Sandbox Code Playgroud) sql-server ×5
join ×3
mysql ×2
optimization ×2
performance ×2
aws ×1
condition ×1
foreign-key ×1
functions ×1
group-by ×1
index-tuning ×1
mirroring ×1
mysql-5.6 ×1
network ×1
oracle ×1
t-sql ×1
upsert ×1