我在 Linux 系统上使用Microsoft ODBC 驱动程序连接到 Windows 上的 SQL Server 2012 以使用查询通知功能。我运行我的 C 代码,可以看到我的订阅sys.dm_qn_subscriptions
如我所料出现,然后我的代码发送 aWAITFOR
和块 - 到目前为止还不错。然后我做了一个会触发通知的交易,我明白了 - 仍然很好。我想做的是处理通知并再次循环,WAITFOR
但在第一次通知后,我的订阅不再出现在 DMV 中。我的问题是,这是预期的行为吗,我应该每次都重新订阅,还是发生了什么奇怪的事情?
Gaius's questions
Postgres在单个表中有 32T 的限制,但如果表已分区怎么办 - 现在每个分区是 32T 吗?
希望是一个简单的,如果我有两个(相当复杂,30-40 个节点).sqlplan
文件(来自相同的 SQL 文本),并排比较它们的好方法是什么?或者只是让它告诉我它做了什么不同?Management Studio 将它们与大量空白一起布置特别荒谬,它不会让我重新格式化它们以打印在单个页面上,甚至......
谢谢!
另一个 SQL 服务器问题:我有一个简单的查询,它为我提供了自重置计数器以来 CPU 最密集的 SQL:
select top 10
sum(qs.total_worker_time) as total_cpu_time,
sum(qs.execution_count) as total_execution_count,
qs.plan_handle, st.text
from
sys.dm_exec_query_stats qs
cross apply sys.dm_exec_sql_text(qs.plan_handle) as st
group by qs.plan_handle, st.text
order by sum(qs.total_worker_time) desc
问题1:究竟是什么plan_handle
?它似乎不是计划的散列,就像在 Oracle 中一样。我问是因为我希望能够检测到语句计划发生变化的情况。
问题 2:一旦有了 plan_handle,我就会对实际的计划感兴趣。所以我这样做,例如:
select * from sys.dm_exec_query_plan (0x060006001F176406B8413043000000000000000000000000)
在 query_plan 列中,我得到一个链接,当我单击该链接时会显示一个 XML 文档。如果我将它作为whatever.sqlplan 保存在磁盘上,我可以在Windows 中双击它,它会在Management Studio 中正确显示。肯定有办法避免这一步?!
问题 3:有没有办法将 XML 转换回文本格式,就像过去的 SET SHOWPLAN_TEXT 一样?我希望能够以图形方式查看它们,但也希望以某种有意义的方式自动区分它们。
谢谢!
我有一个 SQL Server 2005,它最近变得不可预测,我正在摸索为什么。在几秒钟内执行的查询正在更改计划并花费几分钟(在全表扫描或索引假脱机中花费时间)。现在第一件也是最明显的事情是,统计数据已经过时导致优化器感到困惑,但我相信情况并非如此 - 首先因为基础数据没有显着变化(例如,在一年的数据之上添加一天的数据已经在表格中),其次是因为自动创建统计信息和自动更新统计信息都是正确的。然而,优化器变得困惑;在 Tuning Advisor 中运行 SQL 给了我很多多列CREATE STATISTICS
语句,这些语句似乎可以修复它(直到下一个 SQL 错误行为)。
我可以用来解决根本原因的策略有什么想法吗?为什么“正常”统计数据还不够?
我有一个第三方 Sybase 数据库,我的用户希望使用iSQL连接到 Linux 机器并从中查询。我已经安装了UnixODBC和FreeTDS。但是,由于它是第三方数据库,因此我无法执行任何 GRANT。Linux 上的 iSQL 查询失败:
[42501][unixODBC][FreeTDS][SQL Server]ASA Error -121: Permission denied: you do not have permission to use the "CREATE PROCEDURE" statement
看来 iSQL 发送的实际 SQL 是CREATE PROCEDURE <some temporary name> AS <the actual sql>
. 我已阅读 iSQL 和 FreeTDS 联机帮助页,但其中没有关于如何禁用此行为的提示。
这在 Python 中工作正常:
>>> import Sybase
>>> db = Sybase.connect('host:port', 'user', 'password', 'db')
>>> c = db.cursor()
>>> c.execute('select table_name from systable')
>>> len(c.fetchall())
570
所以我相信我已经正确安装了 Sybase 客户端库。在我推荐这个解决方案之前,作为 DBA,我可以做任何关于修复 iSQL 的事情吗?