当谈到 SQL Sever 中的数据库权限管理领域时,我是非常绿色的。
让我们举一个简单的例子。
假设帐户“admin”是架构 A、B 和 C 的所有者。
还有另一个帐户“minion”,您希望对在模式 A、B 和 C 下创建的任何对象(表/视图)拥有完全权限(更新/删除/插入/选择/更改)。
这可能吗?还是每次在这些模式下添加表/视图时都必须执行授权语句?(对我来说似乎有点傻)。
我有一个观点,complicated_view-- 有一些连接和 where 子句。现在,
select * from complicated_view (9000 records)
Run Code Online (Sandbox Code Playgroud)
更快,更快,比
select top 500 * from complicated_view
Run Code Online (Sandbox Code Playgroud)
我们说的是 19 秒对 5+ 分钟。
第一个查询返回所有 9000 条记录。如何只获得前 500 名的时间长得可笑?
显然,我将在这里查看执行计划 ---- 但是一旦我弄清楚为什么SQL Server 以次优方式运行“前 500”,我该如何实际告诉它以快速方式运行计划,喜欢坐满桌?
当然,我可能不得不完全重写视图——但很奇怪。
基本上,我将此数据表连接到第 3 方软件,该软件使用select top 500 *无法修改的默认查询预先检查表。因此,除了将此视图转储到实际表中(非常草率)之外,我也无法绕过他们的“前 500 名”附录。
这是 SQL Server 2012。
编辑:不同意重复标志。另一个问题,顶部比所有的都快。这将是预期的行为,返回较少的行。我的情况正好相反。另外,我的理解是 Top 100 是一种与 Top 100+ 不同的算法。我什至不认为重复的问题有正确的答案。也就是说,TOP X 查询将在很早的时候对潜在的大量表进行排序,而不是在它们被聚合/过滤/等之后。为什么是一个谜,但如何显然存在。
performance sql-server execution-plan select top query-performance
我只是好奇。
假设您有一个包含 100 万条记录/行的表。
select order_value from store.orders
Run Code Online (Sandbox Code Playgroud)
那个表有1个字段、2个字段还是100个字段,在实际查询的时候有区别吗?我的意思是“order_value”以外的所有字段。
现在我正在将数据推送到数据仓库。有时我将字段转储到表中,“将来可能会在某天使用” - 但现在不会被任何东西查询。这些“无关”字段是否会直接或间接影响不包含它们的选择语句(不* 我的意思是)?
我正在与一位同事合作,他建议将我们的 1 个实例数据库拆分为大约 7 个数据库(按数据域划分)用于开发和 7 个相同的数据库用于生产。我得到了测试生产二元性逻辑,但是在什么情况下或将我们的 1 个相对简单的数据库拆分为 7 个数据库有什么优势?我们的数据仓库仅由一个商业智能应用程序消耗/使用,期间。
我很关心这个方向,所以希望你能讨论提出这个拆分的一般原因,我可以给你一个数据库当前属性的概要。
1 个数据库数据仓库:总共 352 GB,203 个表,170 个视图
建议拆分:
A: 280 GB
B: 43 GB
C: 28 GB
D: 1 GB
E,F,G: < 1 GB combined
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,就提议的好处而言,这已经是一个令人头疼的问题,因为存储甚至不会远程平均分配,80% 还留在 1 个数据库上。显然,按架构对我们的数据库进行分区是不可能的(从硬件角度来看),因为我们没有企业级 SQL Server。
给出的拆分原因:
我的菜鸟想法:这些问题不是和数据库拆分无关吗?它们只是需要以任何方式自行解决的问题。
我的想法:在我看来,这似乎并不大。
我的想法: .... 这对我来说似乎完全荒谬,但也许我错了。我们已经按照 13 个“源系统”模式组织了我们的数据仓库。
-- 这个问题不是也和多数据库完全无关吗?我的理解是死锁发生在表级别(实际上通常甚至只是行级别,但是呃)。即便如此,我们所有的数据插入都发生在午夜,我们所有下游到 BI 的选择发生在凌晨 2 点。让两个进程更新同一个表与多个数据库无关,是不是(死锁会发生)?另外,我个人没有看到在正常操作期间发生表死锁的证据。
只有我们两个人在数据库上工作。他有可能真的想隔离我们的“封地”。真的,这不是问题,但无论如何不能在架构级别确定用户权限吗?
将数据仓库拆分为多个数据库的正当理由是什么?
很想在这里进一步了解一般的数据库。是的,我碰巧在我的知识空白处做了很多工作,但这份工作就是它,我一直在努力。到目前为止,东西一直很好用(敲木头)。
我只是想知道是否存在插入/删除组合比更新其他插入函数更快的常见场景。
这是我的具体例子。
我必须使用一次包含 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)我的意思是性能提升是存在的——我只是想知道这是否违背了最佳实践。有人能明白为什么插入 + 删除重复项似乎比“更新,如果没有找到,插入”更快?
我可以看到一个危险是在数据加载运行时有一段时间表不准确(在删除之前)。但是在任何更新过程中,这种情况难道不是真的吗?
这也将是数据仓库的临时表,而不是实时使用的数据。我只是想知道为什么我没有经常看到这种方法。
我们正在使用商业智能系统,需要加载日期列表,以便我们可以将它们标记为“上周”或“过去 12 个月”或某些动态值。
我想知道虚拟生成一个表的最简单方法是什么,该表仅在一列中列出日期,实际上是从“2014-01-01”到当前日期的每个日期(其他列我可以使用那里的公式)。实际上,甚至将未来的日期附加一年也可能很有用。
现在,是的,我可以从另一个具有数千个条目的随机事实表中获取不同的日期,但这似乎很草率,并且正在创建一种真正不应该存在的依赖关系。
我正在运行一个 ETL 过程,该过程将大约 200 万行写入 SQL Server 数据库。
我正在尝试优化纯插入所需的时间(我猜更新是另一回事)。
我想知道将基本插入到 SQL 数据库的最大瓶颈是什么,或者是减少时间的最佳方法。
我的意思是,第一件事可能是数据的大小,对吗?行数、列数和每列中的数据大小。其中一些可能无法最小化,每行的 KB/ 占用空间是可以潜在优化的一件事,对吧?
还有什么可以优化或者是最大的因素?它是传输介质吗?我的意思是,写入同一台计算机上的数据库与通过 Web 连接写入(即强大、快速且 ping 为 1 毫秒?)之间有多大差异。
最后 --- 为什么与数据库的多个并行连接似乎将进程加速到某个点?我的意思是,当我有 20 个连接进行循环插入时,它比一个连接写入所有数据快 6-7 倍。我很好奇这是为什么。
现在我有 220 万行,总计 2.7 GB。这是每行 1.23 kb。
现在使用 14 个连接一次插入 1000 行 (1.23 MB) 需要 6.7 秒。这是蜗牛般的每秒 10.66 行。即使假设 1 个连接也一样快(它不是),最多为 150 行/秒,这也不是完全“快”。我正在写一个超快速、强大的网络连接 b/c,我们不能在与数据仓库相同的空间上进行 ETL 过程。
那么..如何优化这里的速度?
一次 1000 行的原因是因为数据来自 1000 页 - 但优化解析现在是一个单独的问题。
我相信我确实有一个主要索引,但没有什么写起来太昂贵。现在我只是在做蒙特卡罗之类的测试(尝试一下,看看什么是有效的),但我需要更专注的东西。
performance sql-server optimization parallelism query-performance
我特别在谈论 SQL Server。我想一个用户尝试过它并得到一个错误(您没有对查询中未明确提及的隐藏底层视图 B 的选择权限)。主视图 A 将一个表和另一个视图(视图 B)连接在一起,并且它们没有视图 B 的权限。
我不负责数据库的权限,但我很好奇它是如何工作的。
您是否需要为视图下构建的每个对象授予权限?还是只是视图本身?或者两者之一?
我认为视图的目的之一是您不想为其授予完全权限的底层对象的快照。这对我来说是不寻常的。
我看过一些建议,但想知道在不使用子查询或不必要的联接的情况下从数据表中选择组、组总数、总计的最佳方法。
我最初的想法是这样的:
select product_family,
sum(widgets),
sum(widgets) over ()
from table.widget
group by product_family
Run Code Online (Sandbox Code Playgroud)
或以下内容:
select product_family,
sum(widgets),
sum(widgets) over (partition by all_field)
from table.widget
group by product_family
Run Code Online (Sandbox Code Playgroud)
显然这两种方法都不起作用。我知道一个分区的顺序可能比实际的行/组更高,但除了第一个示例将其留空之外,我不知道如何按“所有”进行分区。但是,它打破了 group by 语句。
我能找到的最好的是这样的:
select product_family,
family_sum,
sum(family_sum) over () as grand_sum
from (
select product_family, sum(widgets)
from table.widget
group by product_family
) as A
Run Code Online (Sandbox Code Playgroud)
不过,这仍然涉及子查询,这没关系。我只是觉得我在这里缺少一个简单的功能。
只是想知道我是否有类似的数据
name score
A 2
B 5
C 7
Run Code Online (Sandbox Code Playgroud)
我想要第三排
name score total
A 2 14
B 5 14
C 7 14
Run Code Online (Sandbox Code Playgroud)
我的意思是最终 - 我想找到不同总计中不同行条目的“z 分数”或百分位数。我只是不确定是否有一种简单的方法可以将行值与聚合值进行比较,除了通过子查询,例如
select A.name, A.score, B.total
from myTable A
left join
(select name, sum(score) from myTable group by name) B
on A.name = B.name
Run Code Online (Sandbox Code Playgroud)
这可以工作,但是两次查询同一个表来计算什么似乎效率很低。有没有我缺少的更简单的方法?
我会有这样的查询:
select order_number, cart_value, is_Europe from (
select order_number, sum(product_values) as cart_value, max(is_EUR) as is_Europe
from products
group by order_number
) ordervalues
where is_Europe = 1
Run Code Online (Sandbox Code Playgroud)
注意最后一行。
假设子查询返回 30 行,其中 15 行的 is_Europe 为“1”,另一个为“0”。换句话说,花生。
但是...添加最后一行使查询从 20 秒变为 3+ 分钟并计数。将它嵌套在许多子查询中。
现在,我想我理解了 SQL 逻辑,因为它首先运行子查询,并且……一个微不足道的 where 语句……过滤 30 行……需要几纳秒。但不是与甲骨文。
这里发生了什么?
20 秒给我完整的结果集,然后只需隐藏带有“1”或“0”(无论我选择哪个)的行——这似乎是一项不可能完成的任务。
这是来自 PLSQL 的执行计划/解释计划。请注意,实际上,查询非常复杂,包含等级、组等......嵌套子查询......但是最后的事情需要 20 秒,最后的 append where 语句(即使提升了一个新的级别)打破了它......
实际上它更复杂(除了我的问题,它应该在子查询之后运行并过滤 30 行,对吗?实际上......结构类似于大陆(EUR,NA,ASIA)和一个函数调用 max (decode continent, 'EUR', 1,0) as Is_EUR group by order_id。大洲是一个例子,它实际上是一些随机维度。它确定订单是否曾经“欧洲”或其他什么。这是最快的方式包括“是”和“否”。我想我可以在这里重写查询,只是很难定期更改。为什么 Oracle 不简单地听取常识?
sql-server ×10
performance ×4
select ×3
aggregate ×2
parallelism ×2
permissions ×2
view ×2
date ×1
etl ×1
group-by ×1
insert ×1
optimization ×1
oracle ×1
role ×1
t-sql ×1
top ×1