我运行(目前正在全面检修)一个处理影院的网站(njtheater.com,如果你有兴趣的话).
当我从数据库中查询播放列表时,我希望"威尼斯商人"在"M"下排序.当然,当我显示剧本名称时,我需要前面的"The".
设计数据库来处理这个问题的最佳方法是什么?
(我正在使用MS-SQL 2000)
我遇到了这个问题
select datepart(ww, '20100208')
Run Code Online (Sandbox Code Playgroud)
在第7周在SQL Server 2000中返回结果.但是根据ISO 8601规范,08.02.2010应该是第6周!这导致交货周计算出现问题.
我该怎么做才能获得符合ISO 8601的周数值?
我想知道无论如何我都可以在两个表上添加触发器,将数据复制到另一个表.
例如:
我有一个两个用户表,users_V1和users_V2,当用一个V1应用程序更新用户时,它会激活一个触发器,在users_V2中更新它.
如果我想在V2表上添加相同的触发器以便在V2中更新用户时更新V1中的数据,它是否会进入无限循环?有没有办法避免这种情况.
我有执行连接的一个存储过程TableB以TableA:
SELECT <--- Nested <--- TableA
Loop <--
|
---TableB
Run Code Online (Sandbox Code Playgroud)
同时,在事务中,行插入TableA,然后插入TableB.
这种情况偶尔会导致死锁,因为存储过程选择从TableB中获取行,而insert将行添加到TableA,然后每个都希望另一个放弃另一个表:
INSERT SELECT
========= ========
Lock A Lock B
Insert A Select B
Want B Want A
....deadlock...
Run Code Online (Sandbox Code Playgroud)
逻辑要求INSERT首先向A添加行,然后向B添加行,而我个人并不关心SQL Server执行其连接的顺序 - 只要它加入.
修复死锁的一般建议是确保每个人以相同的顺序访问资源.但在这种情况下,SQL Server的优化器告诉我相反的顺序是"更好".我可以强制执行另一个连接顺序,并且查询效果更差.
但是我应该吗?
我应该使用我希望它使用的连接顺序现在和永远覆盖优化器吗?
或者我应该只是捕获错误本机错误1205,并重新提交select语句?
问题不是当我覆盖优化器并且它做非理想的事情时,查询可能会执行多么糟糕.问题是:自动重试是否更好,而不是运行更糟糕的查询?
sql-server error-handling deadlock sql-server-2000 database-deadlocks
当使用两个表的JOIN执行SELECT语句时,SQL Server似乎单独锁定语句的两个表.例如,通过这样的查询:
SELECT ...
FROM
table1
LEFT JOIN table2
ON table1.id = table2.id
WHERE ...
Run Code Online (Sandbox Code Playgroud)
我发现锁的顺序取决于WHERE条件.查询优化器尝试生成只根据需要读取尽可能多行的执行计划.因此,如果WHERE条件包含table1列,它将首先从table1获取结果行,然后从table2获取相应的行.如果列来自table2,它将以相反的方式执行.更复杂的条件或索引的使用也可能对查询优化器的决策产生影响.
当语句读取的数据应在事后使用UPDATE语句更新时,不能保证UPDATE语句的顺序与用于从2个表中读取数据的顺序相匹配.如果另一个事务在事务更新表时尝试读取数据,则在UPDATE语句之间执行SELECT语句时会导致死锁,因为SELECT既不能锁定第一个表,也不能UPDATE获取锁定第二个表.例如:
T1: SELECT ... FROM ... JOIN ...
T1: UPDATE table1 SET ... WHERE id = ?
T2: SELECT ... FROM ... JOIN ... (locks table2, then blocked by lock on table1)
T1: UPDATE table2 SET ... WHERE id = ?
Run Code Online (Sandbox Code Playgroud)
两个表都表示类型层次结构,并始终一起加载.因此,使用带有JOIN的SELECT加载对象是有意义的.单独加载两个表不会使查询优化器有机会找到最佳执行计划.但由于UPDATE语句一次只能更新一个表,因此在对象被另一个事务更新时加载对象时会导致死锁.当更新属于不同类型的类型层次结构的对象的属性时,对象的更新通常会导致两个表上的UPDATE.
我试图向SELECT语句添加锁定提示,但这不会改变问题.当两个语句都试图锁定表时,它只会导致SELECT语句中出现死锁,而一个SELECT语句以另一个语句的相反顺序获取锁.也许可以使用相同的语句加载数据以进行更新,从而强制锁定的顺序相同.这样可以防止两个想要更新数据的事务之间发生死锁,但不会阻止只读取数据的事务到需要具有不同WHERE条件的死锁.
到目前为止,这是唯一的工作,所以这似乎是读取可能根本没有锁定.使用SQL Server 2005,可以使用SNAPSHOT ISOLATION完成此操作.SQL Server 2000的唯一方法是使用READ UNCOMMITED隔离级别.
我想知道是否还有其他可能性来防止SQL Server导致这些死锁?
我有一个SQL查询的int参数的大列表:
update mytable set col='xyz'
where id in (/* thousands of ints */)
Run Code Online (Sandbox Code Playgroud)
我的问题是在SQL Server 2000中有参数限制.我也可以在SQL Server 2008上运行此查询.
有什么更好的方法来做到这一点.
编辑:
Ids列表来自C#程序.不是从另一张桌子.
我有一个返回我想要的行的查询,例如
QuestionID QuestionTitle UpVotes DownVotes
========== ============= ======= =========
2142075 Win32: Cre... 0 0
2232727 Win32: How... 2 0
1870139 Wondows Ae... 12 0
Run Code Online (Sandbox Code Playgroud)
现在我希望返回一个列,其中包含逗号分隔的" 作者 " 列表(例如原始海报和编辑).例如:
QuestionID QuestionTitle UpVotes DownVotes Authors
========== ============= ======= ========= ==========
2142075 Win32: Cre... 0 0 Ian Boyd
2232727 Win32: How... 2 0 Ian Boyd, roygbiv
1870139 Wondows Ae... 12 0 Ian Boyd, Aaron Klotz, Jason Diller, danbystrom
Run Code Online (Sandbox Code Playgroud)
SQL Server 2000没有CONCAT(AuthorName, ', ')聚合操作,我一直伪造它 - 为TOP 1作者执行简单的子选择,并且作者计数. …
sql-server aggregate sql-server-2000 concatenation string-concatenation
我对SQL Server的企业管理器几乎没有任何经验,所以我不确定这是否可行(或者希望这很简单!)
在导入数据库期间,发生了一些事情,其中每个表都有两个重要的差异.
第一个是两个表上的所有者是不同的,第二个是只有结构复制了其中一个副本.
Sod的法律表明当然数据存储在错误的人拥有的表中,所以我的问题是我可以快速删除一个用户拥有的所有表,并且我可以快速更改所有其他表的所有权以使它们符合要求.
有足够的表格,自动化将成为我的首选方式!
任何帮助将不胜感激,我正在运行SQL Server 2000
我有一张超过10亿行时间序列数据的表格,具有出色的插入性能,但(有时)可怕的选择性能.
表tblTrendDetails(PK如图所示排序):
PK TrendTime datetime
PK CavityId int
PK TrendValueId int
TrendValue real
Run Code Online (Sandbox Code Playgroud)
该表不断提取新数据并清除旧数据,因此插入和删除性能需要保持活泼.
执行如下查询时,性能很差(30秒):
SELECT *
FROM tblTrendDetails
WHERE TrendTime BETWEEN @inMinTime AND @inMaxTime
AND CavityId = @inCavityId
AND TrendValueId = @inTrendId
Run Code Online (Sandbox Code Playgroud)
如果我再次执行相同的查询(有相似的时间,但任何@inCavityId或者@inTrendId),性能非常好(1秒).性能计数器显示磁盘访问是第一次运行查询时的罪魁祸首.
有关如何在不显着影响插入或删除性能的情况下提高性能的任何建议?任何建议(包括完全更改底层数据库)都是受欢迎的.
我*=在一个WHERE子句中遇到了一些带有此运算符的代码,我发现有一件事将它描述为Sybase DB的某种连接运算符.它似乎并不适用.我认为这是某种按位的东西(我不太了解)但它根本没有包含在这个参考中.
当我将其更改为普通=操作符时,它根本不会更改结果集.
确切的查询如下所示:
select distinct
table1.char8_column1,
table1.char8_column2,
table2.char8_column3,
table2.smallint_column
from table1, table2
where table1.char8_column1 *= table2.another_char8_column
Run Code Online (Sandbox Code Playgroud)
有没有人知道这方面的参考或可以阐明它?这是在SQL Server 2000中.
sql-server-2000 ×10
sql-server ×9
sql ×3
deadlock ×2
aggregate ×1
c# ×1
datetime ×1
join ×1
operators ×1
performance ×1
select ×1
time-series ×1
triggers ×1